diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000..97626ba454
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="PROJECT" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000..28a804d893
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000..e5921a7e27
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/webpack.iml" filepath="$PROJECT_DIR$/.idea/webpack.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000..94a25f7f4c
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/webpack.iml b/.idea/webpack.iml
new file mode 100644
index 0000000000..24643cc374
--- /dev/null
+++ b/.idea/webpack.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+      <excludeFolder url="file://$MODULE_DIR$/temp" />
+      <excludeFolder url="file://$MODULE_DIR$/tmp" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000000..cf853ad91c
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="fe887eca-b926-4bf8-91f1-fca8efc608fe" name="Default" comment="" />
+    <ignored path="$PROJECT_DIR$/.tmp/" />
+    <ignored path="$PROJECT_DIR$/temp/" />
+    <ignored path="$PROJECT_DIR$/tmp/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf>
+      <file leaf-file-name="build.js" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/template/build/build.js">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="120">
+              <caret line="5" column="26" lean-forward="false" selection-start-line="5" selection-start-column="26" selection-end-line="5" selection-end-column="26" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER">
+    <package-json value="$PROJECT_DIR$/package.json" />
+  </component>
+  <component name="JsFlowSettings">
+    <service-enabled>true</service-enabled>
+    <exe-path />
+    <other-services-enabled>true</other-services-enabled>
+    <auto-save>true</auto-save>
+  </component>
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="-8" />
+    <option name="y" value="-8" />
+    <option name="width" value="1920" />
+    <option name="height" value="1080" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+      <manualOrder />
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="webpack" type="b2602c69:ProjectViewProjectNode" />
+              <item name="webpack" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+      <pane id="Scope" />
+      <pane id="Scratches" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="settings.editor.selected.configurable" value="Settings.JavaScript" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="HbShouldOpenHtmlAsHb" value="" />
+    <property name="node.js.path.for.package.eslint" value="project" />
+    <property name="node.js.detected.package.eslint" value="true" />
+    <property name="node.js.selected.package.eslint" value="" />
+    <property name="node.js.path.for.package.standard" value="project" />
+    <property name="node.js.detected.package.standard" value="true" />
+    <property name="node.js.selected.package.standard" value="" />
+    <property name="JavaScriptWeakerCompletionTypeGuess" value="true" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="C:\Users\admin\Desktop\webpack\template" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false">
+    <option name="remove_strategy" value="false" />
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="fe887eca-b926-4bf8-91f1-fca8efc608fe" name="Default" comment="" />
+      <created>1541485811159</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1541485811159</updated>
+      <workItem from="1541485813194" duration="424000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="424000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
+    <layout>
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="npm" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Mongo Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.33184358" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+    </layout>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager />
+    <watches-manager />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/template/src/router/index.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="240">
+          <caret line="10" column="25" lean-forward="false" selection-start-line="10" selection-start-column="25" selection-end-line="10" selection-end-column="25" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/template/src/App.vue">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="16">
+          <caret line="18" column="15" lean-forward="true" selection-start-line="18" selection-start-column="15" selection-end-line="18" selection-end-column="15" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/template/build/build.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="120">
+          <caret line="5" column="26" lean-forward="false" selection-start-line="5" selection-start-column="26" selection-end-line="5" selection-end-column="26" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>
\ No newline at end of file
diff --git a/template/.babelrc b/template/.babelrc
index 6646ce7f96..3a280ba34b 100644
--- a/template/.babelrc
+++ b/template/.babelrc
@@ -8,12 +8,5 @@
     }],
     "stage-2"
   ],
-  "plugins": ["transform-vue-jsx", "transform-runtime"]{{#if_or unit e2e}},
-  "env": {
-    "test": {
-      "presets": ["env", "stage-2"]{{#if_eq runner "karma"}},
-      "plugins": ["transform-vue-jsx", "istanbul"]{{/if_eq}}{{#if_eq runner "jest"}},
-      "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]{{/if_eq}}
-    }
-  }{{/if_or}}
+  "plugins": ["transform-vue-jsx", "transform-runtime"]
 }
diff --git a/template/.eslintignore b/template/.eslintignore
index ef5bd37d05..e1fcc9c45f 100644
--- a/template/.eslintignore
+++ b/template/.eslintignore
@@ -2,6 +2,3 @@
 /config/
 /dist/
 /*.js
-{{#unit}}
-/test/unit/coverage/
-{{/unit}}
diff --git a/template/.eslintrc.js b/template/.eslintrc.js
index 30593179e2..85f88ea658 100644
--- a/template/.eslintrc.js
+++ b/template/.eslintrc.js
@@ -1,74 +1,32 @@
 // https://eslint.org/docs/user-guide/configuring
 
-module.exports = {
-  root: true,
-  parserOptions: {
-    parser: 'babel-eslint'
-  },
-  env: {
-    browser: true,
-  },
-  {{#if_eq lintConfig "standard"}}
-  extends: [
-    // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
-    // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
-    'plugin:vue/essential', 
-    // https://github.com/standard/standard/blob/master/docs/RULES-en.md
-    'standard'
-  ],
-  {{/if_eq}}
-  {{#if_eq lintConfig "airbnb"}}
-  // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
-  // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
-  extends: ['plugin:vue/essential', 'airbnb-base'],
-  {{/if_eq}}
-  {{#if_eq lintConfig "none"}}
-  // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
-  // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
-  extends: ['plugin:vue/essential'],
-  {{/if_eq}}
-  // required to lint *.vue files
-  plugins: [
-    'vue'
-  ],
-  {{#if_eq lintConfig "airbnb"}}
-  // check if imports actually resolve
-  settings: {
-    'import/resolver': {
-      webpack: {
-        config: 'build/webpack.base.conf.js'
-      }
-    }
-  },
-  {{/if_eq}}
-  // add your custom rules here
-  rules: {
-    {{#if_eq lintConfig "standard"}}
-    // allow async-await
-    'generator-star-spacing': 'off',
-    {{/if_eq}}
-    {{#if_eq lintConfig "airbnb"}}
-    // don't require .vue extension when importing
-    'import/extensions': ['error', 'always', {
-      js: 'never',
-      vue: 'never'
-    }],
-    // disallow reassignment of function parameters
-    // disallow parameter object manipulation except for specific exclusions
-    'no-param-reassign': ['error', {
-      props: true,
-      ignorePropertyModificationsFor: [
-        'state', // for vuex state
-        'acc', // for reduce accumulators
-        'e' // for e.returnvalue
-      ]
-    }],
-    // allow optionalDependencies
-    'import/no-extraneous-dependencies': ['error', {
-      optionalDependencies: ['test/unit/index.js']
-    }],
-    {{/if_eq}}
-    // allow debugger during development
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
-  }
-}
+// module.exports = {
+//   root: true,
+//   parserOptions: {
+//     parser: 'babel-eslint'
+//   },
+//   env: {
+//     browser: true,
+//   },
+//   extends: [
+//     // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
+//     // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
+//     'plugin:vue/essential',
+//     // 'plugin:vue/strongly-recommended',
+//     'standard'
+//   ],
+//   // required to lint *.vue files
+//   plugins: [
+//     'vue'
+//   ],
+//   // add your custom rules here
+//   rules: {
+//     // allow async-await
+//     'generator-star-spacing': 'off',
+//     // allow debugger during development
+//     'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+//     'no-mixed-spaces-and-tabs': ['error', 'smart-tabs'],
+//     'prefer-promise-reject-errors': ['error', {'allowEmptyReject': true}],
+//     'no-unneeded-ternary': 0
+//   }
+// }
diff --git a/template/.gitignore b/template/.gitignore
index c80b682e18..541a820f6c 100644
--- a/template/.gitignore
+++ b/template/.gitignore
@@ -4,13 +4,6 @@ node_modules/
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*
-{{#unit}}
-/test/unit/coverage/
-{{/unit}}
-{{#e2e}}
-/test/e2e/reports/
-selenium-debug.log
-{{/e2e}}
 
 # Editor directories and files
 .idea
diff --git a/template/README.md b/template/README.md
index 4b0258a35b..9f3c6eecb3 100644
--- a/template/README.md
+++ b/template/README.md
@@ -1,6 +1,6 @@
-# {{ name }}
+# purchase
 
-> {{ description }}
+> purchase
 
 ## Build Setup
 
@@ -8,29 +8,52 @@
 # install dependencies
 npm install
 
-# serve with hot reload at localhost:8080
-npm run dev
+# serve with hot reload at localhost:8090
+npm run dev 
 
 # build for production with minification
 npm run build
 
 # build for production and view the bundle analyzer report
 npm run build --report
-{{#unit}}
-
-# run unit tests
-npm run unit
-{{/unit}}
-{{#e2e}}
-
-# run e2e tests
-npm run e2e
-{{/e2e}}
-{{#if_or unit e2e}}
-
-# run all tests
-npm test
-{{/if_or}}
 ```
 
 For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
+
+### src目录结构
+	|--assets // 一些静态资源目录
+	  |--packages // 第三方插件
+	  |--stylus // stylus初始化样式文件
+	|--components // 公用基础组件
+	|--mixins // 公用混入
+	  |-formSearchCommon.js // 表格查询时的公用mixin
+	|--mockData // mock相关,前端本地模拟调试
+	  |--common // 公用mock
+	  |--index.js // 启用mock的主文件,可配置HOST等
+	  |--no-mock.js // 默认禁用状态不引入mockjs,会启用这个文件
+	  ...其他模块相关管理文件
+	  ...一些菜单目录等json文件
+	|--router
+	  |--views // 按页面模块独立注册路由
+	  |-index.js // 汇总路由,现有路由跳转前后钩子函数处理逻辑,后期视复杂度剥离出来
+	|--store // 公用状态管理(用户信息,面包屑,遮罩显示等等)
+	|--utils // 公用工具包
+	  |-default-setting.js // 业务公用设置,比如时间段选择的设置等等
+	  |-dom.js // dom操作相关方法
+	  |-bus.js // 公用vue实例作为广播
+	  |-http.js // 公用ajax请求封装,加入了请求队列存储,简化书写,默认判断等
+	  |-utils.js // 公用方法函数
+	  |--index.js // 全局注册http请求
+	|--views // 业务模块界面编写
+	  |--common // 公用业务组件
+	    |-form-froup-btns.vue // 表单查询、重置按钮公用样式
+	    |-goods-detail.vue // 商品列表表格详情(仅展示)
+	  |--home.vue // 首页
+	|--services // 类似于api文件夹管理模式,模仿了ng的service管理公用业务逻辑的模式,这里可配置接口的api定义;
+	也可以把业务逻辑抽取出来放在service中实现;可通过sevices存储公用属性和部分不需实时监听的公用状态,解决滥用vuex的问题
+	  |-ajax.service.js // 这是ajax请求相关的服务(对ajax进行公用封装)
+	  |-store.service.js // 这是负责储存公用数据的服务 (一些页面过渡需要短暂缓存或者公用请求需要共享的数据可以放这里)
+	  |-common.service.js // 这是所有模块公用业务逻辑的服务 (也可以设置公用配置)
+	  |-index.js // 汇总注册
+	|-App.vue // 根layout界面
+	|-main.js // 主入口文件,负责注册组件引入样式、路由、vuex等
\ No newline at end of file
diff --git a/template/build/build.js b/template/build/build.js
index 11eb43759c..8f2ad8ad49 100644
--- a/template/build/build.js
+++ b/template/build/build.js
@@ -22,7 +22,7 @@ rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
     process.stdout.write(stats.toString({
       colors: true,
       modules: false,
-      children: false, // if you are using ts-loader, setting this to true will make typescript errors show up during build
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
       chunks: false,
       chunkModules: false
     }) + '\n\n')
diff --git a/template/build/utils.js b/template/build/utils.js
index e534fb0fd6..bf9be3a04c 100644
--- a/template/build/utils.js
+++ b/template/build/utils.js
@@ -59,8 +59,8 @@ exports.cssLoaders = function (options) {
     css: generateLoaders(),
     postcss: generateLoaders(),
     less: generateLoaders('less'),
-    sass: generateLoaders('sass', { indentedSyntax: true }),
-    scss: generateLoaders('sass'),
+    // sass: generateLoaders('sass', { indentedSyntax: true }),
+    // scss: generateLoaders('sass'),
     stylus: generateLoaders('stylus'),
     styl: generateLoaders('stylus')
   }
diff --git a/template/build/webpack.base.conf.js b/template/build/webpack.base.conf.js
index 391160c571..fcee26a15f 100644
--- a/template/build/webpack.base.conf.js
+++ b/template/build/webpack.base.conf.js
@@ -1,96 +1,111 @@
-'use strict'
-const path = require('path')
-const utils = require('./utils')
-const config = require('../config')
-const vueLoaderConfig = require('./vue-loader.conf')
+"use strict";
+const path = require("path");
+const utils = require("./utils");
+const config = require("../config");
+const vueLoaderConfig = require("./vue-loader.conf");
 
-function resolve (dir) {
-  return path.join(__dirname, '..', dir)
+function resolve(dir) {
+	return path.join(__dirname, "..", dir);
 }
 
-{{#lint}}const createLintingRule = () => ({
-  test: /\.(js|vue)$/,
-  loader: 'eslint-loader',
-  enforce: 'pre',
-  include: [resolve('src'), resolve('test')],
-  options: {
-    formatter: require('eslint-friendly-formatter'),
-    emitWarning: !config.dev.showEslintErrorsInOverlay
-  }
-}){{/lint}}
+// const createLintingRule = () => ({
+// 	test: /\.(js|vue)$/,
+//  loader: 'eslint-loader',
+// 	enforce: "pre",
+// 	include: [resolve("src"), resolve("test")],
+// 	options: {
+// 		formatter: require("eslint-friendly-formatter"),
+// 		emitWarning: !config.dev.showEslintErrorsInOverlay
+// 	}
+// });
 
 module.exports = {
-  context: path.resolve(__dirname, '../'),
-  entry: {
-    app: './src/main.js'
-  },
-  output: {
-    path: config.build.assetsRoot,
-    filename: '[name].js',
-    publicPath: process.env.NODE_ENV === 'production'
-      ? config.build.assetsPublicPath
-      : config.dev.assetsPublicPath
-  },
-  resolve: {
-    extensions: ['.js', '.vue', '.json'],
-    alias: {
-      {{#if_eq build "standalone"}}
-      'vue$': 'vue/dist/vue.esm.js',
-      {{/if_eq}}
-      '@': resolve('src'),
-    }
-  },
-  module: {
-    rules: [
-      {{#lint}}
-      ...(config.dev.useEslint ? [createLintingRule()] : []),
-      {{/lint}}
-      {
-        test: /\.vue$/,
-        loader: 'vue-loader',
-        options: vueLoaderConfig
-      },
-      {
-        test: /\.js$/,
-        loader: 'babel-loader',
-        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
-      },
-      {
-        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('img/[name].[hash:7].[ext]')
-        }
-      },
-      {
-        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('media/[name].[hash:7].[ext]')
-        }
-      },
-      {
-        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
-        loader: 'url-loader',
-        options: {
-          limit: 10000,
-          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
-        }
-      }
-    ]
-  },
-  node: {
-    // prevent webpack from injecting useless setImmediate polyfill because Vue
-    // source contains it (although only uses it if it's native).
-    setImmediate: false,
-    // prevent webpack from injecting mocks to Node native modules
-    // that does not make sense for the client
-    dgram: 'empty',
-    fs: 'empty',
-    net: 'empty',
-    tls: 'empty',
-    child_process: 'empty'
-  }
-}
+	context: path.resolve(__dirname, "../"),
+	entry: {
+		app: "./src/main.js"
+	},
+	output: {
+		path: config.build.assetsRoot,
+		filename: "[name].js",
+		publicPath:
+			process.env.NODE_ENV === "production"
+				? config.build.assetsPublicPath
+				: config.dev.assetsPublicPath
+	},
+	resolve: {
+		extensions: [".js", ".vue", ".json"],
+		alias: {
+			vue$: "vue/dist/vue.esm.js",
+			"@": resolve("src"),
+			components: resolve("src/components"),
+			style: resolve("src/assets/stylus"),
+			"mock-data":
+				process.env.NODE_MOCK === "yes"
+					? resolve("src/mockData")
+					: resolve("src/mockData/no-mock.js"),
+			"test-demo":
+				process.env.NODE_TEST === "yes"
+					? resolve("src/test")
+					: resolve("src/test/no-test.js")
+		}
+	},
+	module: {
+		rules: [
+			// ...(config.dev.useEslint ? [createLintingRule()] : []),
+			{
+				test: /\.vue$/,
+				loader: "vue-loader",
+				options: vueLoaderConfig
+			},
+			{
+				test: /\.js$/,
+				loader: "babel-loader",
+				include: [
+					resolve("src"),
+					resolve("test"),
+					resolve("node_modules/webpack-dev-server/client")
+				]
+			},
+			{
+				test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+				loader: "url-loader",
+				options: {
+					limit: 10000,
+					name: utils.assetsPath("img/[name].[hash:7].[ext]")
+				}
+			},
+			{
+				test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+				loader: "url-loader",
+				options: {
+					limit: 10000,
+					name: utils.assetsPath("media/[name].[hash:7].[ext]")
+				}
+			},
+			{
+				test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+				loader: "url-loader",
+				options: {
+					limit: 10000,
+					name: utils.assetsPath("fonts/[name].[hash:7].[ext]")
+				}
+			},
+			{
+				test: /\.s[a|c]ss$/,
+				use: ["style-loader", "css-loader", "postcss-loader", "sass-loader"]
+			}
+		]
+	},
+	node: {
+		// prevent webpack from injecting useless setImmediate polyfill because Vue
+		// source contains it (although only uses it if it's native).
+		setImmediate: false,
+		// prevent webpack from injecting mocks to Node native modules
+		// that does not make sense for the client
+		dgram: "empty",
+		fs: "empty",
+		net: "empty",
+		tls: "empty",
+		child_process: "empty"
+	}
+};
diff --git a/template/build/webpack.prod.conf.js b/template/build/webpack.prod.conf.js
index fc5d53fa3d..d9f99f65a5 100644
--- a/template/build/webpack.prod.conf.js
+++ b/template/build/webpack.prod.conf.js
@@ -11,9 +11,7 @@ const ExtractTextPlugin = require('extract-text-webpack-plugin')
 const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
 const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
 
-const env = {{#if_or unit e2e}}process.env.NODE_ENV === 'testing'
-  ? require('../config/test.env')
-  : {{/if_or}}require('../config/prod.env')
+const env = require('../config/prod.env')
 
 const webpackConfig = merge(baseWebpackConfig, {
   module: {
@@ -63,9 +61,7 @@ const webpackConfig = merge(baseWebpackConfig, {
     // you can customize output by editing /index.html
     // see https://github.com/ampedandwired/html-webpack-plugin
     new HtmlWebpackPlugin({
-      filename: {{#if_or unit e2e}}process.env.NODE_ENV === 'testing'
-        ? 'index.html'
-        : {{/if_or}}config.build.index,
+      filename: config.build.index,
       template: 'index.html',
       inject: true,
       minify: {
diff --git a/template/build/webpack.test.conf.js b/template/build/webpack.test.conf.js
deleted file mode 100644
index 0d658d9ebe..0000000000
--- a/template/build/webpack.test.conf.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict'
-// This is the webpack config used for unit tests.
-
-const utils = require('./utils')
-const webpack = require('webpack')
-const merge = require('webpack-merge')
-const baseWebpackConfig = require('./webpack.base.conf')
-
-const webpackConfig = merge(baseWebpackConfig, {
-  // use inline sourcemap for karma-sourcemap-loader
-  module: {
-    rules: utils.styleLoaders()
-  },
-  devtool: '#inline-source-map',
-  resolveLoader: {
-    alias: {
-      // necessary to to make lang="scss" work in test when using vue-loader's ?inject option
-      // see discussion at https://github.com/vuejs/vue-loader/issues/724
-      'scss-loader': 'sass-loader'
-    }
-  },
-  plugins: [
-    new webpack.DefinePlugin({
-      'process.env': require('../config/test.env')
-    })
-  ]
-})
-
-// no need for app entry during tests
-delete webpackConfig.entry
-
-module.exports = webpackConfig
diff --git a/template/config/index.js b/template/config/index.js
index 820109957f..2d54a8c641 100644
--- a/template/config/index.js
+++ b/template/config/index.js
@@ -1,77 +1,86 @@
-'use strict'
-// Template version: {{ template_version }}
+"use strict";
+// Template version: 1.3.1
 // see http://vuejs-templates.github.io/webpack for documentation.
 
-const path = require('path')
+const path = require("path");
 
 module.exports = {
-  dev: {
+	dev: {
+		// Paths
+		assetsSubDirectory: "static",
+		assetsPublicPath: "/",
+		proxyTable: {
+			"/erp_store": {
+				target: "http://erp2.hwdev.pagoda.com.cn/", // 线上
+				// target: "http://192.168.2.25:8080/", // 曾文基
+				// target: "http://192.168.7.25:8080/", //谢翔
+				// target: "http://192.168.2.77:8080/", // 刘婷婷
+				changeOrigin: true,
+				pathRewrite: {
+					"^/erp_store": "erp_store"
+				}
+			}
+		},
+		// Various Dev Server settings
+		// host: 'localhost', // can be overwritten by process.env.HOST
+		host: "0.0.0.0",
+		port: 8090, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+		autoOpenBrowser: false,
+		errorOverlay: true,
+		notifyOnErrors: true,
+		poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
 
-    // Paths
-    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
-    proxyTable: {},
+		// Use Eslint Loader?
+		// If true, your code will be linted during bundling and
+		// linting errors and warnings will be shown in the console.
+		useEslint: true,
+		// If true, eslint errors and warnings will also be shown in the error overlay
+		// in the browser.
+		showEslintErrorsInOverlay: false,
 
-    // Various Dev Server settings
-    host: 'localhost', // can be overwritten by process.env.HOST
-    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
-    autoOpenBrowser: false,
-    errorOverlay: true,
-    notifyOnErrors: true,
-    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+		/**
+		 * Source Maps
+		 */
 
-    {{#lint}}// Use Eslint Loader?
-    // If true, your code will be linted during bundling and
-    // linting errors and warnings will be shown in the console.
-    useEslint: true,
-    // If true, eslint errors and warnings will also be shown in the error overlay
-    // in the browser.
-    showEslintErrorsInOverlay: false,
-    {{/lint}}
+		// https://webpack.js.org/configuration/devtool/#development
+		devtool: "cheap-module-eval-source-map",
 
-    /**
-     * Source Maps
-     */
+		// If you have problems debugging vue-files in devtools,
+		// set this to false - it *may* help
+		// https://vue-loader.vuejs.org/en/options.html#cachebusting
+		cacheBusting: true,
 
-    // https://webpack.js.org/configuration/devtool/#development
-    devtool: 'cheap-module-eval-source-map',
+		cssSourceMap: true
+	},
 
-    // If you have problems debugging vue-files in devtools,
-    // set this to false - it *may* help
-    // https://vue-loader.vuejs.org/en/options.html#cachebusting
-    cacheBusting: true,
+	build: {
+		// Template for index.html
+		index: path.resolve(__dirname, "../dist/index.html"),
 
-    cssSourceMap: true
-  },
+		// Paths
+		assetsRoot: path.resolve(__dirname, "../dist"),
+		assetsSubDirectory: "static",
+		assetsPublicPath: "./",
 
-  build: {
-    // Template for index.html
-    index: path.resolve(__dirname, '../dist/index.html'),
+		/**
+		 * Source Maps
+		 */
 
-    // Paths
-    assetsRoot: path.resolve(__dirname, '../dist'),
-    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
+		productionSourceMap: true,
+		// https://webpack.js.org/configuration/devtool/#production
+		devtool: "#source-map",
 
-    /**
-     * Source Maps
-     */
+		// Gzip off by default as many popular static hosts such as
+		// Surge or Netlify already gzip all static assets for you.
+		// Before setting to `true`, make sure to:
+		// npm install --save-dev compression-webpack-plugin
+		productionGzip: false,
+		productionGzipExtensions: ["js", "css"],
 
-    productionSourceMap: true,
-    // https://webpack.js.org/configuration/devtool/#production
-    devtool: '#source-map',
-
-    // Gzip off by default as many popular static hosts such as
-    // Surge or Netlify already gzip all static assets for you.
-    // Before setting to `true`, make sure to:
-    // npm install --save-dev compression-webpack-plugin
-    productionGzip: false,
-    productionGzipExtensions: ['js', 'css'],
-
-    // Run the build command with an extra argument to
-    // View the bundle analyzer report after build finishes:
-    // `npm run build --report`
-    // Set to `true` or `false` to always turn it on or off
-    bundleAnalyzerReport: process.env.npm_config_report
-  }
-}
+		// Run the build command with an extra argument to
+		// View the bundle analyzer report after build finishes:
+		// `npm run build --report`
+		// Set to `true` or `false` to always turn it on or off
+		bundleAnalyzerReport: process.env.npm_config_report
+	}
+};
diff --git a/template/config/test.env.js b/template/config/test.env.js
deleted file mode 100644
index c2824a307a..0000000000
--- a/template/config/test.env.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict'
-const merge = require('webpack-merge')
-const devEnv = require('./dev.env')
-
-module.exports = merge(devEnv, {
-  NODE_ENV: '"testing"'
-})
diff --git a/template/index.html b/template/index.html
index 6cfaafc7a8..28d55b9da3 100644
--- a/template/index.html
+++ b/template/index.html
@@ -3,7 +3,9 @@
   <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <title>{{ name }}</title>
+    <link href="static/favicon.ico" rel="shortcut icon">
+    <link href="//at.alicdn.com/t/font_465584_31nxhqzgm2t.css" rel="stylesheet" type="text/css"/>
+    <title>百果园ERP-门店运营</title>
   </head>
   <body>
     <div id="app"></div>
diff --git a/template/package-lock.json b/template/package-lock.json
new file mode 100644
index 0000000000..b11838f7d8
--- /dev/null
+++ b/template/package-lock.json
@@ -0,0 +1,12303 @@
+{
+  "name": "purchase",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "2.1.18",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
+      "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+      "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+      "dev": true,
+      "requires": {
+        "acorn": "4.0.13"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+          "dev": true
+        }
+      }
+    },
+    "acorn-jsx": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+      "dev": true,
+      "requires": {
+        "acorn": "3.3.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+          "dev": true
+        }
+      }
+    },
+    "ajv": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+      "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+      "optional": true,
+      "requires": {
+        "co": "4.6.0",
+        "json-stable-stringify": "1.0.1"
+      }
+    },
+    "ajv-keywords": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+      "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+      "dev": true
+    },
+    "align-text": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2",
+        "longest": "1.0.1",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+      "dev": true
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dev": true,
+      "requires": {
+        "color-convert": "1.9.1"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
+      "requires": {
+        "micromatch": "3.1.10",
+        "normalize-path": "2.1.1"
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "dev": true
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-includes": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
+      "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.11.0"
+      }
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "optional": true
+    },
+    "asn1": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+      "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+      "optional": true
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      }
+    },
+    "assert-plus": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+      "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+      "optional": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+      "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
+    "async-validator": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.2.tgz",
+      "integrity": "sha1-t3WXIm6WJC+NUxwNRq4pX2JCK6Q=",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "optional": true
+    },
+    "atob": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz",
+      "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "7.2.6",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz",
+      "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==",
+      "dev": true,
+      "requires": {
+        "browserslist": "2.11.3",
+        "caniuse-lite": "1.0.30000830",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "6.0.21",
+        "postcss-value-parser": "3.3.0"
+      }
+    },
+    "aws-sign2": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+      "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+      "optional": true
+    },
+    "aws4": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+      "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+      "optional": true
+    },
+    "axios": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
+      "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
+      "requires": {
+        "follow-redirects": "1.4.1",
+        "is-buffer": "1.1.6"
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-core": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+      "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-generator": "6.26.1",
+        "babel-helpers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-register": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "convert-source-map": "1.5.1",
+        "debug": "2.6.9",
+        "json5": "0.5.1",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4",
+        "path-is-absolute": "1.0.1",
+        "private": "0.1.8",
+        "slash": "1.0.0",
+        "source-map": "0.5.7"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "babel-eslint": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz",
+      "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0"
+      }
+    },
+    "babel-generator": {
+      "version": "6.26.1",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+      "dev": true,
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.17.5",
+        "source-map": "0.5.7",
+        "trim-right": "1.0.1"
+      }
+    },
+    "babel-helper-bindify-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz",
+      "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-builder-binary-assignment-operator-visitor": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-assignable-expression": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-call-delegate": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-define-map": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-helper-explode-assignable-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-explode-class": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz",
+      "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=",
+      "dev": true,
+      "requires": {
+        "babel-helper-bindify-decorators": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+      "dev": true,
+      "requires": {
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-get-function-arity": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-hoist-variables": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-optimise-call-expression": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-regex": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-helper-remap-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-replace-supers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+      "dev": true,
+      "requires": {
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-loader": {
+      "version": "7.1.4",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.4.tgz",
+      "integrity": "sha512-/hbyEvPzBJuGpk9o80R0ZyTej6heEOr59GoEUtn8qFKbnx4cJm9FWES6J/iv644sYgrtVw9JJQkjaLW/bqb5gw==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "1.0.0",
+        "loader-utils": "1.1.0",
+        "mkdirp": "0.5.1"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-check-es2015-constants": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-syntax-async-functions": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+      "dev": true
+    },
+    "babel-plugin-syntax-async-generators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+      "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
+      "dev": true
+    },
+    "babel-plugin-syntax-class-properties": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+      "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
+      "dev": true
+    },
+    "babel-plugin-syntax-decorators": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+      "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
+      "dev": true
+    },
+    "babel-plugin-syntax-dynamic-import": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+      "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
+      "dev": true
+    },
+    "babel-plugin-syntax-exponentiation-operator": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+      "dev": true
+    },
+    "babel-plugin-syntax-jsx": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
+      "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=",
+      "dev": true
+    },
+    "babel-plugin-syntax-object-rest-spread": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+      "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
+      "dev": true
+    },
+    "babel-plugin-syntax-trailing-function-commas": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+      "dev": true
+    },
+    "babel-plugin-transform-async-generator-functions": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz",
+      "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-generators": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-async-to-generator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+      "dev": true,
+      "requires": {
+        "babel-helper-remap-async-to-generator": "6.24.1",
+        "babel-plugin-syntax-async-functions": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-class-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz",
+      "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-plugin-syntax-class-properties": "6.13.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-decorators": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz",
+      "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=",
+      "dev": true,
+      "requires": {
+        "babel-helper-explode-class": "6.24.1",
+        "babel-plugin-syntax-decorators": "6.13.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-arrow-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoped-functions": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-block-scoping": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-plugin-transform-es2015-classes": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+      "dev": true,
+      "requires": {
+        "babel-helper-define-map": "6.26.0",
+        "babel-helper-function-name": "6.24.1",
+        "babel-helper-optimise-call-expression": "6.24.1",
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-computed-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-destructuring": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-duplicate-keys": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-for-of": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-function-name": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+      "dev": true,
+      "requires": {
+        "babel-helper-function-name": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-amd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-commonjs": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+      "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-strict-mode": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-systemjs": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+      "dev": true,
+      "requires": {
+        "babel-helper-hoist-variables": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-modules-umd": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-object-super": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+      "dev": true,
+      "requires": {
+        "babel-helper-replace-supers": "6.24.1",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-parameters": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+      "dev": true,
+      "requires": {
+        "babel-helper-call-delegate": "6.24.1",
+        "babel-helper-get-function-arity": "6.24.1",
+        "babel-runtime": "6.26.0",
+        "babel-template": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-shorthand-properties": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-spread": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-sticky-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-template-literals": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-typeof-symbol": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-es2015-unicode-regex": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+      "dev": true,
+      "requires": {
+        "babel-helper-regex": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "regexpu-core": "2.0.0"
+      }
+    },
+    "babel-plugin-transform-exponentiation-operator": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+      "dev": true,
+      "requires": {
+        "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1",
+        "babel-plugin-syntax-exponentiation-operator": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-object-rest-spread": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz",
+      "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-object-rest-spread": "6.13.0",
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-regenerator": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "0.10.1"
+      }
+    },
+    "babel-plugin-transform-runtime": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz",
+      "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-strict-mode": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0"
+      }
+    },
+    "babel-plugin-transform-vue-jsx": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-3.7.0.tgz",
+      "integrity": "sha512-W39X07/n3oJMQd8tALBO+440NraGSF//Lo1ydd/9Nme3+QiRGFBb1Q39T9iixh0jZPPbfv3so18tNoIgLatymw==",
+      "dev": true,
+      "requires": {
+        "esutils": "2.0.2"
+      }
+    },
+    "babel-preset-env": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz",
+      "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==",
+      "dev": true,
+      "requires": {
+        "babel-plugin-check-es2015-constants": "6.22.0",
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-es2015-arrow-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
+        "babel-plugin-transform-es2015-block-scoping": "6.26.0",
+        "babel-plugin-transform-es2015-classes": "6.24.1",
+        "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+        "babel-plugin-transform-es2015-destructuring": "6.23.0",
+        "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+        "babel-plugin-transform-es2015-for-of": "6.23.0",
+        "babel-plugin-transform-es2015-function-name": "6.24.1",
+        "babel-plugin-transform-es2015-literals": "6.22.0",
+        "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+        "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+        "babel-plugin-transform-es2015-modules-systemjs": "6.24.1",
+        "babel-plugin-transform-es2015-modules-umd": "6.24.1",
+        "babel-plugin-transform-es2015-object-super": "6.24.1",
+        "babel-plugin-transform-es2015-parameters": "6.24.1",
+        "babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
+        "babel-plugin-transform-es2015-spread": "6.22.0",
+        "babel-plugin-transform-es2015-sticky-regex": "6.24.1",
+        "babel-plugin-transform-es2015-template-literals": "6.22.0",
+        "babel-plugin-transform-es2015-typeof-symbol": "6.23.0",
+        "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-regenerator": "6.26.0",
+        "browserslist": "2.11.3",
+        "invariant": "2.2.4",
+        "semver": "5.5.0"
+      }
+    },
+    "babel-preset-stage-2": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz",
+      "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-dynamic-import": "6.18.0",
+        "babel-plugin-transform-class-properties": "6.24.1",
+        "babel-plugin-transform-decorators": "6.24.1",
+        "babel-preset-stage-3": "6.24.1"
+      }
+    },
+    "babel-preset-stage-3": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz",
+      "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=",
+      "dev": true,
+      "requires": {
+        "babel-plugin-syntax-trailing-function-commas": "6.22.0",
+        "babel-plugin-transform-async-generator-functions": "6.24.1",
+        "babel-plugin-transform-async-to-generator": "6.24.1",
+        "babel-plugin-transform-exponentiation-operator": "6.24.1",
+        "babel-plugin-transform-object-rest-spread": "6.26.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+      "dev": true,
+      "requires": {
+        "babel-core": "6.26.0",
+        "babel-runtime": "6.26.0",
+        "core-js": "2.5.5",
+        "home-or-tmp": "2.0.0",
+        "lodash": "4.17.5",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.4.18"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+      "requires": {
+        "core-js": "2.5.5",
+        "regenerator-runtime": "0.11.1"
+      }
+    },
+    "babel-template": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-traverse": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "lodash": "4.17.5"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "babylon": "6.18.0",
+        "debug": "2.6.9",
+        "globals": "9.18.0",
+        "invariant": "2.2.4",
+        "lodash": "4.17.5"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "babel-types": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "esutils": "2.0.2",
+        "lodash": "4.17.5",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babylon": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "dev": true,
+      "requires": {
+        "cache-base": "1.0.1",
+        "class-utils": "0.3.6",
+        "component-emitter": "1.2.1",
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "mixin-deep": "1.3.1",
+        "pascalcase": "0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "base64-js": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
+      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
+      "dev": true
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+      "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+      "optional": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "bfj-node4": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.3.1.tgz",
+      "integrity": "sha512-SOmOsowQWfXc7ybFARsK3C4MCOWzERaOMV/Fl3Tgjs+5dJWyzo3oa127jL44eMbQiAN17J7SvAs2TRxEScTUmg==",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.1",
+        "check-types": "7.3.0",
+        "tryer": "1.0.0"
+      }
+    },
+    "big.js": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+      "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q=="
+    },
+    "binary-extensions": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+      "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+      "dev": true
+    },
+    "bluebird": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+      "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+      "dev": true
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
+      "dev": true
+    },
+    "body-parser": {
+      "version": "1.18.2",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
+      "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "content-type": "1.0.4",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "http-errors": "1.6.3",
+        "iconv-lite": "0.4.19",
+        "on-finished": "2.3.0",
+        "qs": "6.5.1",
+        "raw-body": "2.3.2",
+        "type-is": "1.6.16"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.19",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+          "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+          "dev": true
+        },
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "dev": true
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "dev": true,
+      "requires": {
+        "array-flatten": "2.1.1",
+        "deep-equal": "1.0.1",
+        "dns-equal": "1.0.0",
+        "dns-txt": "2.0.2",
+        "multicast-dns": "6.2.3",
+        "multicast-dns-service-types": "1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz",
+          "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=",
+          "dev": true
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "dev": true
+    },
+    "boom": {
+      "version": "2.10.1",
+      "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+      "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0",
+        "array-unique": "0.3.2",
+        "extend-shallow": "2.0.1",
+        "fill-range": "4.0.0",
+        "isobject": "3.0.1",
+        "repeat-element": "1.1.2",
+        "snapdragon": "0.8.2",
+        "snapdragon-node": "2.1.1",
+        "split-string": "3.1.0",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "dev": true
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "dev": true,
+      "requires": {
+        "buffer-xor": "1.0.3",
+        "cipher-base": "1.0.4",
+        "create-hash": "1.2.0",
+        "evp_bytestokey": "1.0.3",
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "dev": true,
+      "requires": {
+        "browserify-aes": "1.2.0",
+        "browserify-des": "1.0.1",
+        "evp_bytestokey": "1.0.3"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz",
+      "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "des.js": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "randombytes": "2.0.6"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "elliptic": "6.4.0",
+        "inherits": "2.0.3",
+        "parse-asn1": "5.1.1"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "dev": true,
+      "requires": {
+        "pako": "1.0.6"
+      }
+    },
+    "browserslist": {
+      "version": "2.11.3",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz",
+      "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==",
+      "dev": true,
+      "requires": {
+        "caniuse-lite": "1.0.30000830",
+        "electron-to-chromium": "1.3.42"
+      }
+    },
+    "buffer": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+      "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+      "dev": true,
+      "requires": {
+        "base64-js": "1.3.0",
+        "ieee754": "1.1.11",
+        "isarray": "1.0.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+      "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
+      "dev": true
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "dev": true
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "dev": true
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "dev": true
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "dev": true
+    },
+    "cacache": {
+      "version": "10.0.4",
+      "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz",
+      "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.1",
+        "chownr": "1.0.1",
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "lru-cache": "4.1.2",
+        "mississippi": "2.0.0",
+        "mkdirp": "0.5.1",
+        "move-concurrently": "1.0.1",
+        "promise-inflight": "1.0.1",
+        "rimraf": "2.6.2",
+        "ssri": "5.3.0",
+        "unique-filename": "1.1.0",
+        "y18n": "4.0.0"
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "dev": true,
+      "requires": {
+        "collection-visit": "1.0.0",
+        "component-emitter": "1.2.1",
+        "get-value": "2.0.6",
+        "has-value": "1.0.0",
+        "isobject": "3.0.1",
+        "set-value": "2.0.0",
+        "to-object-path": "0.3.0",
+        "union-value": "1.0.0",
+        "unset-value": "1.0.0"
+      }
+    },
+    "caller-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+      "dev": true,
+      "requires": {
+        "callsites": "0.2.0"
+      }
+    },
+    "callsites": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+      "dev": true
+    },
+    "camel-case": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+      "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.2",
+        "upper-case": "1.1.3"
+      }
+    },
+    "camelcase": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+          "dev": true
+        }
+      }
+    },
+    "caniuse-api": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+      "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-db": "1.0.30000830",
+        "lodash.memoize": "4.1.2",
+        "lodash.uniq": "4.5.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000830",
+            "electron-to-chromium": "1.3.42"
+          }
+        }
+      }
+    },
+    "caniuse-db": {
+      "version": "1.0.30000830",
+      "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000830.tgz",
+      "integrity": "sha1-bkUlWzRWSf0V/1kHLaHhK7PeLxM=",
+      "dev": true
+    },
+    "caniuse-lite": {
+      "version": "1.0.30000830",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz",
+      "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==",
+      "dev": true
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "optional": true
+    },
+    "center-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+      "dev": true,
+      "requires": {
+        "align-text": "0.1.4",
+        "lazy-cache": "1.0.4"
+      }
+    },
+    "chalk": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz",
+      "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "3.2.1",
+        "escape-string-regexp": "1.0.5",
+        "supports-color": "5.4.0"
+      }
+    },
+    "chardet": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+      "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+      "dev": true
+    },
+    "check-types": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.3.0.tgz",
+      "integrity": "sha1-Ro9XGkQ1wkJI9f0MsOjYfDw0Hn0=",
+      "dev": true
+    },
+    "chokidar": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz",
+      "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==",
+      "dev": true,
+      "requires": {
+        "anymatch": "2.0.0",
+        "async-each": "1.0.1",
+        "braces": "2.3.2",
+        "fsevents": "1.1.3",
+        "glob-parent": "3.1.0",
+        "inherits": "2.0.3",
+        "is-binary-path": "1.0.1",
+        "is-glob": "4.0.0",
+        "normalize-path": "2.1.1",
+        "path-is-absolute": "1.0.1",
+        "readdirp": "2.1.0",
+        "upath": "1.0.4"
+      }
+    },
+    "chownr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+      "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
+      "dev": true
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "circular-json": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+      "dev": true
+    },
+    "clap": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
+      "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "dev": true,
+      "requires": {
+        "arr-union": "3.1.0",
+        "define-property": "0.2.5",
+        "isobject": "3.0.1",
+        "static-extend": "0.1.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        }
+      }
+    },
+    "clean-css": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz",
+      "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.7"
+      }
+    },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "dev": true,
+      "requires": {
+        "restore-cursor": "2.0.0"
+      }
+    },
+    "cli-spinners": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
+      "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
+      "dev": true
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+      "dev": true
+    },
+    "cliui": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+      "dev": true,
+      "requires": {
+        "center-align": "0.1.3",
+        "right-align": "0.1.3",
+        "wordwrap": "0.0.2"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "0.0.2",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+          "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+          "dev": true
+        }
+      }
+    },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
+    },
+    "coa": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+      "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+      "dev": true,
+      "requires": {
+        "q": "1.5.1"
+      }
+    },
+    "coalescy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz",
+      "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=",
+      "dev": true
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "dev": true,
+      "requires": {
+        "map-visit": "1.0.0",
+        "object-visit": "1.0.1"
+      }
+    },
+    "color": {
+      "version": "0.11.4",
+      "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+      "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+      "dev": true,
+      "requires": {
+        "clone": "1.0.4",
+        "color-convert": "1.9.1",
+        "color-string": "0.3.0"
+      },
+      "dependencies": {
+        "clone": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+          "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+          "dev": true
+        }
+      }
+    },
+    "color-convert": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+      "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
+    },
+    "color-string": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+      "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "colormin": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+      "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+      "dev": true,
+      "requires": {
+        "color": "0.11.4",
+        "css-color-names": "0.0.4",
+        "has": "1.0.1"
+      }
+    },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "commander": {
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+      "dev": true
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "dev": true
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+      "dev": true
+    },
+    "compressible": {
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz",
+      "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.33.0"
+      }
+    },
+    "compression": {
+      "version": "1.7.2",
+      "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz",
+      "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "2.0.13",
+        "debug": "2.6.9",
+        "on-headers": "1.0.1",
+        "safe-buffer": "5.1.1",
+        "vary": "1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "1.0.0",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "typedarray": "0.0.6"
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
+      "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
+      "dev": true
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "dev": true,
+      "requires": {
+        "date-now": "0.1.4"
+      }
+    },
+    "consolidate": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz",
+      "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.1"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "dev": true
+    },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "dev": true
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "dev": true
+    },
+    "convert-source-map": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+      "dev": true
+    },
+    "cookie": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+      "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+      "dev": true
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "dev": true
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "fs-write-stream-atomic": "1.0.10",
+        "iferr": "0.1.5",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "dev": true
+    },
+    "copy-webpack-plugin": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz",
+      "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==",
+      "dev": true,
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "globby": "7.1.1",
+        "is-glob": "4.0.0",
+        "loader-utils": "1.1.0",
+        "minimatch": "3.0.4",
+        "p-limit": "1.2.0",
+        "serialize-javascript": "1.5.0"
+      }
+    },
+    "core-js": {
+      "version": "2.5.5",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+      "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "cosmiconfig": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz",
+      "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==",
+      "dev": true,
+      "requires": {
+        "is-directory": "0.3.1",
+        "js-yaml": "3.7.0",
+        "minimist": "1.2.0",
+        "object-assign": "4.1.1",
+        "os-homedir": "1.0.2",
+        "parse-json": "2.2.0",
+        "require-from-string": "1.2.1"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz",
+      "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "elliptic": "6.4.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "inherits": "2.0.3",
+        "md5.js": "1.3.4",
+        "ripemd160": "2.0.1",
+        "sha.js": "2.4.11"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "dev": true,
+      "requires": {
+        "cipher-base": "1.0.4",
+        "create-hash": "1.2.0",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.11"
+      }
+    },
+    "cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "4.1.2",
+        "shebang-command": "1.2.0",
+        "which": "1.3.0"
+      }
+    },
+    "cryptiles": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+      "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "dev": true,
+      "requires": {
+        "browserify-cipher": "1.0.1",
+        "browserify-sign": "4.0.4",
+        "create-ecdh": "4.0.1",
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "diffie-hellman": "5.0.3",
+        "inherits": "2.0.3",
+        "pbkdf2": "3.0.14",
+        "public-encrypt": "4.0.2",
+        "randombytes": "2.0.6",
+        "randomfill": "1.0.4"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "dev": true
+    },
+    "css-loader": {
+      "version": "0.28.11",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz",
+      "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==",
+      "dev": true,
+      "requires": {
+        "babel-code-frame": "6.26.0",
+        "css-selector-tokenizer": "0.7.0",
+        "cssnano": "3.10.0",
+        "icss-utils": "2.1.0",
+        "loader-utils": "1.1.0",
+        "lodash.camelcase": "4.3.0",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-modules-extract-imports": "1.2.0",
+        "postcss-modules-local-by-default": "1.2.0",
+        "postcss-modules-scope": "1.1.0",
+        "postcss-modules-values": "1.3.0",
+        "postcss-value-parser": "3.3.0",
+        "source-list-map": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0",
+        "css-what": "2.1.0",
+        "domutils": "1.5.1",
+        "nth-check": "1.0.1"
+      }
+    },
+    "css-selector-tokenizer": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
+      "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+      "dev": true,
+      "requires": {
+        "cssesc": "0.1.0",
+        "fastparse": "1.1.1",
+        "regexpu-core": "1.0.0"
+      },
+      "dependencies": {
+        "regexpu-core": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+          "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+          "dev": true,
+          "requires": {
+            "regenerate": "1.3.3",
+            "regjsgen": "0.2.0",
+            "regjsparser": "0.1.5"
+          }
+        }
+      }
+    },
+    "css-what": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
+      "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
+      "dev": true
+    },
+    "cssesc": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+      "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+      "dev": true
+    },
+    "cssnano": {
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+      "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+      "dev": true,
+      "requires": {
+        "autoprefixer": "6.7.7",
+        "decamelize": "1.2.0",
+        "defined": "1.0.0",
+        "has": "1.0.1",
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-calc": "5.3.1",
+        "postcss-colormin": "2.2.2",
+        "postcss-convert-values": "2.6.1",
+        "postcss-discard-comments": "2.0.4",
+        "postcss-discard-duplicates": "2.1.0",
+        "postcss-discard-empty": "2.1.0",
+        "postcss-discard-overridden": "0.1.1",
+        "postcss-discard-unused": "2.2.3",
+        "postcss-filter-plugins": "2.0.2",
+        "postcss-merge-idents": "2.1.7",
+        "postcss-merge-longhand": "2.0.2",
+        "postcss-merge-rules": "2.1.2",
+        "postcss-minify-font-values": "1.0.5",
+        "postcss-minify-gradients": "1.0.5",
+        "postcss-minify-params": "1.2.2",
+        "postcss-minify-selectors": "2.1.1",
+        "postcss-normalize-charset": "1.1.1",
+        "postcss-normalize-url": "3.0.8",
+        "postcss-ordered-values": "2.2.3",
+        "postcss-reduce-idents": "2.4.0",
+        "postcss-reduce-initial": "1.0.1",
+        "postcss-reduce-transforms": "1.0.4",
+        "postcss-svgo": "2.1.6",
+        "postcss-unique-selectors": "2.0.2",
+        "postcss-value-parser": "3.3.0",
+        "postcss-zindex": "2.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "autoprefixer": {
+          "version": "6.7.7",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+          "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+          "dev": true,
+          "requires": {
+            "browserslist": "1.7.7",
+            "caniuse-db": "1.0.30000830",
+            "normalize-range": "0.1.2",
+            "num2fraction": "1.2.2",
+            "postcss": "5.2.18",
+            "postcss-value-parser": "3.3.0"
+          }
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000830",
+            "electron-to-chromium": "1.3.42"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "csso": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+      "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+      "dev": true,
+      "requires": {
+        "clap": "1.2.3",
+        "source-map": "0.5.7"
+      }
+    },
+    "cuint": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
+      "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=",
+      "dev": true
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "cyclist": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz",
+      "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=",
+      "dev": true
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "dev": true,
+      "requires": {
+        "es5-ext": "0.10.42"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+      "dev": true
+    },
+    "de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+      "dev": true
+    },
+    "debug": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "dev": true
+    },
+    "deep-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
+      "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
+      "dev": true
+    },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+      "dev": true
+    },
+    "deepmerge": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz",
+      "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
+    },
+    "define-properties": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+      "dev": true,
+      "requires": {
+        "foreach": "2.0.5",
+        "object-keys": "1.0.11"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "dev": true,
+      "requires": {
+        "is-descriptor": "1.0.2",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+      "dev": true
+    },
+    "del": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+      "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+      "dev": true,
+      "requires": {
+        "globby": "5.0.0",
+        "is-path-cwd": "1.0.0",
+        "is-path-in-cwd": "1.0.1",
+        "object-assign": "4.1.1",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "rimraf": "2.6.2"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "dev": true
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "dev": true
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "detect-node": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz",
+      "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=",
+      "dev": true
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "miller-rabin": "4.0.1",
+        "randombytes": "2.0.6"
+      }
+    },
+    "dir-glob": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
+      "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
+      "dev": true,
+      "requires": {
+        "arrify": "1.0.1",
+        "path-type": "3.0.0"
+      }
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "dev": true
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "dev": true,
+      "requires": {
+        "ip": "1.1.5",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "dev": true,
+      "requires": {
+        "buffer-indexof": "1.1.1"
+      }
+    },
+    "doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "dev": true,
+      "requires": {
+        "esutils": "2.0.2"
+      }
+    },
+    "dom-converter": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
+      "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=",
+      "dev": true,
+      "requires": {
+        "utila": "0.3.3"
+      },
+      "dependencies": {
+        "utila": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
+          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
+          "dev": true
+        }
+      }
+    },
+    "dom-serializer": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
+      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.1.3",
+        "entities": "1.1.1"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
+          "dev": true
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "dev": true
+    },
+    "domelementtype": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
+      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+      "dev": true
+    },
+    "domhandler": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz",
+      "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0"
+      }
+    },
+    "domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dev": true,
+      "requires": {
+        "dom-serializer": "0.1.0",
+        "domelementtype": "1.3.0"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexify": {
+      "version": "3.5.4",
+      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+      "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "ecc-jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+      "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+      "optional": true,
+      "requires": {
+        "jsbn": "0.1.1"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "dev": true
+    },
+    "ejs": {
+      "version": "2.5.9",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz",
+      "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==",
+      "dev": true
+    },
+    "electron-to-chromium": {
+      "version": "1.3.42",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz",
+      "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=",
+      "dev": true
+    },
+    "element-ui": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.3.4.tgz",
+      "integrity": "sha512-wJij9v2kNn23a1PjsNMviYAQF1yRrHbO9q3yyyJls49tIauJp+DfoESRVXR+l7qhnUKaocvKmHf5fmBoEzZMoQ==",
+      "requires": {
+        "async-validator": "1.8.2",
+        "babel-helper-vue-jsx-merge-props": "2.0.3",
+        "deepmerge": "1.5.2",
+        "normalize-wheel": "1.0.1",
+        "throttle-debounce": "1.0.1"
+      }
+    },
+    "elliptic": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+      "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0",
+        "hash.js": "1.1.3",
+        "hmac-drbg": "1.0.1",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "emojis-list": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "dev": true
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+      "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "memory-fs": "0.4.1",
+        "object-assign": "4.1.1",
+        "tapable": "0.2.8"
+      }
+    },
+    "entities": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
+      "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+      "dev": true
+    },
+    "errno": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+      "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+      "requires": {
+        "prr": "1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "error-stack-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.1.tgz",
+      "integrity": "sha1-oyArj7AxFKqbQKDjZp5IsrZaAQo=",
+      "dev": true,
+      "requires": {
+        "stackframe": "1.0.4"
+      }
+    },
+    "es-abstract": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz",
+      "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "1.1.1",
+        "function-bind": "1.1.1",
+        "has": "1.0.1",
+        "is-callable": "1.1.3",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+      "dev": true,
+      "requires": {
+        "is-callable": "1.1.3",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.1"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.42",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz",
+      "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==",
+      "dev": true,
+      "requires": {
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "next-tick": "1.0.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "es6-map": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+      "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42",
+        "es6-iterator": "2.0.3",
+        "es6-set": "0.1.5",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-set": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+      "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1",
+        "event-emitter": "0.3.5"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42",
+        "es6-iterator": "2.0.3",
+        "es6-symbol": "3.1.1"
+      }
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "dev": true
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "escope": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+      "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+      "dev": true,
+      "requires": {
+        "es6-map": "0.1.5",
+        "es6-weak-map": "2.0.2",
+        "esrecurse": "4.2.1",
+        "estraverse": "4.2.0"
+      }
+    },
+    "eslint": {
+      "version": "4.19.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
+      "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "babel-code-frame": "6.26.0",
+        "chalk": "2.4.0",
+        "concat-stream": "1.6.2",
+        "cross-spawn": "5.1.0",
+        "debug": "3.1.0",
+        "doctrine": "2.1.0",
+        "eslint-scope": "3.7.1",
+        "eslint-visitor-keys": "1.0.0",
+        "espree": "3.5.4",
+        "esquery": "1.0.1",
+        "esutils": "2.0.2",
+        "file-entry-cache": "2.0.0",
+        "functional-red-black-tree": "1.0.1",
+        "glob": "7.1.2",
+        "globals": "11.4.0",
+        "ignore": "3.3.7",
+        "imurmurhash": "0.1.4",
+        "inquirer": "3.3.0",
+        "is-resolvable": "1.1.0",
+        "js-yaml": "3.11.0",
+        "json-stable-stringify-without-jsonify": "1.0.1",
+        "levn": "0.3.0",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "natural-compare": "1.4.0",
+        "optionator": "0.8.2",
+        "path-is-inside": "1.0.2",
+        "pluralize": "7.0.0",
+        "progress": "2.0.0",
+        "regexpp": "1.1.0",
+        "require-uncached": "1.0.3",
+        "semver": "5.5.0",
+        "strip-ansi": "4.0.0",
+        "strip-json-comments": "2.0.1",
+        "table": "4.0.2",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "esprima": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+          "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+          "dev": true
+        },
+        "globals": {
+          "version": "11.4.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.4.0.tgz",
+          "integrity": "sha512-Dyzmifil8n/TmSqYDEXbm+C8yitzJQqQIlJQLNRMwa+BOUJpRC19pyVeN12JAjt61xonvXjtff+hJruTRXn5HA==",
+          "dev": true
+        },
+        "js-yaml": {
+          "version": "3.11.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
+          "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
+          "dev": true,
+          "requires": {
+            "argparse": "1.0.10",
+            "esprima": "4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "eslint-config-standard": {
+      "version": "10.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz",
+      "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=",
+      "dev": true
+    },
+    "eslint-friendly-formatter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz",
+      "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "coalescy": "1.0.0",
+        "extend": "3.0.1",
+        "minimist": "1.2.0",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-import-resolver-node": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+      "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "resolve": "1.7.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "eslint-loader": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz",
+      "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==",
+      "dev": true,
+      "requires": {
+        "loader-fs-cache": "1.0.1",
+        "loader-utils": "1.1.0",
+        "object-assign": "4.1.1",
+        "object-hash": "1.3.0",
+        "rimraf": "2.6.2"
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
+      "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "pkg-dir": "1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pkg-dir": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+          "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+          "dev": true,
+          "requires": {
+            "find-up": "1.1.2"
+          }
+        }
+      }
+    },
+    "eslint-plugin-import": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.11.0.tgz",
+      "integrity": "sha1-Fa7qN6Z0mdhI6OmBgG1GJ7VQOBY=",
+      "dev": true,
+      "requires": {
+        "contains-path": "0.1.0",
+        "debug": "2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "0.3.2",
+        "eslint-module-utils": "2.2.0",
+        "has": "1.0.1",
+        "lodash": "4.17.5",
+        "minimatch": "3.0.4",
+        "read-pkg-up": "2.0.0",
+        "resolve": "1.7.1"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "doctrine": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
+          "requires": {
+            "esutils": "2.0.2",
+            "isarray": "1.0.0"
+          }
+        }
+      }
+    },
+    "eslint-plugin-node": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz",
+      "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==",
+      "dev": true,
+      "requires": {
+        "ignore": "3.3.7",
+        "minimatch": "3.0.4",
+        "resolve": "1.7.1",
+        "semver": "5.3.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-promise": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.7.0.tgz",
+      "integrity": "sha512-2WO+ZFh7vxUKRfR0cOIMrWgYKdR6S1AlOezw6pC52B6oYpd5WFghN+QHxvrRdZMtbo8h3dfUZ2o1rWb0UPbKtg==",
+      "dev": true
+    },
+    "eslint-plugin-standard": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz",
+      "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=",
+      "dev": true
+    },
+    "eslint-plugin-vue": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-4.4.0.tgz",
+      "integrity": "sha512-UHeE0aTEv9A/9xe8J6X7rDLMbwV6GuQFKAscMyLEv49Y4wK4KwQiifr2X0MsNsVlmccrDUyjI9KO4DuFTkPP9A==",
+      "dev": true,
+      "requires": {
+        "vue-eslint-parser": "2.0.3"
+      }
+    },
+    "eslint-scope": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+      "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+      "dev": true,
+      "requires": {
+        "esrecurse": "4.2.1",
+        "estraverse": "4.2.0"
+      }
+    },
+    "eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+      "dev": true
+    },
+    "espree": {
+      "version": "3.5.4",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
+      "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
+      "dev": true,
+      "requires": {
+        "acorn": "5.5.3",
+        "acorn-jsx": "3.0.1"
+      }
+    },
+    "esprima": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+      "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+      "dev": true
+    },
+    "esquery": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+      "dev": true,
+      "requires": {
+        "estraverse": "4.2.0"
+      }
+    },
+    "esrecurse": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
+      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
+      "requires": {
+        "estraverse": "4.2.0"
+      }
+    },
+    "estraverse": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+      "dev": true
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "dev": true,
+      "requires": {
+        "d": "1.0.0",
+        "es5-ext": "0.10.42"
+      }
+    },
+    "eventemitter3": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
+      "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
+      "dev": true
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "dev": true
+    },
+    "eventsource": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
+      "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
+      "dev": true,
+      "requires": {
+        "original": "1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "dev": true,
+      "requires": {
+        "md5.js": "1.3.4",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "execa": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+      "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "5.1.0",
+        "get-stream": "3.0.0",
+        "is-stream": "1.1.0",
+        "npm-run-path": "2.0.2",
+        "p-finally": "1.0.0",
+        "signal-exit": "3.0.2",
+        "strip-eof": "1.0.0"
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "define-property": "0.2.5",
+        "extend-shallow": "2.0.1",
+        "posix-character-classes": "0.1.1",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "dev": true,
+      "requires": {
+        "fill-range": "2.2.3"
+      },
+      "dependencies": {
+        "fill-range": {
+          "version": "2.2.3",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+          "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+          "dev": true,
+          "requires": {
+            "is-number": "2.1.0",
+            "isobject": "2.1.0",
+            "randomatic": "1.1.7",
+            "repeat-element": "1.1.2",
+            "repeat-string": "1.6.1"
+          }
+        },
+        "is-number": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          }
+        },
+        "isobject": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+          "dev": true,
+          "requires": {
+            "isarray": "1.0.0"
+          }
+        }
+      }
+    },
+    "express": {
+      "version": "4.16.3",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
+      "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.18.2",
+        "content-disposition": "0.5.2",
+        "content-type": "1.0.4",
+        "cookie": "0.3.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "finalhandler": "1.1.1",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "1.1.2",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "2.0.3",
+        "qs": "6.5.1",
+        "range-parser": "1.2.0",
+        "safe-buffer": "5.1.1",
+        "send": "0.16.2",
+        "serve-static": "1.13.2",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0",
+        "type-is": "1.6.16",
+        "utils-merge": "1.0.1",
+        "vary": "1.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "qs": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+          "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+          "dev": true
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+      "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "dev": true,
+      "requires": {
+        "assign-symbols": "1.0.0",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "external-editor": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
+      "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
+      "dev": true,
+      "requires": {
+        "chardet": "0.4.2",
+        "iconv-lite": "0.4.21",
+        "tmp": "0.0.33"
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "dev": true,
+      "requires": {
+        "array-unique": "0.3.2",
+        "define-property": "1.0.0",
+        "expand-brackets": "2.1.4",
+        "extend-shallow": "2.0.1",
+        "fragment-cache": "0.2.1",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "extract-text-webpack-plugin": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz",
+      "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==",
+      "dev": true,
+      "requires": {
+        "async": "2.6.0",
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.3.0",
+        "webpack-sources": "1.1.0"
+      }
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+    },
+    "fast-deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+      "dev": true
+    },
+    "fastparse": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+      "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+      "dev": true
+    },
+    "faye-websocket": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+      "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+      "dev": true,
+      "requires": {
+        "websocket-driver": "0.7.0"
+      }
+    },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/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.11",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
+      "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "schema-utils": "0.4.5"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz",
+          "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1",
+            "uri-js": "3.0.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "0.4.5",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz",
+          "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.4.0",
+            "ajv-keywords": "3.1.0"
+          }
+        }
+      }
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+      "dev": true
+    },
+    "filesize": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
+      "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
+      "dev": true
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "2.0.1",
+        "is-number": "3.0.0",
+        "repeat-string": "1.6.1",
+        "to-regex-range": "2.1.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+      "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "on-finished": "2.3.0",
+        "parseurl": "1.3.2",
+        "statuses": "1.4.0",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "find-cache-dir": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz",
+      "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=",
+      "dev": true,
+      "requires": {
+        "commondir": "1.0.1",
+        "make-dir": "1.2.0",
+        "pkg-dir": "2.0.0"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "2.0.0"
+      }
+    },
+    "flat-cache": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/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"
+      }
+    },
+    "flatten": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+      "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+      "dev": true
+    },
+    "flush-write-stream": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
+      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz",
+      "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==",
+      "requires": {
+        "debug": "3.1.0"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "dev": true
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2"
+      }
+    },
+    "foreach": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+      "dev": true
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "optional": true
+    },
+    "form-data": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+      "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+      "optional": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.6",
+        "mime-types": "2.1.18"
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "dev": true
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "dev": true,
+      "requires": {
+        "map-cache": "0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "dev": true
+    },
+    "friendly-errors-webpack-plugin": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz",
+      "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "error-stack-parser": "2.0.1",
+        "string-width": "2.1.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "iferr": "0.1.5",
+        "imurmurhash": "0.1.4",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+      "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "nan": "2.10.0",
+        "node-pre-gyp": "0.6.39"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ajv": {
+          "version": "4.11.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "co": "4.6.0",
+            "json-stable-stringify": "1.0.1"
+          }
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "dev": true
+        },
+        "aproba": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "delegates": "1.0.0",
+            "readable-stream": "2.2.9"
+          }
+        },
+        "asn1": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "assert-plus": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "asynckit": {
+          "version": "0.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws-sign2": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "aws4": {
+          "version": "1.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "balanced-match": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true
+        },
+        "bcrypt-pbkdf": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "tweetnacl": "0.14.5"
+          }
+        },
+        "block-stream": {
+          "version": "0.0.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.3"
+          }
+        },
+        "boom": {
+          "version": "2.10.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "brace-expansion": {
+          "version": "1.1.7",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "balanced-match": "0.4.2",
+            "concat-map": "0.0.1"
+          }
+        },
+        "buffer-shims": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "caseless": {
+          "version": "0.12.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "co": {
+          "version": "4.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "combined-stream": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "delayed-stream": "1.0.0"
+          }
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "dev": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "cryptiles": {
+          "version": "2.0.5",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "boom": "2.10.1"
+          }
+        },
+        "dashdash": {
+          "version": "1.14.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.8",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.4.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "delayed-stream": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "ecc-jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "extend": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "extsprintf": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "forever-agent": {
+          "version": "0.6.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "form-data": {
+          "version": "2.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asynckit": "0.4.0",
+            "combined-stream": "1.0.5",
+            "mime-types": "2.1.15"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "fstream": {
+          "version": "1.0.11",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "inherits": "2.0.3",
+            "mkdirp": "0.5.1",
+            "rimraf": "2.6.1"
+          }
+        },
+        "fstream-ignore": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "fstream": "1.0.11",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4"
+          }
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aproba": "1.1.1",
+            "console-control-strings": "1.1.0",
+            "has-unicode": "2.0.1",
+            "object-assign": "4.1.1",
+            "signal-exit": "3.0.2",
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wide-align": "1.1.2"
+          }
+        },
+        "getpass": {
+          "version": "0.1.7",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "fs.realpath": "1.0.0",
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        },
+        "graceful-fs": {
+          "version": "4.1.11",
+          "bundled": true,
+          "dev": true
+        },
+        "har-schema": {
+          "version": "1.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "har-validator": {
+          "version": "4.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ajv": "4.11.8",
+            "har-schema": "1.0.5"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "hawk": {
+          "version": "3.1.3",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "boom": "2.10.1",
+            "cryptiles": "2.0.5",
+            "hoek": "2.16.3",
+            "sntp": "1.0.9"
+          }
+        },
+        "hoek": {
+          "version": "2.16.3",
+          "bundled": true,
+          "dev": true
+        },
+        "http-signature": {
+          "version": "1.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "0.2.0",
+            "jsprim": "1.4.0",
+            "sshpk": "1.13.0"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "once": "1.4.0",
+            "wrappy": "1.0.2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "dev": true
+        },
+        "ini": {
+          "version": "1.3.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "is-typedarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "dev": true
+        },
+        "isstream": {
+          "version": "0.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jodid25519": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsbn": "0.1.1"
+          }
+        },
+        "jsbn": {
+          "version": "0.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-schema": {
+          "version": "0.2.3",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "json-stable-stringify": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "jsonify": "0.0.0"
+          }
+        },
+        "json-stringify-safe": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsonify": {
+          "version": "0.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "jsprim": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "assert-plus": "1.0.0",
+            "extsprintf": "1.0.2",
+            "json-schema": "0.2.3",
+            "verror": "1.3.6"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "mime-db": {
+          "version": "1.27.0",
+          "bundled": true,
+          "dev": true
+        },
+        "mime-types": {
+          "version": "2.1.15",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "mime-db": "1.27.0"
+          }
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "brace-expansion": "1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "dev": true
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "node-pre-gyp": {
+          "version": "0.6.39",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "1.0.2",
+            "hawk": "3.1.3",
+            "mkdirp": "0.5.1",
+            "nopt": "4.0.1",
+            "npmlog": "4.1.0",
+            "rc": "1.2.1",
+            "request": "2.81.0",
+            "rimraf": "2.6.1",
+            "semver": "5.3.0",
+            "tar": "2.2.1",
+            "tar-pack": "3.4.0"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1.1.0",
+            "osenv": "0.1.4"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "1.1.4",
+            "console-control-strings": "1.1.0",
+            "gauge": "2.7.4",
+            "set-blocking": "2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "oauth-sign": {
+          "version": "0.8.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "wrappy": "1.0.2"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.4",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "1.0.2",
+            "os-tmpdir": "1.0.2"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "performance-now": {
+          "version": "0.2.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "1.0.7",
+          "bundled": true,
+          "dev": true
+        },
+        "punycode": {
+          "version": "1.4.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "qs": {
+          "version": "6.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "0.4.2",
+            "ini": "1.3.4",
+            "minimist": "1.2.0",
+            "strip-json-comments": "2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.2.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "buffer-shims": "1.0.0",
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "1.0.1",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "request": {
+          "version": "2.81.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "aws-sign2": "0.6.0",
+            "aws4": "1.6.0",
+            "caseless": "0.12.0",
+            "combined-stream": "1.0.5",
+            "extend": "3.0.1",
+            "forever-agent": "0.6.1",
+            "form-data": "2.1.4",
+            "har-validator": "4.2.1",
+            "hawk": "3.1.3",
+            "http-signature": "1.1.1",
+            "is-typedarray": "1.0.0",
+            "isstream": "0.1.2",
+            "json-stringify-safe": "5.0.1",
+            "mime-types": "2.1.15",
+            "oauth-sign": "0.8.2",
+            "performance-now": "0.2.0",
+            "qs": "6.4.0",
+            "safe-buffer": "5.0.1",
+            "stringstream": "0.0.5",
+            "tough-cookie": "2.3.2",
+            "tunnel-agent": "0.6.0",
+            "uuid": "3.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "glob": "7.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.0.1",
+          "bundled": true,
+          "dev": true
+        },
+        "semver": {
+          "version": "5.3.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "sntp": {
+          "version": "1.0.9",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "hoek": "2.16.3"
+          }
+        },
+        "sshpk": {
+          "version": "1.13.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "asn1": "0.2.3",
+            "assert-plus": "1.0.0",
+            "bcrypt-pbkdf": "1.0.1",
+            "dashdash": "1.14.1",
+            "ecc-jsbn": "0.1.1",
+            "getpass": "0.1.7",
+            "jodid25519": "1.0.2",
+            "jsbn": "0.1.1",
+            "tweetnacl": "0.14.5"
+          },
+          "dependencies": {
+            "assert-plus": {
+              "version": "1.0.0",
+              "bundled": true,
+              "dev": true,
+              "optional": true
+            }
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "string_decoder": {
+          "version": "1.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "stringstream": {
+          "version": "0.0.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "2.2.1",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "block-stream": "0.0.9",
+            "fstream": "1.0.11",
+            "inherits": "2.0.3"
+          }
+        },
+        "tar-pack": {
+          "version": "3.4.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "debug": "2.6.8",
+            "fstream": "1.0.11",
+            "fstream-ignore": "1.0.5",
+            "once": "1.4.0",
+            "readable-stream": "2.2.9",
+            "rimraf": "2.6.1",
+            "tar": "2.2.1",
+            "uid-number": "0.0.6"
+          }
+        },
+        "tough-cookie": {
+          "version": "2.3.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "punycode": "1.4.1"
+          }
+        },
+        "tunnel-agent": {
+          "version": "0.6.0",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "5.0.1"
+          }
+        },
+        "tweetnacl": {
+          "version": "0.14.5",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "uid-number": {
+          "version": "0.0.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        },
+        "uuid": {
+          "version": "3.0.1",
+          "bundled": true,
+          "dev": true,
+          "optional": true
+        },
+        "verror": {
+          "version": "1.3.6",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "extsprintf": "1.0.2"
+          }
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "string-width": "1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "dev": true
+        }
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+      "dev": true
+    },
+    "get-caller-file": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+      "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+      "dev": true
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "dev": true,
+      "requires": {
+        "glob-parent": "2.0.0",
+        "is-glob": "2.0.1"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+          "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+          "dev": true,
+          "requires": {
+            "is-glob": "2.0.1"
+          }
+        },
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          }
+        }
+      }
+    },
+    "glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "dev": true,
+      "requires": {
+        "is-glob": "3.1.0",
+        "path-dirname": "1.0.2"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        }
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+      "dev": true
+    },
+    "globby": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz",
+      "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=",
+      "dev": true,
+      "requires": {
+        "array-union": "1.0.2",
+        "dir-glob": "2.0.0",
+        "glob": "7.1.2",
+        "ignore": "3.3.7",
+        "pify": "3.0.0",
+        "slash": "1.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+    },
+    "growly": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+      "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+      "dev": true
+    },
+    "gzip-size": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz",
+      "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1",
+        "pify": "3.0.0"
+      }
+    },
+    "handle-thing": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
+      "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+      "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+      "optional": true
+    },
+    "har-validator": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+      "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+      "optional": true,
+      "requires": {
+        "ajv": "4.11.8",
+        "har-schema": "1.0.5"
+      }
+    },
+    "has": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+      "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+      "dev": true,
+      "requires": {
+        "function-bind": "1.1.1"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "dev": true,
+      "requires": {
+        "get-value": "2.0.6",
+        "has-values": "1.0.0",
+        "isobject": "3.0.1"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "hash-base": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "hash-sum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+      "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+      "dev": true
+    },
+    "hash.js": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "hawk": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+      "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+      "optional": true,
+      "requires": {
+        "boom": "2.10.1",
+        "cryptiles": "2.0.5",
+        "hoek": "2.16.3",
+        "sntp": "1.0.9"
+      }
+    },
+    "he": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+      "dev": true
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "dev": true,
+      "requires": {
+        "hash.js": "1.1.3",
+        "minimalistic-assert": "1.0.1",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "hoek": {
+      "version": "2.16.3",
+      "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+      "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
+      "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
+      "dev": true
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.6",
+        "wbuf": "1.7.3"
+      }
+    },
+    "html-comment-regex": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+      "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
+      "dev": true
+    },
+    "html-entities": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
+      "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
+      "dev": true
+    },
+    "html-minifier": {
+      "version": "3.5.15",
+      "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz",
+      "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==",
+      "dev": true,
+      "requires": {
+        "camel-case": "3.0.0",
+        "clean-css": "4.1.11",
+        "commander": "2.15.1",
+        "he": "1.1.1",
+        "param-case": "2.1.1",
+        "relateurl": "0.2.7",
+        "uglify-js": "3.3.21"
+      }
+    },
+    "html-webpack-plugin": {
+      "version": "2.30.1",
+      "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz",
+      "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=",
+      "dev": true,
+      "requires": {
+        "bluebird": "3.5.1",
+        "html-minifier": "3.5.15",
+        "loader-utils": "0.2.17",
+        "lodash": "4.17.5",
+        "pretty-error": "2.1.1",
+        "toposort": "1.0.6"
+      },
+      "dependencies": {
+        "loader-utils": {
+          "version": "0.2.17",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+          "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+          "dev": true,
+          "requires": {
+            "big.js": "3.2.0",
+            "emojis-list": "2.1.0",
+            "json5": "0.5.1",
+            "object-assign": "4.1.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
+      "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
+      "dev": true,
+      "requires": {
+        "domelementtype": "1.3.0",
+        "domhandler": "2.1.0",
+        "domutils": "1.1.6",
+        "readable-stream": "1.0.34"
+      },
+      "dependencies": {
+        "domutils": {
+          "version": "1.1.6",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz",
+          "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=",
+          "dev": true,
+          "requires": {
+            "domelementtype": "1.3.0"
+          }
+        },
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+          "dev": true
+        },
+        "readable-stream": {
+          "version": "1.0.34",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+          "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+          "dev": true,
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "0.0.1",
+            "string_decoder": "0.10.31"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+          "dev": true
+        }
+      }
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "dev": true
+    },
+    "http-errors": {
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "dev": true,
+      "requires": {
+        "depd": "1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": "1.4.0"
+      }
+    },
+    "http-parser-js": {
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.11.tgz",
+      "integrity": "sha512-QCR5O2AjjMW8Mo4HyI1ctFcv+O99j/0g367V3YoVnrNw5hkDvAWZD0lWGcc+F4yN3V55USPCVix4efb75HxFfA==",
+      "dev": true
+    },
+    "http-proxy": {
+      "version": "1.16.2",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz",
+      "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=",
+      "dev": true,
+      "requires": {
+        "eventemitter3": "1.2.0",
+        "requires-port": "1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.17.4",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz",
+      "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=",
+      "dev": true,
+      "requires": {
+        "http-proxy": "1.16.2",
+        "is-glob": "3.1.0",
+        "lodash": "4.17.5",
+        "micromatch": "2.3.11"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "1.1.0"
+          }
+        },
+        "array-unique": {
+          "version": "0.2.1",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+          "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+          "dev": true
+        },
+        "braces": {
+          "version": "1.8.5",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+          "dev": true,
+          "requires": {
+            "expand-range": "1.8.2",
+            "preserve": "0.2.0",
+            "repeat-element": "1.1.2"
+          }
+        },
+        "expand-brackets": {
+          "version": "0.1.5",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+          "dev": true,
+          "requires": {
+            "is-posix-bracket": "0.1.1"
+          }
+        },
+        "extglob": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          },
+          "dependencies": {
+            "is-extglob": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+              "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+              "dev": true
+            }
+          }
+        },
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "2.1.1"
+          }
+        },
+        "micromatch": {
+          "version": "2.3.11",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+          "dev": true,
+          "requires": {
+            "arr-diff": "2.0.0",
+            "array-unique": "0.2.1",
+            "braces": "1.8.5",
+            "expand-brackets": "0.1.5",
+            "extglob": "0.3.2",
+            "filename-regex": "2.0.1",
+            "is-extglob": "1.0.0",
+            "is-glob": "2.0.1",
+            "kind-of": "3.2.2",
+            "normalize-path": "2.1.1",
+            "object.omit": "2.0.1",
+            "parse-glob": "3.0.4",
+            "regex-cache": "0.4.4"
+          },
+          "dependencies": {
+            "is-extglob": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+              "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+              "dev": true
+            },
+            "is-glob": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+              "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "1.0.0"
+              }
+            }
+          }
+        }
+      }
+    },
+    "http-signature": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+      "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "0.2.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.14.1"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.21",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
+      "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+      "dev": true
+    },
+    "icss-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+      "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.21"
+      }
+    },
+    "ieee754": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz",
+      "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==",
+      "dev": true
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "dev": true
+    },
+    "ignore": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+      "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+      "dev": true
+    },
+    "image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+      "optional": true
+    },
+    "import-local": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
+      "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
+      "dev": true,
+      "requires": {
+        "pkg-dir": "2.0.0",
+        "resolve-cwd": "2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "dev": true
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+      "dev": true
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "inquirer": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+      "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+      "dev": true,
+      "requires": {
+        "ansi-escapes": "3.1.0",
+        "chalk": "2.4.0",
+        "cli-cursor": "2.1.0",
+        "cli-width": "2.2.0",
+        "external-editor": "2.2.0",
+        "figures": "2.0.0",
+        "lodash": "4.17.5",
+        "mute-stream": "0.0.7",
+        "run-async": "2.3.0",
+        "rx-lite": "4.0.8",
+        "rx-lite-aggregates": "4.0.8",
+        "string-width": "2.1.1",
+        "strip-ansi": "4.0.0",
+        "through": "2.3.8"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "internal-ip": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
+      "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
+      "dev": true,
+      "requires": {
+        "meow": "3.7.0"
+      }
+    },
+    "interpret": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+      "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+      "dev": true
+    },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dev": true,
+      "requires": {
+        "loose-envify": "1.3.1"
+      }
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "dev": true
+    },
+    "ipaddr.js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
+      "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
+      "dev": true
+    },
+    "is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "dev": true
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "dev": true,
+      "requires": {
+        "binary-extensions": "1.11.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-callable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+      "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
+      "dev": true
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "dev": true,
+      "requires": {
+        "is-accessor-descriptor": "0.1.6",
+        "is-data-descriptor": "0.1.4",
+        "kind-of": "5.1.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+          "dev": true
+        }
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "dev": true
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+      "dev": true
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "dev": true,
+      "requires": {
+        "is-primitive": "2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "dev": true
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
+    },
+    "is-glob": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+      "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+      "dev": true,
+      "requires": {
+        "is-extglob": "2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "is-odd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
+      "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
+      "dev": true,
+      "requires": {
+        "is-number": "4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+          "dev": true
+        }
+      }
+    },
+    "is-path-cwd": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+      "dev": true
+    },
+    "is-path-in-cwd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+      "dev": true,
+      "requires": {
+        "is-path-inside": "1.0.1"
+      }
+    },
+    "is-path-inside": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+      "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+      "dev": true,
+      "requires": {
+        "path-is-inside": "1.0.2"
+      }
+    },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+      "dev": true
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+      "dev": true
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+      "dev": true
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.1"
+      }
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "dev": true
+    },
+    "is-svg": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
+      "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+      "dev": true,
+      "requires": {
+        "html-comment-regex": "1.1.1"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+      "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
+      "dev": true
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "optional": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "optional": true
+    },
+    "js-base64": {
+      "version": "2.4.3",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz",
+      "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+      "dev": true
+    },
+    "js-yaml": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
+      "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+      "dev": true,
+      "requires": {
+        "argparse": "1.0.10",
+        "esprima": "2.7.3"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "optional": true
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+      "dev": true
+    },
+    "json-loader": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+      "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==",
+      "dev": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "optional": true
+    },
+    "json-schema-traverse": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+      "dev": true
+    },
+    "json-stable-stringify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
+      "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
+      "optional": true,
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "optional": true
+    },
+    "json3": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+      "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+      "dev": true
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+      "optional": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "killable": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz",
+      "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=",
+      "dev": true
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "dev": true,
+      "requires": {
+        "is-buffer": "1.1.6"
+      }
+    },
+    "last-call-webpack-plugin": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-2.1.2.tgz",
+      "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5",
+        "webpack-sources": "1.1.0"
+      }
+    },
+    "lazy-cache": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+      "dev": true
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "1.0.0"
+      }
+    },
+    "less": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/less/-/less-3.0.1.tgz",
+      "integrity": "sha512-qUR4uNv88/c0mpnGOULgMLRXXSD6X0tYo4cVrokzsvn68+nuj8rskInCSe2eLAVYWGD/oAlq8P7J/FeZ/euKiw==",
+      "requires": {
+        "errno": "0.1.7",
+        "graceful-fs": "4.1.11",
+        "image-size": "0.5.5",
+        "mime": "1.6.0",
+        "mkdirp": "0.5.1",
+        "promise": "7.3.1",
+        "request": "2.81.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "less-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
+      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
+      "requires": {
+        "clone": "2.1.2",
+        "loader-utils": "1.1.0",
+        "pify": "3.0.0"
+      }
+    },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2"
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "strip-bom": "3.0.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "loader-fs-cache": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz",
+      "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "0.1.1",
+        "mkdirp": "0.5.1"
+      },
+      "dependencies": {
+        "find-cache-dir": {
+          "version": "0.1.1",
+          "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+          "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+          "dev": true,
+          "requires": {
+            "commondir": "1.0.1",
+            "mkdirp": "0.5.1",
+            "pkg-dir": "1.0.0"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pkg-dir": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+          "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+          "dev": true,
+          "requires": {
+            "find-up": "1.1.2"
+          }
+        }
+      }
+    },
+    "loader-runner": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+      "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=",
+      "dev": true
+    },
+    "loader-utils": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+      "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+      "requires": {
+        "big.js": "3.2.0",
+        "emojis-list": "2.1.0",
+        "json5": "0.5.1"
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "requires": {
+        "p-locate": "2.0.0",
+        "path-exists": "3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.5",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+      "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+      "dev": true
+    },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+      "dev": true
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "dev": true
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "dev": true
+    },
+    "log-symbols": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+      "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.0"
+      }
+    },
+    "loglevel": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
+      "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
+      "dev": true
+    },
+    "longest": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+      "dev": true
+    },
+    "loose-envify": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+      "dev": true,
+      "requires": {
+        "js-tokens": "3.0.2"
+      }
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "0.4.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "lower-case": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+      "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+      "dev": true
+    },
+    "lru-cache": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
+      "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "macaddress": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz",
+      "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=",
+      "dev": true
+    },
+    "make-dir": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
+      "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "dev": true
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "dev": true,
+      "requires": {
+        "object-visit": "1.0.1"
+      }
+    },
+    "math-expression-evaluator": {
+      "version": "1.2.17",
+      "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
+      "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
+      "dev": true
+    },
+    "md5.js": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+      "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+      "dev": true,
+      "requires": {
+        "hash-base": "3.0.4",
+        "inherits": "2.0.3"
+      }
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "dev": true
+    },
+    "mem": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+      "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "2.1.0",
+        "decamelize": "1.2.0",
+        "loud-rejection": "1.6.0",
+        "map-obj": "1.0.1",
+        "minimist": "1.2.0",
+        "normalize-package-data": "2.4.0",
+        "object-assign": "4.1.1",
+        "read-pkg-up": "1.0.1",
+        "redent": "1.0.0",
+        "trim-newlines": "1.0.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "2.2.0",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "strip-bom": "2.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "1.1.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "1.1.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+          "dev": true,
+          "requires": {
+            "find-up": "1.1.2",
+            "read-pkg": "1.1.0"
+          }
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "0.2.1"
+          }
+        }
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "dev": true
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "dev": true
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "4.0.0",
+        "array-unique": "0.3.2",
+        "braces": "2.3.2",
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "extglob": "2.0.4",
+        "fragment-cache": "0.2.1",
+        "kind-of": "6.0.2",
+        "nanomatch": "1.2.9",
+        "object.pick": "1.3.0",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0"
+      }
+    },
+    "mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+    },
+    "mime-db": {
+      "version": "1.33.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
+    },
+    "mime-types": {
+      "version": "2.1.18",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+      "requires": {
+        "mime-db": "1.33.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+      "dev": true
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "dev": true
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "dev": true
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "1.1.11"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+    },
+    "mississippi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz",
+      "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==",
+      "dev": true,
+      "requires": {
+        "concat-stream": "1.6.2",
+        "duplexify": "3.5.4",
+        "end-of-stream": "1.4.1",
+        "flush-write-stream": "1.0.3",
+        "from2": "2.3.0",
+        "parallel-transform": "1.1.0",
+        "pump": "2.0.1",
+        "pumpify": "1.4.0",
+        "stream-each": "1.2.2",
+        "through2": "2.0.3"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "dev": true,
+      "requires": {
+        "for-in": "1.0.2",
+        "is-extendable": "1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "dev": true,
+          "requires": {
+            "is-plain-object": "2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "copy-concurrently": "1.0.5",
+        "fs-write-stream-atomic": "1.0.10",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2",
+        "run-queue": "1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "dev": true,
+      "requires": {
+        "dns-packet": "1.3.1",
+        "thunky": "1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "dev": true
+    },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+      "dev": true
+    },
+    "nan": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+      "dev": true,
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
+      "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+      "dev": true,
+      "requires": {
+        "arr-diff": "4.0.0",
+        "array-unique": "0.3.2",
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "fragment-cache": "0.2.1",
+        "is-odd": "2.0.0",
+        "is-windows": "1.0.2",
+        "kind-of": "6.0.2",
+        "object.pick": "1.3.0",
+        "regex-not": "1.0.2",
+        "snapdragon": "0.8.2",
+        "to-regex": "3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "dev": true
+    },
+    "negotiator": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+      "dev": true
+    },
+    "neo-async": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz",
+      "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==",
+      "dev": true
+    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+      "dev": true
+    },
+    "no-case": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+      "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+      "dev": true,
+      "requires": {
+        "lower-case": "1.1.4"
+      }
+    },
+    "node-forge": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz",
+      "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=",
+      "dev": true
+    },
+    "node-libs-browser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+      "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==",
+      "dev": true,
+      "requires": {
+        "assert": "1.4.1",
+        "browserify-zlib": "0.2.0",
+        "buffer": "4.9.1",
+        "console-browserify": "1.1.0",
+        "constants-browserify": "1.0.0",
+        "crypto-browserify": "3.12.0",
+        "domain-browser": "1.2.0",
+        "events": "1.1.1",
+        "https-browserify": "1.0.0",
+        "os-browserify": "0.3.0",
+        "path-browserify": "0.0.0",
+        "process": "0.11.10",
+        "punycode": "1.4.1",
+        "querystring-es3": "0.2.1",
+        "readable-stream": "2.3.6",
+        "stream-browserify": "2.0.1",
+        "stream-http": "2.8.1",
+        "string_decoder": "1.1.1",
+        "timers-browserify": "2.0.10",
+        "tty-browserify": "0.0.0",
+        "url": "0.11.0",
+        "util": "0.10.3",
+        "vm-browserify": "0.0.4"
+      }
+    },
+    "node-notifier": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz",
+      "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==",
+      "dev": true,
+      "requires": {
+        "growly": "1.3.0",
+        "semver": "5.5.0",
+        "shellwords": "0.1.1",
+        "which": "1.3.0"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "2.6.0",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.5.0",
+        "validate-npm-package-license": "3.0.3"
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "dev": true,
+      "requires": {
+        "remove-trailing-separator": "1.1.0"
+      }
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "dev": true
+    },
+    "normalize-url": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "prepend-http": "1.0.4",
+        "query-string": "4.3.4",
+        "sort-keys": "1.1.2"
+      }
+    },
+    "normalize-wheel": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+      "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "dev": true,
+      "requires": {
+        "path-key": "2.0.1"
+      }
+    },
+    "nth-check": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
+      "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
+      "dev": true,
+      "requires": {
+        "boolbase": "1.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "dev": true
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+      "optional": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "dev": true,
+      "requires": {
+        "copy-descriptor": "0.1.1",
+        "define-property": "0.2.5",
+        "kind-of": "3.2.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        }
+      }
+    },
+    "object-hash": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.0.tgz",
+      "integrity": "sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==",
+      "dev": true
+    },
+    "object-keys": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+      "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=",
+      "dev": true
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "dev": true,
+      "requires": {
+        "for-own": "0.1.5",
+        "is-extendable": "0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "dev": true,
+      "requires": {
+        "isobject": "3.0.1"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "dev": true
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "dev": true,
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
+      "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
+    "opener": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz",
+      "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=",
+      "dev": true
+    },
+    "opn": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+      "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+      "dev": true,
+      "requires": {
+        "is-wsl": "1.1.0"
+      }
+    },
+    "optimize-css-assets-webpack-plugin": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-3.2.0.tgz",
+      "integrity": "sha512-Fjn7wyyadPAriuH2DHamDQw5B8GohEWbroBkKoPeP+vSF2PIAPI7WDihi8WieMRb/At4q7Ea7zTKaMDuSoIAAg==",
+      "dev": true,
+      "requires": {
+        "cssnano": "3.10.0",
+        "last-call-webpack-plugin": "2.1.2"
+      }
+    },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/optionator/-/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"
+      }
+    },
+    "ora": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz",
+      "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.0",
+        "cli-cursor": "2.1.0",
+        "cli-spinners": "1.3.1",
+        "log-symbols": "2.2.0"
+      }
+    },
+    "original": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz",
+      "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=",
+      "dev": true,
+      "requires": {
+        "url-parse": "1.0.5"
+      },
+      "dependencies": {
+        "url-parse": {
+          "version": "1.0.5",
+          "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz",
+          "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=",
+          "dev": true,
+          "requires": {
+            "querystringify": "0.0.4",
+            "requires-port": "1.0.0"
+          }
+        }
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "dev": true
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+      "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
+      "dev": true,
+      "requires": {
+        "execa": "0.7.0",
+        "lcid": "1.0.0",
+        "mem": "1.1.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "dev": true
+    },
+    "p-limit": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+      "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==",
+      "dev": true,
+      "requires": {
+        "p-try": "1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "requires": {
+        "p-limit": "1.2.0"
+      }
+    },
+    "p-map": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+      "dev": true
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
+    },
+    "pagoda-ui": {
+      "version": "1.0.23",
+      "resolved": "https://registry.npmjs.org/pagoda-ui/-/pagoda-ui-1.0.23.tgz",
+      "integrity": "sha512-gnh3vKGqNfPLkMx+XijJeIg1fpLciZLqIAhrUznH9Q8vupElQHSTtb/AflCw2D++0Sds9KmQdjoFr9MULHRUkQ==",
+      "requires": {
+        "axios": "0.17.1",
+        "less": "3.0.1",
+        "less-loader": "4.1.0"
+      },
+      "dependencies": {
+        "axios": {
+          "version": "0.17.1",
+          "resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz",
+          "integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=",
+          "requires": {
+            "follow-redirects": "1.4.1",
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "pako": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
+      "dev": true
+    },
+    "parallel-transform": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz",
+      "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=",
+      "dev": true,
+      "requires": {
+        "cyclist": "0.2.2",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "param-case": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+      "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+      "dev": true,
+      "requires": {
+        "no-case": "2.3.2"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
+      "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
+      "dev": true,
+      "requires": {
+        "asn1.js": "4.10.1",
+        "browserify-aes": "1.2.0",
+        "create-hash": "1.2.0",
+        "evp_bytestokey": "1.0.3",
+        "pbkdf2": "3.0.14"
+      }
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "dev": true,
+      "requires": {
+        "glob-base": "0.3.0",
+        "is-dotfile": "1.0.3",
+        "is-extglob": "1.0.0",
+        "is-glob": "2.0.1"
+      },
+      "dependencies": {
+        "is-extglob": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+          "dev": true
+        },
+        "is-glob": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "1.0.0"
+          }
+        }
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "1.3.1"
+      }
+    },
+    "parseurl": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+      "dev": true
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "dev": true
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+      "dev": true
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+      "dev": true
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+      "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+      "dev": true,
+      "requires": {
+        "pify": "3.0.0"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.14",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
+      "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==",
+      "dev": true,
+      "requires": {
+        "create-hash": "1.2.0",
+        "create-hmac": "1.1.7",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.11"
+      }
+    },
+    "performance-now": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+      "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+      "optional": true
+    },
+    "pify": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+      "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "2.0.4"
+      }
+    },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "2.1.0"
+      }
+    },
+    "pluralize": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+      "dev": true
+    },
+    "portfinder": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz",
+      "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=",
+      "dev": true,
+      "requires": {
+        "async": "1.5.2",
+        "debug": "2.6.9",
+        "mkdirp": "0.5.1"
+      },
+      "dependencies": {
+        "async": {
+          "version": "1.5.2",
+          "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+          "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+          "dev": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "dev": true
+    },
+    "postcss": {
+      "version": "6.0.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz",
+      "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.0",
+        "source-map": "0.6.1",
+        "supports-color": "5.4.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
+      "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-message-helpers": "2.0.0",
+        "reduce-css-calc": "1.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-colormin": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
+      "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+      "dev": true,
+      "requires": {
+        "colormin": "1.1.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-convert-values": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
+      "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
+      "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
+      "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
+      "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
+      "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-discard-unused": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
+      "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-filter-plugins": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz",
+      "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "uniqid": "4.1.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-import": {
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz",
+      "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.21",
+        "postcss-value-parser": "3.3.0",
+        "read-cache": "1.0.0",
+        "resolve": "1.7.1"
+      }
+    },
+    "postcss-load-config": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
+      "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1",
+        "postcss-load-options": "1.2.0",
+        "postcss-load-plugins": "2.3.0"
+      }
+    },
+    "postcss-load-options": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
+      "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1"
+      }
+    },
+    "postcss-load-plugins": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
+      "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
+      "dev": true,
+      "requires": {
+        "cosmiconfig": "2.2.2",
+        "object-assign": "4.1.1"
+      }
+    },
+    "postcss-loader": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.4.tgz",
+      "integrity": "sha512-L2p654oK945B/gDFUGgOhh7uzj19RWoY1SVMeJVoKno1H2MdbQ0RppR/28JGju4pMb22iRC7BJ9aDzbxXSLf4A==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "postcss": "6.0.21",
+        "postcss-load-config": "1.2.0",
+        "schema-utils": "0.4.5"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz",
+          "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1",
+            "uri-js": "3.0.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "0.4.5",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz",
+          "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.4.0",
+            "ajv-keywords": "3.1.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-idents": {
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
+      "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
+      "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
+      "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+      "dev": true,
+      "requires": {
+        "browserslist": "1.7.7",
+        "caniuse-api": "1.6.1",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3",
+        "vendors": "1.0.1"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "browserslist": {
+          "version": "1.7.7",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+          "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+          "dev": true,
+          "requires": {
+            "caniuse-db": "1.0.30000830",
+            "electron-to-chromium": "1.3.42"
+          }
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-message-helpers": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+      "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=",
+      "dev": true
+    },
+    "postcss-minify-font-values": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
+      "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
+      "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
+      "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
+      "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-selector-parser": "2.2.3"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz",
+      "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=",
+      "dev": true,
+      "requires": {
+        "postcss": "6.0.21"
+      }
+    },
+    "postcss-modules-local-by-default": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+      "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+      "dev": true,
+      "requires": {
+        "css-selector-tokenizer": "0.7.0",
+        "postcss": "6.0.21"
+      }
+    },
+    "postcss-modules-scope": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+      "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+      "dev": true,
+      "requires": {
+        "css-selector-tokenizer": "0.7.0",
+        "postcss": "6.0.21"
+      }
+    },
+    "postcss-modules-values": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+      "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+      "dev": true,
+      "requires": {
+        "icss-replace-symbols": "1.1.0",
+        "postcss": "6.0.21"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
+      "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
+      "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "2.1.0",
+        "normalize-url": "1.9.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
+      "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-idents": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
+      "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
+      "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+      "dev": true,
+      "requires": {
+        "postcss": "5.2.18"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
+      "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+      "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+      "dev": true,
+      "requires": {
+        "flatten": "1.0.2",
+        "indexes-of": "1.0.1",
+        "uniq": "1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
+      "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+      "dev": true,
+      "requires": {
+        "is-svg": "2.1.0",
+        "postcss": "5.2.18",
+        "postcss-value-parser": "3.3.0",
+        "svgo": "0.7.2"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
+      "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "1.0.2",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "postcss-url": {
+      "version": "7.3.2",
+      "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz",
+      "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==",
+      "dev": true,
+      "requires": {
+        "mime": "1.6.0",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "postcss": "6.0.21",
+        "xxhashjs": "0.2.2"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+      "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
+      "dev": true
+    },
+    "postcss-zindex": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
+      "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.1",
+        "postcss": "5.2.18",
+        "uniqs": "2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "2.2.1",
+            "escape-string-regexp": "1.0.5",
+            "has-ansi": "2.0.0",
+            "strip-ansi": "3.0.1",
+            "supports-color": "2.0.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+              "dev": true
+            }
+          }
+        },
+        "has-flag": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+          "dev": true
+        },
+        "postcss": {
+          "version": "5.2.18",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+          "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+          "dev": true,
+          "requires": {
+            "chalk": "1.1.3",
+            "js-base64": "2.4.3",
+            "source-map": "0.5.7",
+            "supports-color": "3.2.3"
+          }
+        },
+        "supports-color": {
+          "version": "3.2.3",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "dev": true,
+          "requires": {
+            "has-flag": "1.0.0"
+          }
+        }
+      }
+    },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+      "dev": true
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+      "dev": true
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+      "dev": true
+    },
+    "prettier": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz",
+      "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=",
+      "dev": true
+    },
+    "pretty-error": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+      "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+      "dev": true,
+      "requires": {
+        "renderkid": "2.0.1",
+        "utila": "0.4.0"
+      }
+    },
+    "private": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+      "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+      "dev": true
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "dev": true
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
+    },
+    "progress": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+      "dev": true
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "optional": true,
+      "requires": {
+        "asap": "2.0.6"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "dev": true
+    },
+    "proxy-addr": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
+      "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
+      "dev": true,
+      "requires": {
+        "forwarded": "0.1.2",
+        "ipaddr.js": "1.6.0"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz",
+      "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.2.0",
+        "parse-asn1": "5.1.1",
+        "randombytes": "2.0.6"
+      }
+    },
+    "pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "once": "1.4.0"
+      }
+    },
+    "pumpify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
+      "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
+      "dev": true,
+      "requires": {
+        "duplexify": "3.5.4",
+        "inherits": "2.0.3",
+        "pump": "2.0.1"
+      }
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+      "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+      "optional": true
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "dev": true,
+      "requires": {
+        "object-assign": "4.1.1",
+        "strict-uri-encode": "1.1.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "dev": true
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "dev": true
+    },
+    "querystringify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz",
+      "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=",
+      "dev": true
+    },
+    "randomatic": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+      "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "kind-of": "4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "dev": true,
+          "requires": {
+            "is-buffer": "1.1.6"
+          }
+        }
+      }
+    },
+    "randombytes": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "dev": true,
+      "requires": {
+        "randombytes": "2.0.6",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "dev": true
+    },
+    "raw-body": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
+      "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+      "dev": true,
+      "requires": {
+        "bytes": "3.0.0",
+        "http-errors": "1.6.2",
+        "iconv-lite": "0.4.19",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "depd": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+          "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+          "dev": true
+        },
+        "http-errors": {
+          "version": "1.6.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+          "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+          "dev": true,
+          "requires": {
+            "depd": "1.1.1",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.0.3",
+            "statuses": "1.4.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.19",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+          "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+          "dev": true
+        },
+        "setprototypeof": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+          "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+          "dev": true
+        }
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "2.3.0"
+      },
+      "dependencies": {
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "2.0.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "2.0.0"
+      },
+      "dependencies": {
+        "path-type": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+          "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+          "dev": true,
+          "requires": {
+            "pify": "2.3.0"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "requires": {
+        "find-up": "2.1.0",
+        "read-pkg": "2.0.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.1",
+        "string_decoder": "1.1.1",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "readdirp": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+      "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "minimatch": "3.0.4",
+        "readable-stream": "2.3.6",
+        "set-immediate-shim": "1.0.1"
+      }
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dev": true,
+      "requires": {
+        "resolve": "1.7.1"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "2.1.0",
+        "strip-indent": "1.0.1"
+      }
+    },
+    "reduce-css-calc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+      "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "0.4.2",
+        "math-expression-evaluator": "1.2.17",
+        "reduce-function-call": "1.0.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+          "dev": true
+        }
+      }
+    },
+    "reduce-function-call": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
+      "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+      "dev": true,
+      "requires": {
+        "balanced-match": "0.4.2"
+      },
+      "dependencies": {
+        "balanced-match": {
+          "version": "0.4.2",
+          "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+          "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+          "dev": true
+        }
+      }
+    },
+    "regenerate": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+      "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+      "dev": true
+    },
+    "regenerator-runtime": {
+      "version": "0.11.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+    },
+    "regenerator-transform": {
+      "version": "0.10.1",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+      "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+      "dev": true,
+      "requires": {
+        "babel-runtime": "6.26.0",
+        "babel-types": "6.26.0",
+        "private": "0.1.8"
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "dev": true,
+      "requires": {
+        "is-equal-shallow": "0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2",
+        "safe-regex": "1.1.0"
+      }
+    },
+    "regexpp": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
+      "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+      "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+      "dev": true,
+      "requires": {
+        "regenerate": "1.3.3",
+        "regjsgen": "0.2.0",
+        "regjsparser": "0.1.5"
+      }
+    },
+    "regjsgen": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+      "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+      "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+      "dev": true,
+      "requires": {
+        "jsesc": "0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "dev": true
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "dev": true
+    },
+    "renderkid": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz",
+      "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=",
+      "dev": true,
+      "requires": {
+        "css-select": "1.2.0",
+        "dom-converter": "0.1.4",
+        "htmlparser2": "3.3.0",
+        "strip-ansi": "3.0.1",
+        "utila": "0.3.3"
+      },
+      "dependencies": {
+        "utila": {
+          "version": "0.3.3",
+          "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz",
+          "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=",
+          "dev": true
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+      "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "dev": true
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "request": {
+      "version": "2.81.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+      "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+      "optional": true,
+      "requires": {
+        "aws-sign2": "0.6.0",
+        "aws4": "1.7.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.6",
+        "extend": "3.0.1",
+        "forever-agent": "0.6.1",
+        "form-data": "2.1.4",
+        "har-validator": "4.2.1",
+        "hawk": "3.1.3",
+        "http-signature": "1.1.1",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.18",
+        "oauth-sign": "0.8.2",
+        "performance-now": "0.2.0",
+        "qs": "6.4.0",
+        "safe-buffer": "5.1.1",
+        "stringstream": "0.0.5",
+        "tough-cookie": "2.3.4",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-from-string": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+      "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "require-uncached": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+      "dev": true,
+      "requires": {
+        "caller-path": "0.1.0",
+        "resolve-from": "1.0.1"
+      }
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
+      "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
+      "dev": true,
+      "requires": {
+        "path-parse": "1.0.5"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "dev": true,
+      "requires": {
+        "resolve-from": "3.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+          "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+          "dev": true
+        }
+      }
+    },
+    "resolve-from": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+      "dev": true
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "dev": true
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "2.0.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+      "dev": true,
+      "requires": {
+        "align-text": "0.1.4"
+      }
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+      "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+      "dev": true,
+      "requires": {
+        "hash-base": "2.0.2",
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "hash-base": {
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+          "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.3"
+          }
+        }
+      }
+    },
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "dev": true,
+      "requires": {
+        "is-promise": "2.1.0"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0"
+      }
+    },
+    "rx-lite": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+      "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+      "dev": true
+    },
+    "rx-lite-aggregates": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+      "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+      "dev": true,
+      "requires": {
+        "rx-lite": "4.0.8"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "dev": true,
+      "requires": {
+        "ret": "0.1.15"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "dev": true
+    },
+    "schema-utils": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+      "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        }
+      }
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "dev": true
+    },
+    "selfsigned": {
+      "version": "1.10.2",
+      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz",
+      "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=",
+      "dev": true,
+      "requires": {
+        "node-forge": "0.7.1"
+      }
+    },
+    "semver": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+      "dev": true
+    },
+    "send": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+      "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "1.1.2",
+        "destroy": "1.0.4",
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "etag": "1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "1.6.3",
+        "mime": "1.4.1",
+        "ms": "2.0.0",
+        "on-finished": "2.3.0",
+        "range-parser": "1.2.0",
+        "statuses": "1.4.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "mime": {
+          "version": "1.4.1",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+          "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+          "dev": true
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz",
+      "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==",
+      "dev": true
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "dev": true,
+      "requires": {
+        "accepts": "1.3.5",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "1.0.3",
+        "http-errors": "1.6.3",
+        "mime-types": "2.1.18",
+        "parseurl": "1.3.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+      "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+      "dev": true,
+      "requires": {
+        "encodeurl": "1.0.2",
+        "escape-html": "1.0.3",
+        "parseurl": "1.3.2",
+        "send": "0.16.2"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "set-immediate-shim": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+      "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+      "dev": true
+    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "2.0.1",
+        "is-extendable": "0.1.1",
+        "is-plain-object": "2.0.4",
+        "split-string": "3.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "dev": true
+    },
+    "setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shelljs": {
+      "version": "0.7.8",
+      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz",
+      "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2",
+        "interpret": "1.1.0",
+        "rechoir": "0.6.2"
+      }
+    },
+    "shellwords": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+      "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "2.0.0"
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "dev": true,
+      "requires": {
+        "base": "0.11.2",
+        "debug": "2.6.9",
+        "define-property": "0.2.5",
+        "extend-shallow": "2.0.1",
+        "map-cache": "0.2.2",
+        "source-map": "0.5.7",
+        "source-map-resolve": "0.5.1",
+        "use": "3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "dev": true,
+      "requires": {
+        "define-property": "1.0.0",
+        "isobject": "3.0.1",
+        "snapdragon-util": "3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "1.0.2"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "sntp": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+      "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+      "optional": true,
+      "requires": {
+        "hoek": "2.16.3"
+      }
+    },
+    "sockjs": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
+      "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
+      "dev": true,
+      "requires": {
+        "faye-websocket": "0.10.0",
+        "uuid": "3.2.1"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz",
+      "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "eventsource": "0.1.6",
+        "faye-websocket": "0.11.1",
+        "inherits": "2.0.3",
+        "json3": "3.3.2",
+        "url-parse": "1.3.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "faye-websocket": {
+          "version": "0.11.1",
+          "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz",
+          "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=",
+          "dev": true,
+          "requires": {
+            "websocket-driver": "0.7.0"
+          }
+        }
+      }
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "dev": true,
+      "requires": {
+        "is-plain-obj": "1.1.0"
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
+      "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+      "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+      "dev": true,
+      "requires": {
+        "atob": "2.1.0",
+        "decode-uri-component": "0.2.0",
+        "resolve-url": "0.2.1",
+        "source-map-url": "0.4.0",
+        "urix": "0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.4.18",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+      "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+      "dev": true,
+      "requires": {
+        "source-map": "0.5.7"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+      "dev": true
+    },
+    "spdx-correct": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "3.0.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "2.1.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+      "dev": true
+    },
+    "spdy": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
+      "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "handle-thing": "1.2.5",
+        "http-deceiver": "1.2.7",
+        "safe-buffer": "5.1.1",
+        "select-hose": "2.0.0",
+        "spdy-transport": "2.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "spdy-transport": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz",
+      "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==",
+      "dev": true,
+      "requires": {
+        "debug": "2.6.9",
+        "detect-node": "2.0.3",
+        "hpack.js": "2.1.6",
+        "obuf": "1.1.2",
+        "readable-stream": "2.3.6",
+        "safe-buffer": "5.1.1",
+        "wbuf": "1.7.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "dev": true,
+      "requires": {
+        "extend-shallow": "3.0.2"
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+      "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+      "optional": true,
+      "requires": {
+        "asn1": "0.2.3",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.1",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.1",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "tweetnacl": "0.14.5"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "ssri": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
+      "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "stackframe": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz",
+      "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==",
+      "dev": true
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "dev": true,
+      "requires": {
+        "define-property": "0.2.5",
+        "object-copy": "0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "0.1.6"
+          }
+        }
+      }
+    },
+    "statuses": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+      "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+      "dev": true
+    },
+    "stream-browserify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz",
+      "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "1.4.1",
+        "stream-shift": "1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz",
+      "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==",
+      "dev": true,
+      "requires": {
+        "builtin-status-codes": "3.0.0",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.6",
+        "to-arraybuffer": "1.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+      "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+      "dev": true
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "2.0.0",
+        "strip-ansi": "4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "stringstream": {
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+      "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+      "optional": true
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "dev": true
+    },
+    "supports-color": {
+      "version": "5.4.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
+      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+      "dev": true,
+      "requires": {
+        "has-flag": "3.0.0"
+      }
+    },
+    "svgo": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
+      "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+      "dev": true,
+      "requires": {
+        "coa": "1.0.4",
+        "colors": "1.1.2",
+        "csso": "2.3.2",
+        "js-yaml": "3.7.0",
+        "mkdirp": "0.5.1",
+        "sax": "1.2.4",
+        "whet.extend": "0.9.9"
+      }
+    },
+    "table": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+      "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "ajv-keywords": "2.1.1",
+        "chalk": "2.4.0",
+        "lodash": "4.17.5",
+        "slice-ansi": "1.0.0",
+        "string-width": "2.1.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "5.5.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+          "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+          "dev": true,
+          "requires": {
+            "co": "4.6.0",
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1"
+          }
+        }
+      }
+    },
+    "tapable": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+      "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
+      "dev": true
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "dev": true
+    },
+    "throttle-debounce": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.0.1.tgz",
+      "integrity": "sha1-2tD+Ew+drzcZ/eoz3Dao5rp/MLU="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+      "dev": true
+    },
+    "through2": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6",
+        "xtend": "4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz",
+      "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=",
+      "dev": true
+    },
+    "time-stamp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz",
+      "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=",
+      "dev": true
+    },
+    "timers-browserify": {
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
+      "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+      "dev": true,
+      "requires": {
+        "setimmediate": "1.0.5"
+      }
+    },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dev": true,
+      "requires": {
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "dev": true
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+      "dev": true
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "dev": true,
+      "requires": {
+        "kind-of": "3.2.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "dev": true,
+      "requires": {
+        "define-property": "2.0.2",
+        "extend-shallow": "3.0.2",
+        "regex-not": "1.0.2",
+        "safe-regex": "1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "dev": true,
+      "requires": {
+        "is-number": "3.0.0",
+        "repeat-string": "1.6.1"
+      }
+    },
+    "toposort": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz",
+      "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=",
+      "dev": true
+    },
+    "tough-cookie": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+      "optional": true,
+      "requires": {
+        "punycode": "1.4.1"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
+    },
+    "tryer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.0.tgz",
+      "integrity": "sha1-Antp+oIyJeVRys4+8DsR9qs3wdc=",
+      "dev": true
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "dev": true
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "optional": true,
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "optional": true
+    },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "dev": true,
+      "requires": {
+        "prelude-ls": "1.1.2"
+      }
+    },
+    "type-is": {
+      "version": "1.6.16",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+      "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+      "dev": true,
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "2.1.18"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "dev": true
+    },
+    "uglify-js": {
+      "version": "3.3.21",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.21.tgz",
+      "integrity": "sha512-uy82472lH8tshK3jS3c5IFb5MmNKd/5qyBd0ih8sM42L3jWvxnE339U9gZU1zufnLVs98Stib9twq8dLm2XYCA==",
+      "dev": true,
+      "requires": {
+        "commander": "2.15.1",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "uglify-to-browserify": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+      "dev": true,
+      "optional": true
+    },
+    "uglifyjs-webpack-plugin": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz",
+      "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==",
+      "dev": true,
+      "requires": {
+        "cacache": "10.0.4",
+        "find-cache-dir": "1.0.0",
+        "schema-utils": "0.4.5",
+        "serialize-javascript": "1.5.0",
+        "source-map": "0.6.1",
+        "uglify-es": "3.3.9",
+        "webpack-sources": "1.1.0",
+        "worker-farm": "1.6.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz",
+          "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1",
+            "uri-js": "3.0.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        },
+        "commander": {
+          "version": "2.13.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz",
+          "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==",
+          "dev": true
+        },
+        "schema-utils": {
+          "version": "0.4.5",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz",
+          "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.4.0",
+            "ajv-keywords": "3.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "uglify-es": {
+          "version": "3.3.9",
+          "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz",
+          "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==",
+          "dev": true,
+          "requires": {
+            "commander": "2.13.0",
+            "source-map": "0.6.1"
+          }
+        }
+      }
+    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "dev": true,
+      "requires": {
+        "arr-union": "3.1.0",
+        "get-value": "2.0.6",
+        "is-extendable": "0.1.1",
+        "set-value": "0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "0.1.1"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-extendable": "0.1.1",
+            "is-plain-object": "2.0.4",
+            "to-object-path": "0.3.0"
+          }
+        }
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "dev": true
+    },
+    "uniqid": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
+      "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
+      "dev": true,
+      "requires": {
+        "macaddress": "0.2.8"
+      }
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "dev": true
+    },
+    "unique-filename": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz",
+      "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=",
+      "dev": true,
+      "requires": {
+        "unique-slug": "2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz",
+      "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=",
+      "dev": true,
+      "requires": {
+        "imurmurhash": "0.1.4"
+      }
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "dev": true
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "dev": true,
+      "requires": {
+        "has-value": "0.3.1",
+        "isobject": "3.0.1"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "dev": true,
+          "requires": {
+            "get-value": "2.0.6",
+            "has-values": "0.1.4",
+            "isobject": "2.1.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "dev": true,
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+          "dev": true
+        }
+      }
+    },
+    "upath": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
+      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
+      "dev": true
+    },
+    "upper-case": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+      "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+      "dev": true
+    },
+    "uri-js": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz",
+      "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=",
+      "dev": true,
+      "requires": {
+        "punycode": "2.1.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+          "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+          "dev": true
+        }
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "dev": true
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "dev": true,
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+          "dev": true
+        }
+      }
+    },
+    "url-loader": {
+      "version": "0.5.9",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz",
+      "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==",
+      "dev": true,
+      "requires": {
+        "loader-utils": "1.1.0",
+        "mime": "1.3.6"
+      },
+      "dependencies": {
+        "mime": {
+          "version": "1.3.6",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz",
+          "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=",
+          "dev": true
+        }
+      }
+    },
+    "url-parse": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.3.0.tgz",
+      "integrity": "sha512-zPvPA3T7P6M+0iNsgX+iAcAz4GshKrowtQBHHc/28tVsBc8jK7VRCNX+2GEcoE6zDB6XqXhcyiUWPVZY6C70Cg==",
+      "dev": true,
+      "requires": {
+        "querystringify": "1.0.0",
+        "requires-port": "1.0.0"
+      },
+      "dependencies": {
+        "querystringify": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz",
+          "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=",
+          "dev": true
+        }
+      }
+    },
+    "use": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
+      "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
+      "dev": true,
+      "requires": {
+        "kind-of": "6.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        }
+      }
+    },
+    "util": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.1"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "dev": true
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+      "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
+      "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "3.0.0",
+        "spdx-expression-parse": "3.0.0"
+      }
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "dev": true
+    },
+    "vendors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz",
+      "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=",
+      "dev": true
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "optional": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      },
+      "dependencies": {
+        "assert-plus": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+          "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+          "optional": true
+        }
+      }
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "dev": true,
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "vue": {
+      "version": "2.5.16",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.16.tgz",
+      "integrity": "sha512-/ffmsiVuPC8PsWcFkZngdpas19ABm5mh2wA7iDqcltyCTwlgZjHGeJYOXkBMo422iPwIcviOtrTCUpSfXmToLQ=="
+    },
+    "vue-eslint-parser": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz",
+      "integrity": "sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==",
+      "dev": true,
+      "requires": {
+        "debug": "3.1.0",
+        "eslint-scope": "3.7.1",
+        "eslint-visitor-keys": "1.0.0",
+        "espree": "3.5.4",
+        "esquery": "1.0.1",
+        "lodash": "4.17.5"
+      }
+    },
+    "vue-hot-reload-api": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz",
+      "integrity": "sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA==",
+      "dev": true
+    },
+    "vue-loader": {
+      "version": "13.7.1",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.1.tgz",
+      "integrity": "sha512-v6PbKMGl/hWHGPxB2uGHsA66vusrXF66J/h1QiFXtU6z5zVSK8jq5xl95M1p3QNXmuEJKNP3nxoXfbgQNs7hJg==",
+      "dev": true,
+      "requires": {
+        "consolidate": "0.14.5",
+        "hash-sum": "1.0.2",
+        "loader-utils": "1.1.0",
+        "lru-cache": "4.1.2",
+        "postcss": "6.0.21",
+        "postcss-load-config": "1.2.0",
+        "postcss-selector-parser": "2.2.3",
+        "prettier": "1.12.1",
+        "resolve": "1.7.1",
+        "source-map": "0.6.1",
+        "vue-hot-reload-api": "2.3.0",
+        "vue-style-loader": "3.1.2",
+        "vue-template-es2015-compiler": "1.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "vue-router": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.1.tgz",
+      "integrity": "sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w=="
+    },
+    "vue-style-loader": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz",
+      "integrity": "sha512-ICtVdK/p+qXWpdSs2alWtsXt9YnDoYjQe0w5616j9+/EhjoxZkbun34uWgsMFnC1MhrMMwaWiImz3K2jK1Yp2Q==",
+      "dev": true,
+      "requires": {
+        "hash-sum": "1.0.2",
+        "loader-utils": "1.1.0"
+      }
+    },
+    "vue-template-compiler": {
+      "version": "2.5.16",
+      "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.16.tgz",
+      "integrity": "sha512-ZbuhCcF/hTYmldoUOVcu2fcbeSAZnfzwDskGduOrnjBiIWHgELAd+R8nAtX80aZkceWDKGQ6N9/0/EUpt+l22A==",
+      "dev": true,
+      "requires": {
+        "de-indent": "1.0.2",
+        "he": "1.1.1"
+      }
+    },
+    "vue-template-es2015-compiler": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz",
+      "integrity": "sha512-x3LV3wdmmERhVCYy3quqA57NJW7F3i6faas++pJQWtknWT+n7k30F4TVdHvCLn48peTJFRvCpxs3UuFPqgeELg==",
+      "dev": true
+    },
+    "vuex": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.0.1.tgz",
+      "integrity": "sha512-wLoqz0B7DSZtgbWL1ShIBBCjv22GV5U+vcBFox658g6V0s4wZV9P4YjCNyoHSyIBpj1f29JBoNQIqD82cR4O3w=="
+    },
+    "watchpack": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz",
+      "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==",
+      "dev": true,
+      "requires": {
+        "chokidar": "2.0.3",
+        "graceful-fs": "4.1.11",
+        "neo-async": "2.5.1"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "dev": true,
+      "requires": {
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "webpack": {
+      "version": "3.11.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz",
+      "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==",
+      "dev": true,
+      "requires": {
+        "acorn": "5.5.3",
+        "acorn-dynamic-import": "2.0.2",
+        "ajv": "6.4.0",
+        "ajv-keywords": "3.1.0",
+        "async": "2.6.0",
+        "enhanced-resolve": "3.4.1",
+        "escope": "3.6.0",
+        "interpret": "1.1.0",
+        "json-loader": "0.5.7",
+        "json5": "0.5.1",
+        "loader-runner": "2.3.0",
+        "loader-utils": "1.1.0",
+        "memory-fs": "0.4.1",
+        "mkdirp": "0.5.1",
+        "node-libs-browser": "2.1.0",
+        "source-map": "0.5.7",
+        "supports-color": "4.5.0",
+        "tapable": "0.2.8",
+        "uglifyjs-webpack-plugin": "0.4.6",
+        "watchpack": "1.5.0",
+        "webpack-sources": "1.1.0",
+        "yargs": "8.0.2"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz",
+          "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "1.1.0",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.3.1",
+            "uri-js": "3.0.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz",
+          "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+          "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+          "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+          "dev": true,
+          "requires": {
+            "has-flag": "2.0.0"
+          }
+        },
+        "uglify-js": {
+          "version": "2.8.29",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-to-browserify": "1.0.2",
+            "yargs": "3.10.0"
+          },
+          "dependencies": {
+            "yargs": {
+              "version": "3.10.0",
+              "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+              "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+              "dev": true,
+              "requires": {
+                "camelcase": "1.2.1",
+                "cliui": "2.1.0",
+                "decamelize": "1.2.0",
+                "window-size": "0.1.0"
+              }
+            }
+          }
+        },
+        "uglifyjs-webpack-plugin": {
+          "version": "0.4.6",
+          "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+          "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+          "dev": true,
+          "requires": {
+            "source-map": "0.5.7",
+            "uglify-js": "2.8.29",
+            "webpack-sources": "1.1.0"
+          }
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "2.11.1",
+      "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.11.1.tgz",
+      "integrity": "sha512-VKUVkVMc6TWVXmF1OxsBXoiRjYiDRA4XT0KqtbLMDK+891VX7FCuklYwzldND8J2upUcHHnuXYNTP+4mSFi4Kg==",
+      "dev": true,
+      "requires": {
+        "acorn": "5.5.3",
+        "bfj-node4": "5.3.1",
+        "chalk": "2.4.0",
+        "commander": "2.15.1",
+        "ejs": "2.5.9",
+        "express": "4.16.3",
+        "filesize": "3.6.1",
+        "gzip-size": "4.1.0",
+        "lodash": "4.17.5",
+        "mkdirp": "0.5.1",
+        "opener": "1.4.3",
+        "ws": "4.1.0"
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "1.12.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
+      "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
+      "dev": true,
+      "requires": {
+        "memory-fs": "0.4.1",
+        "mime": "1.6.0",
+        "path-is-absolute": "1.0.1",
+        "range-parser": "1.2.0",
+        "time-stamp": "2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "2.11.2",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz",
+      "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==",
+      "dev": true,
+      "requires": {
+        "ansi-html": "0.0.7",
+        "array-includes": "3.0.3",
+        "bonjour": "3.5.0",
+        "chokidar": "2.0.3",
+        "compression": "1.7.2",
+        "connect-history-api-fallback": "1.5.0",
+        "debug": "3.1.0",
+        "del": "3.0.0",
+        "express": "4.16.3",
+        "html-entities": "1.2.1",
+        "http-proxy-middleware": "0.17.4",
+        "import-local": "1.0.0",
+        "internal-ip": "1.2.0",
+        "ip": "1.1.5",
+        "killable": "1.0.0",
+        "loglevel": "1.6.1",
+        "opn": "5.3.0",
+        "portfinder": "1.0.13",
+        "selfsigned": "1.10.2",
+        "serve-index": "1.9.1",
+        "sockjs": "0.3.19",
+        "sockjs-client": "1.1.4",
+        "spdy": "3.4.7",
+        "strip-ansi": "3.0.1",
+        "supports-color": "5.4.0",
+        "webpack-dev-middleware": "1.12.2",
+        "yargs": "6.6.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+          "dev": true,
+          "requires": {
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wrap-ansi": "2.1.0"
+          }
+        },
+        "del": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
+          "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
+          "dev": true,
+          "requires": {
+            "globby": "6.1.0",
+            "is-path-cwd": "1.0.0",
+            "is-path-in-cwd": "1.0.1",
+            "p-map": "1.2.0",
+            "pify": "3.0.0",
+            "rimraf": "2.6.2"
+          }
+        },
+        "find-up": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "dev": true,
+          "requires": {
+            "path-exists": "2.1.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "load-json-file": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+          "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "parse-json": "2.2.0",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "strip-bom": "2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "os-locale": {
+          "version": "1.4.0",
+          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+          "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+          "dev": true,
+          "requires": {
+            "lcid": "1.0.0"
+          }
+        },
+        "path-exists": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+          "dev": true,
+          "requires": {
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "path-type": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+          "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "4.1.11",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "read-pkg": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+          "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+          "dev": true,
+          "requires": {
+            "load-json-file": "1.1.0",
+            "normalize-package-data": "2.4.0",
+            "path-type": "1.1.0"
+          }
+        },
+        "read-pkg-up": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+          "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+          "dev": true,
+          "requires": {
+            "find-up": "1.1.2",
+            "read-pkg": "1.1.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        },
+        "strip-bom": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+          "dev": true,
+          "requires": {
+            "is-utf8": "0.2.1"
+          }
+        },
+        "which-module": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+          "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+          "dev": true
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        },
+        "yargs": {
+          "version": "6.6.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
+          "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0",
+            "cliui": "3.2.0",
+            "decamelize": "1.2.0",
+            "get-caller-file": "1.0.2",
+            "os-locale": "1.4.0",
+            "read-pkg-up": "1.0.1",
+            "require-directory": "2.1.1",
+            "require-main-filename": "1.0.1",
+            "set-blocking": "2.0.0",
+            "string-width": "1.0.2",
+            "which-module": "1.0.0",
+            "y18n": "3.2.1",
+            "yargs-parser": "4.2.1"
+          }
+        },
+        "yargs-parser": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+          "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+          "dev": true,
+          "requires": {
+            "camelcase": "3.0.0"
+          }
+        }
+      }
+    },
+    "webpack-merge": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz",
+      "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.5"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
+      "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==",
+      "dev": true,
+      "requires": {
+        "source-list-map": "2.0.0",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+      "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+      "dev": true,
+      "requires": {
+        "http-parser-js": "0.4.11",
+        "websocket-extensions": "0.1.3"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+      "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+      "dev": true
+    },
+    "whet.extend": {
+      "version": "0.9.9",
+      "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
+      "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=",
+      "dev": true
+    },
+    "which": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+      "dev": true,
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "dev": true
+    },
+    "window-size": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+      "dev": true
+    },
+    "wordwrap": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+      "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+      "dev": true
+    },
+    "worker-farm": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz",
+      "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==",
+      "dev": true,
+      "requires": {
+        "errno": "0.1.7"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "1.1.0",
+            "is-fullwidth-code-point": "1.0.0",
+            "strip-ansi": "3.0.1"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "write": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+      "dev": true,
+      "requires": {
+        "mkdirp": "0.5.1"
+      }
+    },
+    "ws": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz",
+      "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==",
+      "dev": true,
+      "requires": {
+        "async-limiter": "1.0.0",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+      "dev": true
+    },
+    "xxhashjs": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz",
+      "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==",
+      "dev": true,
+      "requires": {
+        "cuint": "0.2.2"
+      }
+    },
+    "y18n": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+      "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+      "dev": true,
+      "requires": {
+        "camelcase": "4.1.0",
+        "cliui": "3.2.0",
+        "decamelize": "1.2.0",
+        "get-caller-file": "1.0.2",
+        "os-locale": "2.1.0",
+        "read-pkg-up": "2.0.0",
+        "require-directory": "2.1.1",
+        "require-main-filename": "1.0.1",
+        "set-blocking": "2.0.0",
+        "string-width": "2.1.1",
+        "which-module": "2.0.0",
+        "y18n": "3.2.1",
+        "yargs-parser": "7.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        },
+        "cliui": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+          "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+          "dev": true,
+          "requires": {
+            "string-width": "1.0.2",
+            "strip-ansi": "3.0.1",
+            "wrap-ansi": "2.1.0"
+          },
+          "dependencies": {
+            "string-width": {
+              "version": "1.0.2",
+              "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+              "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+              "dev": true,
+              "requires": {
+                "code-point-at": "1.1.0",
+                "is-fullwidth-code-point": "1.0.0",
+                "strip-ansi": "3.0.1"
+              }
+            }
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "1.0.1"
+          }
+        },
+        "y18n": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+          "dev": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+      "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+      "dev": true,
+      "requires": {
+        "camelcase": "4.1.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+          "dev": true
+        }
+      }
+    }
+  }
+}
diff --git a/template/package.json b/template/package.json
index 207322b98c..288791f362 100644
--- a/template/package.json
+++ b/template/package.json
@@ -1,89 +1,34 @@
 {
-  "name": "{{ name }}",
+  "name": "purchase",
   "version": "1.0.0",
-  "description": "{{ description }}",
-  "author": "{{ author }}",
+  "description": "purchase",
+  "author": "pagoda",
   "private": true,
   "scripts": {
     "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
-    "start": "npm run dev",
-    {{#if_eq runner "jest"}}
-    "unit": "jest --config test/unit/jest.conf.js --coverage",
-    {{/if_eq}}
-    {{#if_eq runner "karma"}}
-    "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
-    {{/if_eq}}
-    {{#e2e}}
-    "e2e": "node test/e2e/runner.js",
-    {{/e2e}}
-    {{#if_or unit e2e}}
-    "test": "{{#unit}}npm run unit{{/unit}}{{#unit}}{{#e2e}} && {{/e2e}}{{/unit}}{{#e2e}}npm run e2e{{/e2e}}",
-    {{/if_or}}
-    {{#lint}}
-    "lint": "eslint --ext .js,.vue src{{#unit}} test/unit{{/unit}}{{#e2e}} test/e2e/specs{{/e2e}}",
-    {{/lint}}
-    "build": "node build/build.js"
+    "dev-mock": "cross-env NODE_MOCK=yes webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev-mock",
+    "lint": "eslint --ext .js,.vue src",
+    "build": "node build/build.js",
+    "build-dev": "cross-env NODE_TEST=yes NODE_MOCK=yes node build/build.js"
   },
   "dependencies": {
-    "vue": "^2.5.2"{{#router}},
-    "vue-router": "^3.0.1"{{/router}}
+    "axios": "^0.18.0",
+    "babel-polyfill": "^6.26.0",
+    "element-ui": "~2.3.9",
+    "file-saver": "^1.3.8",
+    "mockjs": "^1.0.1-beta3",
+    "moment": "^2.22.1",
+    "pagoda-ui": "^1.2.7",
+    "sortablejs": "^1.7.0",
+    "vue": "^2.5.2",
+    "vue-router": "^3.0.1",
+    "vuex": "^3.0.1"
   },
   "devDependencies": {
-    {{#lint}}
-    "babel-eslint": "^7.2.3",
-    "eslint": "^4.15.0",
-    "eslint-friendly-formatter": "^3.0.0",
-    "eslint-loader": "^1.7.1",
-    "eslint-plugin-vue": "^4.0.0",
-    {{#if_eq lintConfig "standard"}}
-    "eslint-config-standard": "^10.2.1",
-    "eslint-plugin-promise": "^3.4.0",
-    "eslint-plugin-standard": "^3.0.1",
-    "eslint-plugin-import": "^2.7.0",
-    "eslint-plugin-node": "^5.2.0",
-    {{/if_eq}}
-    {{#if_eq lintConfig "airbnb"}}
-    "eslint-config-airbnb-base": "^11.3.0",
-    "eslint-import-resolver-webpack": "^0.8.3",
-    "eslint-plugin-import": "^2.7.0",
-    {{/if_eq}}
-    {{/lint}}
-    {{#if_eq runner "jest"}}
-    "babel-jest": "^21.0.2",
-    "babel-plugin-dynamic-import-node": "^1.2.0",
-    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
-    "jest": "^22.0.4",
-    "jest-serializer-vue": "^0.3.0",
-    "vue-jest": "^1.0.2",
-    {{/if_eq}}
-    {{#if_eq runner "karma"}}
-    "cross-env": "^5.0.1",
-    "karma": "^1.4.1",
-    "karma-coverage": "^1.1.1",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-phantomjs-shim": "^1.4.0",
-    "karma-sinon-chai": "^1.3.1",
-    "karma-sourcemap-loader": "^0.3.7",
-    "karma-spec-reporter": "0.0.31",
-    "karma-webpack": "^2.0.2",
-    "mocha": "^3.2.0",
-    "chai": "^4.1.2",
-    "sinon": "^4.0.0",
-    "sinon-chai": "^2.8.0",
-    "inject-loader": "^3.0.0",
-    "babel-plugin-istanbul": "^4.1.1",
-    "phantomjs-prebuilt": "^2.1.14",
-    {{/if_eq}}
-    {{#e2e}}
-    "babel-register": "^6.22.0",
-    "chromedriver": "^2.27.2",
-    "cross-spawn": "^5.0.1",
-    "nightwatch": "^0.9.12",
-    "selenium-server": "^3.0.1",
-    {{/e2e}}
     "autoprefixer": "^7.1.2",
     "babel-core": "^6.22.1",
+    "babel-eslint": "^7.2.3",
     "babel-helper-vue-jsx-merge-props": "^2.0.3",
     "babel-loader": "^7.1.1",
     "babel-plugin-syntax-jsx": "^6.18.0",
@@ -93,29 +38,44 @@
     "babel-preset-stage-2": "^6.22.0",
     "chalk": "^2.0.1",
     "copy-webpack-plugin": "^4.0.1",
+    "cross-env": "^5.2.0",
     "css-loader": "^0.28.0",
+    "eslint": "^4.15.0",
+    "eslint-config-standard": "^10.2.1",
+    "eslint-friendly-formatter": "^3.0.0",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-import": "^2.7.0",
+    "eslint-plugin-node": "^5.2.0",
+    "eslint-plugin-promise": "^3.4.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-vue": "^4.0.0",
     "extract-text-webpack-plugin": "^3.0.0",
     "file-loader": "^1.1.4",
     "friendly-errors-webpack-plugin": "^1.6.1",
     "html-webpack-plugin": "^2.30.1",
-    "webpack-bundle-analyzer": "^2.9.0",
     "node-notifier": "^5.1.2",
+    "node-sass": "^4.5.3",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
     "postcss-import": "^11.0.0",
     "postcss-loader": "^2.0.8",
     "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^6.0.5",
     "semver": "^5.3.0",
     "shelljs": "^0.7.6",
-    "optimize-css-assets-webpack-plugin": "^3.2.0",
-    "ora": "^1.2.0",
-    "rimraf": "^2.6.0",
+    "style-loader": "^0.23.0",
+    "stylus": "^0.54.5",
+    "stylus-loader": "^3.0.2",
     "uglifyjs-webpack-plugin": "^1.1.1",
     "url-loader": "^0.5.8",
     "vue-loader": "^13.3.0",
     "vue-style-loader": "^3.0.1",
     "vue-template-compiler": "^2.5.2",
-    "portfinder": "^1.0.13",
     "webpack": "^3.6.0",
-    "webpack-dev-server": "^2.9.1",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.6.1",
     "webpack-merge": "^4.1.0"
   },
   "engines": {
diff --git a/template/src/App.vue b/template/src/App.vue
index 0156030e49..eec0c68d78 100644
--- a/template/src/App.vue
+++ b/template/src/App.vue
@@ -1,34 +1,199 @@
 <template>
-  <div id="app">
-    <img src="./assets/logo.png">
-    {{#router}}
-    <router-view/>
-    {{else}}
-    <HelloWorld/>
-    {{/router}}
-  </div>
-</template>
+  <pagoda-layout v-if="!$route.meta.full" logo="" title="" collapse
+                 :collapse-icon="['iconfont icon-shensuocaidan1', 'iconfont icon-shensuocaidan']" :side-menu="sideMenu"
+                 :top-menu="topMenu" :header-props="{
+      height: '50px'
+    }"
+                 :top-menu-default-active="topMenuActive" :side-menu-default-active="sideMenuActive"
+                 @tabs-change="handleTabsChange" @tabs-data-change="handleTabsDataChange"
+                 @select-side-menu="handleSelectSideMenu" @collapse-change="handleCollapseChange"
+                 @select-top-menu="handleSelectTopMenu" ref="layout" class="pagoda-layout-purchase pagoda-erp-ui-reset"
+                 v-loading="loading.fullShow">
+    <div slot="header-left" class="logo"><h3>百果园ERP</h3>
+    </div>
+    <div slot="header-right">
+      <img class="vertical-middle" :src="role.img" width="38" height="38" alt="ddd">
+      <!-- 2018-5-31 14:53:44 增加切换角色功能 -->
+      <el-dropdown @command="handleCommand" class="pointer text-blue" style="width: 80px;" trigger="click">
+			<span class="el-dropdown-link">
+          {{role.name}}<i class="el-icon-arrow-down el-icon--right"></i>
+        </span>
+        <el-dropdown-menu slot="dropdown">
+          <!-- <el-dropdown-item disabled><span class="fz12" style="margin-left: -10px;">请购单角色</span></el-dropdown-item> -->
+          <el-dropdown-item v-for="(rl, index) in roles" :key="index" :command="rl" :disabled="rl.name === role.name">
+            {{rl.name}}
+          </el-dropdown-item>
+          <!-- <el-dropdown-item disabled divided><span class="fz12" style="margin-left: -10px;">采购单角色</span></el-dropdown-item>
+            <el-dropdown-item disabled>待添加</el-dropdown-item> -->
+        </el-dropdown-menu>
+      </el-dropdown>
+    </div>
 
+    <div class="mb-10">
+		<span v-if="$route.meta.back" class="fz13 inline-block por text-green" style="top: -3px;">
+        <a class="pointer" @click="goBack()">返回上一级</a> |
+      </span>
+      <el-breadcrumb separator-class="el-icon-arrow-right" class="inline-block" v-if="breadcrumb && breadcrumb.length">
+        <el-breadcrumb-item v-for="(item, index) in breadcrumb" :class="{'is-link': item.name}" :key="index"
+                            @click.native="handleBreadcrumbChange(item.name)">{{item.label}}
+        </el-breadcrumb-item>
+      </el-breadcrumb>
+    </div>
+    <template v-if="isRouterAlive">
+      <keep-alive :include="include">
+        <router-view v-loading="loading.show" ref="routerView"></router-view>
+      </keep-alive>
+    </template>
+  </pagoda-layout>
+  <router-view v-loading="loading.fullShow" v-else></router-view>
+</template>
 <script>
-{{#unless router}}
-import HelloWorld from './components/HelloWorld'
+  /* eslint-disable */
+  import {
+    mapState,
+    mapGetters,
+    mapMutations
+  } from 'vuex'
+  // import { deepCopy } from '@/utils/utils'
+  // let subMenuUrls = []; // 存储所有二级菜单对象
+  // sideMenu.forEach(side => {
+  //  side.subMenu.forEach(sub => {
+  //    const {label, url} = sub;
+  //    subMenuUrls.push({label, url});
+  //  });
+  // });
 
-{{/unless}}
-export default {
-  name: 'App'{{#router}}{{else}},
-  components: {
-    HelloWorld
-  }{{/router}}
-}
+  export default {
+    name: "App",
+    data() {
+      return {
+        include: [], // 缓存组件的name数组
+        isRouterAlive: true // 实现reload刷新组件的方法
+      }
+    },
+    methods: {
+      ...mapMutations(['setRole', 'setTopMenuActive']),
+      handleTabsChange(param) {
+        // let meta = this.$route.meta
+        // let routeParams = this.StoreService.routeParams[param.url] || {}
+        // 如果是侧边栏或者首页才跳路由  如果是属于相同path下的详情页则不跳转
+        // console.log(this.$route.path, param.url)
+        this.$router.push(param.url)
+      },
+      handleTabsDataChange(tabs) {
+        this.include = tabs.filter(el => el.name).map(el => el.name)
+      },
+      handleCollapseChange() {
+        setTimeout(() => this.$bus.$emit('dolayout'), 300)
+      },
+      handleSelectSideMenu(data) {
+        // if (data.url === this.$route.name) {
+        //   console.log('重新刷新页面')
+        //   this.reload()
+        // }
+      },
+      handleSelectTopMenu({url}) {
+        if (url !== '/') {
+          let target = window.location.origin + url
+          window.location.href = target
+        }
+      },
+      handleBreadcrumbChange(name) {
+        name && this.$router.push({
+          name
+        })
+      },
+      handleCommand(command) { // 切换角色操作
+        this.setRole(command)
+        this.$router.replace('/')
+        this.reload()
+      },
+      reload() { // 实现reload刷新组件的方法
+        this.isRouterAlive = false
+        this.$nextTick(() => (this.isRouterAlive = true))
+      },
+      goBack() { // 2018-6-1 16:13:17 增加返回上级操作
+        let back = this.$route.meta.back
+        if (back === 'back') {
+          this.$router.back()
+        } else {
+          this.$router.push({
+            name: back
+          })
+        }
+      }
+    },
+    computed: {
+      topMenuActive() {
+        let topMenuActive = this.$route.meta.topMenu || '/'
+        this.setTopMenuActive(topMenuActive)
+        return topMenuActive
+      },
+      sideMenuActive() {
+        return this.$route.path || this.$route.meta.name || "/";
+      },
+      ...mapState(['breadcrumb', 'loading', 'roles', 'role', 'topMenu']),
+      ...mapGetters(['sideMenu', 'navNoPermission'])
+    },
+    watch: {
+      '$route'(to, from) {
+        // console.log(to);
+        this.$nextTick(() => {
+          let $layout = this.$refs.layout;
+          //记录活跃路由名称
+          if ($layout) { // layout出来之后再处理
+            // 记录路由最近一次打开的的参数
+            this.StoreService.setRouteParams(to)
+            // 路由跳转之后tab激活也跟着变化
+            if (to.name === '/') { // 首页比较特殊
+              $layout.handleSideMenuSelect({
+                label: '首页',
+                url: '/'
+              })
+            }
+            /* else {
+                                  $layout.handleSideMenuSelect({label: to.meta.name, url: to.name })
+                                }*/
+            // let len = result.length;
+            // if(len > 0) { // 取最后一个当前激活状态,如果有跳转说明tab也需要激活, 暂不需要
+            //   let {label, to} = result[len - 1] ;
+            //   to && $layout.handleSideMenuSelect({label, url: to.name});
+            // }
+            // 二级菜单里有路由name的话,说明tab也需要激活 layout已实现不需要了
+            // let activeTab = subMenuUrls.find(sub => sub.url === to.name);
+            // activeTab && $layout.handleSideMenuSelect({label: activeTab.label, url: activeTab.url});
+          }
+        });
+      }
+    }
+  };
+  /* eslint-disable */
 </script>
-
-<style>
-#app {
-  font-family: 'Avenir', Helvetica, Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  text-align: center;
-  color: #2c3e50;
-  margin-top: 60px;
-}
+<style lang="stylus">
+  .pagoda-layout-purchase
+    .collapse-icon {
+      &.icon-shensuocaidan, &.icon-shensuocaidan1 {
+        font-size 12px
+        right 2px !important
+      }
+    }
+    // 模拟面包屑可激活的状态
+    .el-breadcrumb__item.is-link
+      .el-breadcrumb__inner
+        font-weight 700
+        text-decoration: none
+        transition color .2s cubic-bezier(.645, .045, .355, 1)
+        color #303133
+        &:hover
+          color #409eff
+          cursor: pointer
+    /* 下拉角色菜单 */
+    .el-dropdown
+      line-height 16px
+    .logo
+      background-color: #002140;
+      text-align: center;
+      color: #fff;
+      h3
+        margin: 0;
 </style>
diff --git a/template/src/assets/packages/draggable/index.js b/template/src/assets/packages/draggable/index.js
new file mode 100644
index 0000000000..6494542e21
--- /dev/null
+++ b/template/src/assets/packages/draggable/index.js
@@ -0,0 +1,229 @@
+var Sortable = require('sortablejs')
+if (!Array.from) {
+  Array.from = function (object) {
+    return [].slice.call(object)
+  }
+}
+
+function buildAttribute (object, propName, value) {
+  if (value === undefined || value === 'undefined') {
+    return object
+  }
+  object = (object === null) ? {} : object
+  object[propName] = value
+  return object
+}
+
+function removeNode (node) {
+  node.parentElement.removeChild(node)
+}
+
+function insertNodeAt (fatherNode, node, position) {
+  const refNode = (position === 0) ? fatherNode.children[0] : fatherNode.children[position - 1].nextSibling
+  fatherNode.insertBefore(node, refNode)
+}
+
+// function computeVmIndex (vnodes, element) {
+//   return vnodes.map(elt => elt.elm).indexOf(element)
+// }
+
+// function computeIndexes (slots, children, isTransition) {
+//   console.log('----computeIndexes ____', slots)
+//   if (!slots) {
+//     return []
+//   }
+
+//   const elmFromNodes = slots.map(elt => elt.elm)
+//   console.log('----elmFromNodes ____', elmFromNodes)
+//   const rawIndexes = [...children].map(elt => elmFromNodes.indexOf(elt))
+//   console.log('----rawIndexes ____', rawIndexes)
+//   return isTransition ? rawIndexes.filter(ind => ind !== -1) : rawIndexes
+// }
+
+function emit (evtName, evtData) {
+  this.$nextTick(() => this.$emit(evtName.toLowerCase(), evtData))
+}
+
+function delegateAndEmit (evtName) {
+  return (evtData) => {
+    if (this.realList !== null) {
+      this['onDrag' + evtName](evtData)
+    }
+    emit.call(this, evtName, evtData)
+  }
+}
+
+const eventsListened = ['Start', 'Add', 'Remove', 'Update', 'End']
+const eventsToEmit = ['Choose', 'Sort', 'Filter', 'Clone']
+const readonlyProperties = ['Move', ...eventsListened, ...eventsToEmit].map(evt => 'on' + evt)
+
+const props = {
+  options: Object,
+  list: {
+    type: Array,
+    required: false,
+    default: null
+  },
+  value: {
+    type: Array,
+    required: false,
+    default: null
+  },
+  noTransitionOnDrag: {
+    type: Boolean,
+    default: false
+  },
+  clone: {
+    type: Function,
+    default: (original) => { return original }
+  },
+  element: {
+    type: String,
+    default: 'div'
+  },
+  move: {
+    type: Function,
+    default: null
+  },
+
+  dragSelector: {
+    type: String,
+    default: null
+  }
+}
+
+export default {
+  name: 'td-draggable',
+  props,
+  data () {
+    return {
+      transitionMode: false,
+      noneFunctionalComponentMode: false,
+      init: false
+    }
+  },
+
+  render (h) {
+    const slots = this.$slots.default
+    if (slots && slots.length === 1) {
+      const child = slots[0]
+      if (child.componentOptions && child.componentOptions.tag === 'transition-group') {
+        this.transitionMode = true
+      }
+    }
+    let children = slots
+    const { footer } = this.$slots
+    if (footer) {
+      children = slots ? [...slots, ...footer] : [...footer]
+    }
+    var attributes = null
+    const update = (name, value) => { attributes = buildAttribute(attributes, name, value) }
+    update('attrs', this.$attrs)
+
+    return h(this.element, attributes, children)
+  },
+
+  mounted () {
+    this.noneFunctionalComponentMode = this.element.toLowerCase() !== this.$el.nodeName.toLowerCase()
+
+    if (this.noneFunctionalComponentMode && this.transitionMode) {
+      throw new Error(`Transition-group inside component is not supported. Please alter element value or remove transition-group. Current element value: ${this.element}`)
+    }
+    var optionsAdded = {}
+    eventsListened.forEach(elt => {
+      optionsAdded['on' + elt] = delegateAndEmit.call(this, elt)
+    })
+
+    eventsToEmit.forEach(elt => {
+      optionsAdded['on' + elt] = emit.bind(this, elt)
+    })
+
+    const options = Object.assign({}, this.options, optionsAdded, { onMove: (evt, originalEvent) => { return this.onDragMove(evt, originalEvent) } })
+    !('draggable' in options) && (options.draggable = '>*')
+    this._sortable = new Sortable(this.rootContainer, options)
+    // this.computeIndexes()
+  },
+
+  beforeDestroy () {
+    this._sortable.destroy()
+  },
+
+  computed: {
+    rootContainer () {
+      return this.transitionMode ? this.$el.children[0] : (this.dragSelector ? this.$el.querySelector(this.dragSelector) : this.$el)
+    },
+    realList () {
+      return (this.list) ? this.list : this.value
+    }
+  },
+
+  watch: {
+    options: {
+      handler (newOptionValue) {
+        for (var property in newOptionValue) {
+          if (readonlyProperties.indexOf(property) === -1) {
+            this._sortable.option(property, newOptionValue[property])
+          }
+        }
+      },
+      deep: true
+    }
+  },
+
+  methods: {
+    getUnderlyingVm (evt) {
+      if (!evt) {
+        return null
+      }
+      let index = evt.oldIndex
+      if (typeof (index) === 'undefined' || index === -1) {
+        return null
+      }
+      const element = this.realList[index]
+      return { index, element }
+    },
+    emitChanges (evt) {
+      this.$nextTick(() => {
+        this.$emit('change', evt)
+      })
+    },
+    alterList (onList) {
+      if (this.list) {
+        onList(this.list)
+      } else {
+        const newList = [...this.value]
+        onList(newList)
+        this.$emit('input', newList)
+      }
+    },
+    spliceList () {
+      const spliceList = list => list.splice(...arguments)
+      this.alterList(spliceList)
+    },
+    updatePosition (oldIndex, newIndex) {
+      const updatePosition = list => list.splice(newIndex, 0, list.splice(oldIndex, 1)[0])
+      this.alterList(updatePosition)
+    },
+    onDragStart (evt) {
+      this.context = this.getUnderlyingVm(evt)
+      // const element = this.realList[evt.oldIndex]
+      if (this.context) {
+        evt.item._underlying_vm_ = this.clone(this.context.element)
+      }
+    },
+    onDragMove (evt) {
+      // console.log("onDragMove: ", evt)
+    },
+    onDragUpdate (evt) {
+      removeNode(evt.item)
+      insertNodeAt(evt.from, evt.item, evt.oldIndex)
+      const oldIndex = this.context.index
+      const newIndex = evt.newIndex
+      this.updatePosition(evt.oldIndex, evt.newIndex)
+      const moved = { element: this.context.element, oldIndex, newIndex }
+      this.emitChanges({ moved })
+    },
+    onDragEnd (evt) {
+    }
+  }
+}
diff --git a/template/src/assets/packages/index.js b/template/src/assets/packages/index.js
new file mode 100644
index 0000000000..cd4d9ef690
--- /dev/null
+++ b/template/src/assets/packages/index.js
@@ -0,0 +1,15 @@
+import TdDraggable from './draggable/index' // 引入表格拖拽插件
+
+const components = [
+  TdDraggable
+]
+
+const install = function (Vue, options) {
+  components.map(component => {
+    Vue.component(component.name, component)
+  })
+}
+
+export default {
+  install
+}
diff --git a/template/src/assets/stylus/animate.styl b/template/src/assets/stylus/animate.styl
new file mode 100644
index 0000000000..9df6319333
--- /dev/null
+++ b/template/src/assets/stylus/animate.styl
@@ -0,0 +1,149 @@
+// 过渡动画 横向渐变
+.fade-transverse-leave-active,
+.fade-transverse-enter-active {
+  transition: all .5s;
+}
+.fade-transverse-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+.fade-transverse-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+// 过渡动画 缩放渐变
+.fade-scale-leave-active,
+.fade-scale-enter-active {
+  transition: all .5s;
+}
+.fade-scale-enter {
+  opacity: 0;
+  transform: scale(1.2);
+}
+.fade-scale-leave-to {
+  opacity: 0;
+  transform: scale(0.8);
+}
+.animated {
+  animation-duration: 1s;
+  animation-fill-mode: both;
+}
+
+.animated.infinite {
+  animation-iteration-count: infinite;
+}
+
+.animated.hinge {
+  animation-duration: 2s;
+}
+
+.animated.flipOutX,
+.animated.flipOutY,
+.animated.bounceIn,
+.animated.bounceOut {
+  animation-duration: .75s;
+}
+
+@keyframes fadeIn {
+  from {
+    opacity: 0;
+  }
+
+  to {
+    opacity: 1;
+  }
+}
+
+.fadeIn {
+  animation-name: fadeIn;
+}
+/* shake */
+@keyframes shake {
+  from,
+  to {
+    transform: translate3d(0, 0, 0);
+  }
+
+  10%,
+  30%,
+  50%,
+  70%,
+  90% {
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  20%,
+  40%,
+  60%,
+  80% {
+    transform: translate3d(10px, 0, 0);
+  }
+}
+
+.shake {
+  animation-name: shake;
+}
+@keyframes rollIn {
+  from {
+    opacity: 0;
+    transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+  }
+
+  to {
+    opacity: 1;
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.rollIn {
+  animation-name: rollIn;
+}
+@keyframes pulse {
+  from {
+    transform: scale3d(1, 1, 1);
+  }
+
+  50% {
+    transform: scale3d(1.05, 1.05, 1.05);
+  }
+
+  to {
+    transform: scale3d(1, 1, 1);
+  }
+}
+
+.pulse {
+  animation-name: pulse;
+}
+.animated.rollIn
+  animation-duration: .75s
+/* slideIn and slideOut */
+@keyframes slideInRight {
+  from {
+    transform: translate3d(100%, 0, 0);
+    visibility: visible;
+  }
+
+  to {
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+.slideInRight {
+  animation-name: slideInRight;
+}
+@keyframes slideOutRight {
+  from {
+    transform: translate3d(0, 0, 0);
+  }
+
+  to {
+    visibility: hidden;
+    transform: translate3d(100%, 0, 0);
+  }
+}
+
+.slideOutRight {
+  animation-name: slideOutRight;
+}
diff --git a/template/src/assets/stylus/base.styl b/template/src/assets/stylus/base.styl
new file mode 100644
index 0000000000..c089606ea3
--- /dev/null
+++ b/template/src/assets/stylus/base.styl
@@ -0,0 +1,15 @@
+body
+	font-family: "Avenir", Helvetica, Arial, sans-serif;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+	color: #2c3e50;
+	margin: 0;
+	padding: 0;
+html, body
+	min-height 700px
+	min-width 1290px
+	overflow auto !important
+*, *:before, *:after
+	-moz-box-sizing: border-box;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
diff --git a/template/src/assets/stylus/common.styl b/template/src/assets/stylus/common.styl
new file mode 100644
index 0000000000..737a543aad
--- /dev/null
+++ b/template/src/assets/stylus/common.styl
@@ -0,0 +1,144 @@
+@import "./variable"
+
+.clearfix:before, .clearfix:after
+	content ""
+	display block
+	clear both
+.clearfix
+	zoom 1
+
+.flex-block
+	display flex
+
+.flex
+	flex 1
+	flex-basis auto
+
+.flex-middle
+	align-items center
+
+.left
+	float left
+.right
+	float right
+.por
+	position relative
+.poa
+	position absolute
+.mask
+	left 0
+	top 0
+	right 0
+	bottom 0
+.block
+	display block
+.inline-block
+	display inline-block
+.vertical-middle
+	vertical-align middle
+.pointer
+	cursor: pointer
+
+.center-h, .center, .txt-center, .align-center
+	text-align center
+.txt-right, .align-right, .text-right
+	text-align right
+.txt-left, .align-left, .text-left
+	text-align left
+.text-center
+	text-align center
+.text-overflow
+	text-overflow ellipsis
+	white-space nowrap
+	overflow hidden!important
+.text-wrap
+	word-wrap break-word
+	word-break break-all
+.text-clip
+	text-overflow clip
+.margin-left-10, .ml-10
+	margin-left 10px
+.margin-right-10, .mr-10
+	margin-right 10px
+
+.margin-left-20, .ml-20
+	margin-left 20px
+.margin-right-20, .mr-20
+	margin-right 20px
+
+.margin-top-10, .mt-10
+	margin-top 10px
+.margin-bottom-10, .mb-10
+	margin-bottom 10px
+
+.margin-top-20, .mt-20
+	margin-top 20px
+.margin-bottom-20, .mb-20
+	margin-bottom 20px
+
+.p0
+	padding 0!important
+.plr-15
+	padding-left 15px
+	padding-right: 15px
+.padding-left-10, .pl-10
+	padding-left 10px
+.padding-right-10, .pr-10
+	padding-right 10px
+
+.padding-left-20, .pl-20
+	padding-left 20px
+.padding-right-20, .pr-20
+	padding-right 20px
+
+.padding-top-10, .pt-10
+	padding-top 10px
+.padding-bottom-10, .pb-10
+	padding-bottom 10px
+
+.padding-top-20, .pt-20
+	padding-top 20px
+.padding-bottom-20, .pb-20
+	padding-bottom 20px
+
+.fz12
+	font-size 12px
+.fz13
+	font-size 13px
+.fz14
+	font-size 14px
+.fz16
+	font-size 16px
+
+.no-margin
+	margin 0!important
+
+.no-padding
+	padding 0!important
+
+.no-border
+	border 0!important
+/* 圆润字体 */
+.ff-consolas
+	font-family consolas
+._table-cell
+	display table-cell
+	vertical-align middle
+	word-wrap break-word
+	word-break break-all
+.text-blue
+	color $blue-color
+.text-green
+	color $green-color
+.text-danger
+	color $danger-color
+.text-gray
+	color $gray-color
+.text-warn
+	color $warning-color
+/* 表格内的工具提示默认宽高限制 */
+.table-tooltip-box
+	width 175px
+	min-height 60px
+	word-wrap break-word
+	word-break break-all
diff --git a/template/src/assets/stylus/index.styl b/template/src/assets/stylus/index.styl
new file mode 100644
index 0000000000..38c25985bb
--- /dev/null
+++ b/template/src/assets/stylus/index.styl
@@ -0,0 +1,4 @@
+//@import "./base"
+@import "./common"
+// @import "./ui-reset"
+@import "./animate"
diff --git a/template/src/assets/stylus/mixin.styl b/template/src/assets/stylus/mixin.styl
new file mode 100644
index 0000000000..319b27650c
--- /dev/null
+++ b/template/src/assets/stylus/mixin.styl
@@ -0,0 +1,106 @@
+// 背景图片地址和大小
+bis($url) {
+	background-image: url($url);
+	background-repeat: no-repeat;
+	background-size: 100% 100%;
+}
+
+borderRadius($radius) {
+	-webkit-border-radius: $radius;
+	-moz-border-radius: $radius;
+	-ms-border-radius: $radius;
+	-o-border-radius: $radius;
+	border-radius: $radius;
+}
+//定位全屏
+allcover(){
+	position:absolute;
+	top:0;
+	right:0;
+}
+
+//定位上下左右居中
+center() {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}
+
+//定位上下居中
+ct() {
+	position: absolute;
+	top: 50%;
+	transform: translateY(-50%);
+}
+
+//定位左右居中
+cl() {
+	position: absolute;
+	left: 50%;
+	transform: translateX(-50%);
+}
+
+//宽高
+wh($width, $height){
+	width: $width;
+	height: $height;
+}
+
+//字体大小,颜色
+sc($size, $color){
+	font-size: $size;
+	color: $color;
+}
+
+//flex 布局和 子元素 对其方式
+fj($type = space-between){
+	display: flex;
+	justify-content: $type;
+}
+// 给border设置颜色 配合类名使用
+bt-1($color)
+	&:after
+		border-top: 1px solid $color
+br-1($color)
+	&:after
+		border-right: 1px solid $color
+
+bb-1($color)
+	&:after
+		border-bottom: 1px solid $color
+
+bl-1($color)
+	&:after
+		border-left: 1px solid $color
+
+b-1($color = #ccc, $radius = 0px, $style = solid)
+	position: relative
+	&:after
+		content: ""
+		pointer-events: none // 解决iphone上的点击无效Bug
+		display: block
+		position: absolute
+		left: 0
+		top: 0
+		transform-origin: 0 0
+		border-radius: $radius
+		box-sizing border-box
+		width 100%
+		height 100%
+		@media (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2)
+			width: 200%
+			height: 200%
+			border-radius: $radius * 2
+			transform: scale(.5) translateZ(0)
+		@media (-webkit-min-device-pixel-ratio: 3), (min-device-pixel-ratio: 3)
+			width: 300%
+			height: 300%
+			border-radius: $radius * 3
+			transform: scale(.33) translateZ(0)
+
+border-none()
+	&:before
+		display: none
+	&:after
+		display: none
diff --git a/template/src/assets/stylus/ui-reset.styl b/template/src/assets/stylus/ui-reset.styl
new file mode 100644
index 0000000000..4e6c031027
--- /dev/null
+++ b/template/src/assets/stylus/ui-reset.styl
@@ -0,0 +1,165 @@
+@import "./variable"
+// 重置ui框架相关的样式
+.logo
+	background-color: #002140;
+	text-align: center;
+	color: #fff;
+	h3
+		margin: 0;
+.pagoda-layout__main
+	display: flex;
+	display: -webkit-flex;
+	flex-direction: column;
+
+.el
+	// &-breadcrumb
+	// 	margin-bottom: 20px;	
+	&-tree-node__content
+		height: 40px;	
+	/* form 下面表单元素统一样式 */
+	&-form
+		.el-select
+			width: 220px;	
+		.el-form-item__content
+			width: 220px;
+			// reset 时间段选择的宽度
+			.el-range-editor
+				width 100%
+				.el-range-separator
+					width: auto
+	&-input.el-input--small
+		height: 32px;
+	/* 优化弹窗样式 */
+	&-dialog
+		box-shadow $box-shadow
+		border-radius 6px
+		border 1px solid rgba(0,0,0,.2)
+		.el-dialog__headerbtn .el-dialog__close
+				font-size 23px
+	&-dialog__body
+		padding 20px
+	/* 侧边栏 */
+	&-aside .el-menu
+		border-right 0
+	/* tooltip样式 */
+	&-tooltip__popper.is-light
+		border-color #d1d1d1
+		border-radius 10px
+		box-shadow $box-shadow-2
+		opacity .9
+		&[x-placement^=top] .popper__arrow
+			border-top-color #d1d1d1
+		&[x-placement^=left] .popper__arrow
+			border-left-color #d1d1d1
+		&[x-placement^=right] .popper__arrow
+			border-right-color #d1d1d1
+		&[x-placement^=bottom] .popper__arrow
+			border-bottom-color #d1d1d1
+	/* 表格行下面的按钮样式 */
+	&-table__row
+		.el-button
+			margin 0 5px 5px 0
+	
+.grid-btns-wrapper
+	display: flex;
+	display: -webkit-flex;
+	margin-top: 20px;
+
+.cascade-select
+	width: 49%;
+	.el-select
+		width: 100%;
+
+.erp
+	&-view
+		flex: 1;
+		-webkit-box-flex: 1;
+		overflow-y: auto;
+		.el-main.erp-view-main
+			background-color: #ffffff; 
+	&-dialog-wrapper
+		display: flex;
+		display: -webkit-flex;
+		justify-content: center;
+		margin-top: 10px;
+		margin-bottom: 40px;
+		&:last-of-type
+			margin-top: 0;
+			margin-bottom: 0;
+		
+		&>table
+			border: 1px solid #ccc;
+			border-collapse: collapse;
+			td
+				padding: 2px;
+				line-height: 32px;
+				text-align: center;
+				min-width: 100px;
+	/* table表格样式 */
+	&-table.pagoda-table .el-table
+		tr td
+			font-size 13px
+			
+/* 2018-6-7 10:11:43 表单元素占的宽度太小不好编辑和显示,移入时放大 */	
+scale($width, $offset)
+	position relative
+	z-index 2
+	width $width
+	transform translateX($offset)
+.erp-table.scale .el-table
+	/* 过滤icon始终在表头上层 */
+	.table-column-filter
+		z-index 3
+	/* 表头字段悬浮展示全部 */
+	.el-table__row .cell
+		overflow visible
+		&:hover
+			.pagoda-table-edit
+				scale(200px, -25%)
+			.table-edit-input
+				scale(180px, -25%)
+	/* 行中的表单悬浮时放大 */
+	.el-table__header
+		th:hover
+			overflow visible
+			text-overflow unset
+			.cell, .table-header-content
+				overflow visible
+				text-overflow unset
+			.table-header-content
+				scale(auto, 0%)
+				
+/* table表格表头的下拉菜单 */
+.drop-down.table-filter-list
+	z-index: 9999
+
+/* 基础数据下拉组件 */
+// .pagoda-bdc-select
+// 	.el-select
+// 		.el-select__tags
+// 			& > span
+// 				position absolute
+// 				top -24px
+// 				width 215px
+// 			.el-select__input
+// 				width 175px !important
+// 		.el-select__tags-text:first-of-type
+// 			display inline-block
+// 			max-width 130px
+// 			text-overflow ellipsis
+// 			white-space nowrap
+// 			overflow hidden!important
+// 		.el-tag__close
+// 			top -6px
+// 			margin-left: -10px
+
+::-webkit-scrollbar
+	width: 6px;
+	height: 6px;
+	border-radius: 3px;
+	&-thumb
+		width: 6px;
+		border-radius: 3px;
+		background-color: #ddd; 
+		&:hover
+			background-color: #999;
diff --git a/template/src/assets/stylus/variable.styl b/template/src/assets/stylus/variable.styl
new file mode 100644
index 0000000000..a5b9436bd0
--- /dev/null
+++ b/template/src/assets/stylus/variable.styl
@@ -0,0 +1,37 @@
+//Color
+$blue-color = #409EFF;
+$green-color = #5fbeaa
+$success-color = #67C23A;
+$warning-color = #EB9E05;
+$danger-color = #FA5555;
+$gray-color = #a9a9a9
+$info-color = #878D99;
+
+//Font color
+$font-color-main = #2D2F33;
+$font-color-normal = #5A5E66;
+$font-color-sub = #878D99;
+$font-color-low = #B4BCCC;
+
+//Border color
+$border-color-main = #D8DCE5;
+$border-color-normal = #D8DCE5;
+$border-color-sub = #E6EBF5;
+$border-color-low = #EDF2FC;
+
+//Font size
+$font-size-x-large = 20px;
+$font-size-large = 18px;
+$font-size-medium = 16px;
+$font-size-small = 14px;
+$font-size-x-small = 13px;
+$font-size-xx-small = 12px;
+
+// 阴影
+$box-shadow = 0 5px 15px rgba(0,0,0,.5)
+$box-shadow-1 = 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12)
+$box-shadow-2 = 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12)
+$box-shadow-3 = 0 3px 3px -2px rgba(0,0,0,.2), 0 3px 4px 0 rgba(0,0,0,.14), 0 1px 8px 0 rgba(0,0,0,.12)
+$box-shadow-4 = 0 2px 4px -1px rgba(0,0,0,.2), 0 4px 5px 0 rgba(0,0,0,.14), 0 1px 10px 0 rgba(0,0,0,.12)
+$box-shadow-5 = 0 3px 5px -1px rgba(0,0,0,.2), 0 5px 8px 0 rgba(0,0,0,.14), 0 1px 14px 0 rgba(0,0,0,.12)
+$box-shadow-inset = inset 0 3px 1px -2px rgba(0,0,0,.2), inset 0 2px 2px 0 rgba(0,0,0,.14), inset 0 1px 5px 0 rgba(0,0,0,.12)
\ No newline at end of file
diff --git a/template/src/components/HelloWorld.vue b/template/src/components/HelloWorld.vue
deleted file mode 100644
index ce0edd8ac1..0000000000
--- a/template/src/components/HelloWorld.vue
+++ /dev/null
@@ -1,113 +0,0 @@
-<template>
-  <div class="hello">
-    <h1>\{{ msg }}</h1>
-    <h2>Essential Links</h2>
-    <ul>
-      <li>
-        <a
-          href="https://vuejs.org"
-          target="_blank"
-        >
-          Core Docs
-        </a>
-      </li>
-      <li>
-        <a
-          href="https://forum.vuejs.org"
-          target="_blank"
-        >
-          Forum
-        </a>
-      </li>
-      <li>
-        <a
-          href="https://chat.vuejs.org"
-          target="_blank"
-        >
-          Community Chat
-        </a>
-      </li>
-      <li>
-        <a
-          href="https://twitter.com/vuejs"
-          target="_blank"
-        >
-          Twitter
-        </a>
-      </li>
-      <br>
-      <li>
-        <a
-          href="http://vuejs-templates.github.io/webpack/"
-          target="_blank"
-        >
-          Docs for This Template
-        </a>
-      </li>
-    </ul>
-    <h2>Ecosystem</h2>
-    <ul>
-      <li>
-        <a
-          href="http://router.vuejs.org/"
-          target="_blank"
-        >
-          vue-router
-        </a>
-      </li>
-      <li>
-        <a
-          href="http://vuex.vuejs.org/"
-          target="_blank"
-        >
-          vuex
-        </a>
-      </li>
-      <li>
-        <a
-          href="http://vue-loader.vuejs.org/"
-          target="_blank"
-        >
-          vue-loader
-        </a>
-      </li>
-      <li>
-        <a
-          href="https://github.com/vuejs/awesome-vue"
-          target="_blank"
-        >
-          awesome-vue
-        </a>
-      </li>
-    </ul>
-  </div>
-</template>
-
-<script>
-export default {
-  name: 'HelloWorld',
-  data () {
-    return {
-      msg: 'Welcome to Your Vue.js App'
-    }
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped>
-h1, h2 {
-  font-weight: normal;
-}
-ul {
-  list-style-type: none;
-  padding: 0;
-}
-li {
-  display: inline-block;
-  margin: 0 10px;
-}
-a {
-  color: #42b983;
-}
-</style>
diff --git a/template/src/components/advanced-search-groups.vue b/template/src/components/advanced-search-groups.vue
new file mode 100644
index 0000000000..6aa0c4ab13
--- /dev/null
+++ b/template/src/components/advanced-search-groups.vue
@@ -0,0 +1,271 @@
+<template>
+  <div class="advanced-search-groups">
+    <el-card v-if="isEdit">
+      <div>
+        分组内容:
+        <el-input
+          style="width: 400px;"
+          class="vertical-middle"
+          type="textarea"
+          :rows="4"
+          resize="none"
+          v-model="editGroup.value">
+        </el-input>
+      </div>
+      <div class="mt-10">
+        分组名称:
+        <el-input
+          style="width: auto;"
+          v-model="editGroup.title">
+        </el-input>
+        <pagoda-row-btns class="row-btns_pl mt-10" :btns="editGroupBtns" :visibles="['save']" :scope="editGroup"></pagoda-row-btns>
+        <div class="fz12 text-gray">使用英文标点 ; 分割,如(11;22;33)【仅保存在浏览器缓存中,更换浏览器需重新导入或新增】</div>
+      </div>
+    </el-card>
+    <h3 style="margin-bottom: 0;">分组快速筛选
+      <div class="inline-block ml-20">
+        <el-upload
+          class="upload-demo inline-block"
+          ref="upload"
+          action="none"
+          :file-list="fileList"
+          :on-change="uploadChange"
+          :show-file-list="false"
+          :auto-upload="false">
+          <el-button slot="trigger" size="small">导入</el-button>
+        </el-upload>
+        <pagoda-row-btns class="inline-block ml-10" :btns="importBtns" :visibles="['export']"></pagoda-row-btns>
+      </div>
+    </h3>
+    <pagoda-table
+      class="mt-10"
+      :request="request"
+      selection-column="single"
+      @selection-change="handleSelectChange"
+      ref="selectTable"
+      max-height="300"
+    >
+      <template slot-scope="scope" slot="value">
+        <el-tooltip popper-class="table-tooltip-box" :content="scope.row.value" placement="top" effect="light">
+          <div class="text-overflow fz12">{{scope.row.value}}</div>
+        </el-tooltip>
+      </template>
+      <template slot-scope="scope" slot="operate">
+        <pagoda-row-btns class="text-center" :btns="groupBtns" :visibles="['edit', 'del']" :scope="scope"></pagoda-row-btns>
+      </template>
+    </pagoda-table>
+    <pagoda-row-btns class="text-center mt-20" :btns="rowBtnsTmpl" :visibles="btnVisibles"></pagoda-row-btns>
+  </div>
+</template>
+
+<script>
+import FileSaver from 'file-saver'
+import { formatDate } from '@/utils/utils'
+export default {
+  name: 'advanced-search-groups',
+  data () {
+    return {
+      rowBtnsTmpl: {
+        confirm: {
+          type: 'primary',
+          text: '确定',
+          onClick: () => {
+            this.$emit('confirm', this.cleanValue2Array(this.editGroup.value))
+          }
+        },
+        cancel: {
+          text: '取消',
+          onClick: () => {
+            this.$emit('cancel')
+          }
+        }
+      },
+      /* 分组筛选相关 start */
+      groups: this.getGroupByStorage(),
+      editGroup: {value: ''}, // 新增和编辑时需要的对象
+      isEdit: true,
+      selectIndex: null,
+      groupBtns: {
+        edit: {
+          type: 'primary',
+          text: '编辑',
+          props: {
+            size: 'mini'
+          },
+          onClick: this.handleEditRow
+        },
+        del: {
+          text: '删除',
+          type: 'danger',
+          props: {
+            size: 'mini'
+          },
+          confirm: '确定删除吗?',
+          onClick: (btns, scope) => {
+            this.$refs.selectTable.delRows([scope.row.$index])
+            this.updateGroup()
+            this.initSelect()
+          }
+        }
+      },
+      editGroupBtns: {
+        save: {
+          type: 'success',
+          text: '保存',
+          onClick: (btns, scope) => {
+            let editGroup = this.editGroup
+            // 分组名称
+            if (!editGroup.title) {
+              this.$message.error('请填写分组名称')
+              return
+            }
+            if (!editGroup.value) {
+              this.$message.error('请填写分组内容')
+              return
+            }
+            let selectGroup = this.groups[editGroup.index] // 原来修改前的数据
+            if (this.groups.length === 0 || editGroup.title !== selectGroup.title) {
+              this.$refs.selectTable.newRows([editGroup])
+              editGroup.index = this.groups.length
+              this.setCurrentRow(this.groups.length)
+            } else {
+              selectGroup.value = this.cleanValue2Array(editGroup.value).join(';')
+              selectGroup.title = editGroup.title
+            }
+            this.updateGroup()
+          }
+        },
+        cancel: {
+          text: '取消',
+          type: 'text',
+          onClick: (btns, scope) => {
+          }
+        }
+      },
+      importBtns: {
+        // import: {
+        //   text: '导入',
+        //   tooltip: '仅支持从该处导出的文件',
+        //   onClick: (btns, scope) => {
+        //     console.log('导入')
+        //   }
+        // },
+        export: {
+          text: '导出',
+          tooltip: '备份分组数据,用于下次导入',
+          onClick: (btns, scope) => {
+            console.log('导出')
+            if (this.groups.length <= 0) {
+              this.$message.warning('暂无数据可导出')
+              return
+            }
+            let blob = new Blob([JSON.stringify(this.groups)], {type: 'text/plain;charset=utf-8'})
+            FileSaver.saveAs(blob, `分组数据信息${formatDate()}.txt`)
+          }
+        }
+      },
+      /* 导入导出 */
+      fileList: []
+    }
+  },
+  props: {
+    title: String,
+    rowBtns: Object,
+    btnVisibles: {
+      type: Array,
+      default: () => {
+        return ['confirm', 'cancel']
+      }
+    }
+  },
+  created () {
+    if (this.rowBtns) {
+      this.rowBtnsTmpl = this.this.rowBtns
+    }
+  },
+  mounted () {
+    this.initSelect()
+  },
+  methods: {
+    request (tableFilterData) {
+      return new Promise(resolve => {
+        resolve({
+          head: [
+            {label: '分组名称', prop: 'title'},
+            {label: '分组内容', prop: 'value'},
+            {label: '操作', prop: 'operate'}
+          ],
+          data: this.groups
+        })
+      })
+    },
+    getGroupByStorage () {
+      // console.log(JSON.parse(localStorage.getItem('pagoda_group_data') || []) || [])
+      return JSON.parse(localStorage.getItem('pagoda_group_data')) || []
+    },
+    initSelect () {
+      if (this.groups.length !== 0) {
+        setTimeout(() => {
+          this.handleSelectChange([Object.assign(this.groups[0], {$index: 0})])
+        }, 0)
+      } else {
+        this.selectIndex = null
+        this.editGroup = {value: ''}
+      }
+    },
+    handleSelectChange (selection) {
+      this.handleEditRow({}, {row: selection[0]})
+    },
+    setCurrentRow (rowIndex) { // 单选时设置某行为选中状态
+      this.$refs.selectTable.setCurrentRow(rowIndex)
+      this.selectIndex = rowIndex
+    },
+    handleEditRow (btns, scope) {
+      this.editGroup = {
+        title: scope.row.title,
+        value: scope.row.value,
+        index: scope.row.$index,
+        action: 'edit'
+      }
+      this.setCurrentRow(scope.row.$index)
+    },
+    updateGroup () { // 外部数组和表格数组实时同步
+      this.groups = this.$refs.selectTable.getTableData()
+      localStorage.setItem('pagoda_group_data', JSON.stringify(this.groups))
+    },
+    /* 导入导出 */
+    uploadChange (file, fileList) {
+      console.log(file, fileList)
+      let reader = new FileReader()
+      // 将文件以文本形式读入页面
+      reader.readAsText(file.raw, 'gb2312')
+      reader.onload = (e) => {
+        let fileText = e.target.result
+        let fileGroup = JSON.parse(fileText)
+        this.$refs.upload.clearFiles()
+        // 以分组名称title为唯一标识,只追加新的title
+        let titleArr = this.groups.map(group => group.title)
+        let appendArr = fileGroup.filter(group => titleArr.indexOf(group.title) === -1)
+        this.$refs.selectTable.newRows(appendArr)
+        this.updateGroup()
+        if (appendArr.length === this.groups.length) { // 如果原来没数据直接导入就默认选中第一个
+          this.initSelect()
+        }
+      }
+    },
+    /* 工具类方法 */
+    cleanValue2Array (value) {
+      return value.split(';').map(el => el.trim()).filter(el => !!el)
+    }
+  },
+  computed: {
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+.advanced-search-groups
+  .row-btns_pl
+    padding-left: 73px
+</style>
diff --git a/template/src/components/index.js b/template/src/components/index.js
new file mode 100644
index 0000000000..4b482f6e9c
--- /dev/null
+++ b/template/src/components/index.js
@@ -0,0 +1,11 @@
+import tableComponents from "./table";
+import advancedSearchGroups from "./advanced-search-groups";
+
+const install = Vue => {
+	Vue.use(tableComponents);
+	Vue.component(advancedSearchGroups.name, advancedSearchGroups);
+};
+
+export default {
+	install
+};
diff --git a/template/src/components/input-range.vue b/template/src/components/input-range.vue
new file mode 100644
index 0000000000..866d3845b0
--- /dev/null
+++ b/template/src/components/input-range.vue
@@ -0,0 +1,103 @@
+<template>
+  <div
+    class="pagoda-input-range"
+    :class="{
+      'pagoda-input-range--focus': isFocus
+    }">
+    <el-input
+      :value="value[0]"
+      :clearable="false"
+      @input="$emit('input', [arguments[0], value[1]])"
+      @focus="focus('startInput')"
+      @blur="blur('startInput')">
+    </el-input>
+    <span class="range-separator">{{rangeSeparator}}</span>
+    <el-input
+      :value="value[1]"
+      :clearable="false"
+      @input="$emit('input', [value[0], arguments[0]])"
+      @focus="focus('endInput')"
+      @blur="blur('endInput')">
+    </el-input>
+    <span class="el-input__suffix el-input__suffix-loading" @click="$emit('input', [])" v-if="clearable">
+      <span class="el-input__suffix-inner">
+        <i class="el-select__caret el-input__icon el-icon-circle-close"></i>
+      </span>
+    </span>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'input-range',
+  data () {
+    return {
+      startInputFocus: false,
+      endInputFocus: false,
+      isFocus: false
+    }
+  },
+  props: {
+    value: {
+      type: null,
+      default: []
+    },
+    rangeSeparator: {
+      type: String,
+      default: '至'
+    },
+    clearable: {
+      type: Boolean,
+      default: true
+    }
+  },
+  created () {
+  },
+  mounted () {
+  },
+  watch: {
+  },
+  methods: {
+    focus (Input) {
+      this[`${Input}Focus`] = true
+      this.isFocus = true
+    },
+    blur (Input) {
+      this[`${Input}Focus`] = false
+
+      this.$nextTick(() => {
+        if (!this.startInputFocus && !this.endInputFocus) {
+          this.isFocus = false
+        }
+      })
+    }
+  },
+  computed: {
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+  .pagoda-input-range
+    border 1px solid #dcdfe6
+    border-radius 4px
+
+    &--focus
+      border-color #00C587
+    &:hover
+      .el-icon-circle-close
+        display block
+
+    .el-input
+      width 90px
+      input
+        border none
+    .range-separator
+      vertical-align middle
+      font-size 12px
+    .el-icon-circle-close
+      display none
+      line-height normal
+      cursor pointer
+</style>
diff --git a/template/src/components/table/index.js b/template/src/components/table/index.js
new file mode 100644
index 0000000000..f72f812a1e
--- /dev/null
+++ b/template/src/components/table/index.js
@@ -0,0 +1,16 @@
+import simpleTable from './simple-table'
+import simpleTableSort from './simple-table-sort'
+
+let components = {
+  simpleTable,
+  simpleTableSort
+}
+
+const install = Vue => {
+  for (const component of Object.values(components)) {
+    Vue.component(component.name, component)
+  }
+}
+export default {
+  install
+}
diff --git a/template/src/components/table/simple-table-sort.vue b/template/src/components/table/simple-table-sort.vue
new file mode 100644
index 0000000000..63ff7b3e17
--- /dev/null
+++ b/template/src/components/table/simple-table-sort.vue
@@ -0,0 +1,62 @@
+<template>
+<td-draggable element="div" :list="$attrs.data" dragSelector="tbody" :options="{draggable: '.el-table__row'}">
+	<simple-table v-on="$listeners" v-bind="$attrs" :head-data="handleHeadData">
+		<template slot="index" slot-scope="scope">
+        <div>
+          <span class="mr-10">{{scope.row.index + 1}}</span>
+          <span class="text-green ff-consolas right" v-if="scope.row.index !== scope.$index"
+            :class="{'text-green': !getIsUp(scope), 'text-danger': getIsUp(scope)}"
+          >
+            {{getIsUp(scope) ? '↑' : '↓'}}
+            {{Math.abs(scope.$index - scope.row.index)}}
+          </span>
+        </div>
+      </template>
+		<template :slot="prop" slot-scope="scope" v-for="(value, prop) in $scopedSlots">
+        <slot :name="prop" v-bind="scope"></slot>
+      </template>
+	</simple-table>
+</td-draggable>
+</template>
+
+<script>
+import Vue from 'vue'
+import vuePlugIn from '@/assets/packages'
+import {
+	deepCopy
+} from '../../utils/utils'
+Vue.use(vuePlugIn) // 2018-5-29 10:02:58 测试拖拽表格
+export default {
+	name: 'simple-table-sort', // 带排序功能的简单表格
+	data() {
+		this.$attrs.data.forEach((row, index) => {
+			row.index = index
+		})
+		return {
+			templateData: deepCopy(this.$attrs.data),
+			handleHeadData: [{
+				label: '序号',
+				prop: 'index'
+			}, ...this.$attrs['head-data']]
+		}
+	},
+	props: {},
+	created() {},
+	mounted() {},
+	watch: {},
+	methods: {
+		getIsUp(scope) {
+			return scope.row.index > scope.$index
+		},
+		cancel() { // 对外提供一个数据复原的功能
+			this.$attrs.data.splice(0, this.$attrs.data.length) // 清空数组
+			this.$attrs.data.push(...this.templateData)
+		}
+	},
+	computed: {}
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+</style>
diff --git a/template/src/components/table/simple-table.vue b/template/src/components/table/simple-table.vue
new file mode 100644
index 0000000000..8b591b4733
--- /dev/null
+++ b/template/src/components/table/simple-table.vue
@@ -0,0 +1,43 @@
+<template>
+<el-table :data="data" v-on="$listeners" v-bind="$attrs" class="simple-table">
+	<el-table-column v-bind="head.props" v-on="head.on" :key="index" v-for="(head, index) in headData" :label="head.label" :prop="head.prop" :width="head.width">
+		<template slot-scope="scope">
+        <template v-if="!$scopedSlots[head.prop]" class="cell-content">{{scope.row[head.prop]}}</template>
+		<slot v-else :name="head.prop" v-bind="scope"></slot>
+		</template>
+	</el-table-column>
+</el-table>
+</template>
+
+<script>
+export default {
+	name: 'simple-table', // 封装数组驱动完成基本功能的表格
+	data() {
+		return {}
+	},
+	props: {
+		data: Array,
+		headData: Array
+	},
+	created() {
+		// this.$options.components.simpleTable = simpleTable
+	},
+	mounted() {
+		// console.log(this.$scopedSlots)
+	},
+	watch: {},
+	methods: {},
+	computed: {}
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+.simple-table
+  .cell
+    font-size 13px
+  .el-table th>.cell
+    font-size 14px
+  .el-table__footer-wrapper tbody td
+    background-color oldlace
+</style>
diff --git a/template/src/main.js b/template/src/main.js
index 48833b5ab7..8ca9f213b0 100644
--- a/template/src/main.js
+++ b/template/src/main.js
@@ -1,26 +1,92 @@
-{{#if_eq build "standalone"}}
 // The Vue build version to load with the `import` command
 // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
-{{/if_eq}}
+import 'babel-polyfill'
 import Vue from 'vue'
 import App from './App'
-{{#router}}
+import store from './store'
 import router from './router'
-{{/router}}
+import utils from './utils/index'
+import viewConfig from './table-config/index'
+import services from '@/services'
+import ElementUI from 'element-ui'
+// 新ui引入后旧版的样式可以不引人
+// import 'element-ui/lib/theme-chalk/index.css'
+import pagodaComponents from 'pagoda-ui'
+import commonComponents from 'components'
+import inputRange from '@/components/input-range'
+// 2018-5-7 11:13:59 新增mock本地开发调试
+import 'mock-data'
+// 引入公用样式
+import '@/assets/stylus/index.styl'
+
+// 引入主题和样式重置的ui
+import 'pagoda-ui/src/style/reset.styl'
+import 'pagoda-ui/src/components/erp/element-ui-reset.scss'
+
+
+pagodaComponents.rowBtns.config = {
+  default: {
+    type: 'info',
+    props: {
+      plain: true
+    }
+  },
+  '查询': {
+    type: 'primary'
+  },
+  '保存': {
+    type: 'primary'
+  }
+}
+
+pagodaComponents.formGroup.registerComponents({
+  'bdc-select': {
+    component: pagodaComponents.bdcSelect
+  },
+  'input-range': {
+    component: inputRange
+  }
+})
+
+pagodaComponents.editItem.registerComponents({
+  'remark': {
+    component: pagodaComponents.remarkCell,
+    validateEvent: 'change', // 设置默认触发校验事件
+    getDefaultProps () { // 设置默认props
+      return {
+        editable: false
+      } // 设置默认props
+    }
+  },
+  'bdc-select': {
+    component: pagodaComponents.bdcSelect
+  }
+})
+
+pagodaComponents.tableEditItem.registerComponents({
+  'bdc-select': {
+    component: pagodaComponents.bdcSelect
+  }
+})
+
+Vue.use(utils) // http 请求相关
+Vue.use(services) // 公用业务逻辑service 请求相关
+Vue.use(ElementUI, { size: 'mini' })
+pagodaComponents.erpTable.redirectUrl = 'xxx' // 登录超时,跳转单点登录链接
+pagodaComponents.erpForm.projectName = pagodaComponents.erpTable.projectName = 'erp_store' // project名称
+pagodaComponents.bdcSelect.redirectUrl = 'xxx' // 登录超时,跳转单点登录链接
+Vue.use(pagodaComponents)
+Vue.use(commonComponents) // 公用的组件
 
 Vue.config.productionTip = false
 
+Vue.prototype.$viewConfig = viewConfig
+
 /* eslint-disable no-new */
 new Vue({
   el: '#app',
-  {{#router}}
   router,
-  {{/router}}
-  {{#if_eq build "runtime"}}
-  render: h => h(App)
-  {{/if_eq}}
-  {{#if_eq build "standalone"}}
+  store,
   components: { App },
   template: '<App/>'
-  {{/if_eq}}
 })
diff --git a/template/src/mixins/formSearchCommon.js b/template/src/mixins/formSearchCommon.js
new file mode 100644
index 0000000000..7e07456927
--- /dev/null
+++ b/template/src/mixins/formSearchCommon.js
@@ -0,0 +1,27 @@
+import formGroupBtns from "@/views/common/form-group-btns";
+import {formLabelWidth} from "@/utils/default-setting";
+// 表单筛选默认数据
+export default {
+	data() {
+		return {
+			formLabelWidth
+		};
+	},
+	components: {
+		formGroupBtns // 筛选组件
+	},
+	methods: {
+		/* 按钮组业务逻辑 start */
+		// 有些操作不能在编辑状态下执行,需要先提示用户保存再给提交
+		handleOperate(cb, ids, tips) {
+			if (ids.length === 0) {
+				this.$alert(`请至少选择一条要进行操作的数据`);
+				return;
+			}
+			this.$confirm(tips).then(() => {
+				cb();
+			});
+		}
+		/* 按钮组业务逻辑 end */
+	}
+};
diff --git a/template/src/mockData/base/detail.js b/template/src/mockData/base/detail.js
new file mode 100644
index 0000000000..f1c1a13b59
--- /dev/null
+++ b/template/src/mockData/base/detail.js
@@ -0,0 +1,167 @@
+// 表头
+const tableHead = {
+  resultCode: 0,
+  head: [
+    {
+      name: 'a1',
+      nameCN: '序号',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      'canQuery': true,
+      'constraint': '',
+      'constraintParams': '',
+      'constraintParamsExtra': '',
+      'defaultValue': '',
+      'displayLen': 64,
+      'enumerationType': false,
+      'fixed': '',
+      'formSize': '',
+      'format': '',
+      'metaId': '',
+      'name': 'goodsName',
+      'nameCN': '商品名称',
+      'nameEN': 'goodsName',
+      'pageTotal': false,
+      'persistent': true,
+      'readOnly': false,
+      'required': true,
+      'scene': '',
+      'sensitive': true,
+      'sortable': false,
+      'tag': '',
+      'total': false,
+      'type': '枚举',
+      'visible': true
+    },
+    {
+      name: 'a3',
+      nameCN: '商品代码',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a4',
+      nameCN: '等级',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a5',
+      nameCN: '规格',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a6',
+      nameCN: '基本单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseNum',
+      nameCN: '请购数量',
+      visible: true,
+      type: '整型',
+      required: true,
+      canQuery: false
+    },
+    {
+      name: 'danjia',
+      nameCN: '库存单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseAmount',
+      nameCN: '请购金额',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'arrivalDate',
+      nameCN: '应到货日期',
+      visible: true,
+      readOnly: false,
+      canQuery: false,
+      type: '日期'
+    },
+    {
+      name: 'a10',
+      nameCN: '备注',
+      visible: true,
+      canQuery: false
+    }
+  ],
+  tableMultiSelect: true
+}
+
+// table内容
+const tableData = {
+  resultCode: 0,
+  data: {
+    content: [
+      {
+        id: '123',
+        a1: 1,
+        goodsName: '',
+        a3: '',
+        a4: '',
+        a5: '',
+        a6: '',
+        reqPurchaseNum: '',
+        danjia: '',
+        reqPurchaseAmount: '',
+        arrivalDate: '',
+        a10: '我是备注'
+      }
+    ]
+  }
+}
+
+export default [
+  // head 头数据
+  {
+    url: /\/base\/metadata\/addDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/base\/addService\/findBy/,
+    type: 'post',
+    data: tableData
+  },
+  // head 头数据
+  {
+    url: /\/base\/metadata\/editDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/base\/editService\/findBy/,
+    type: 'post',
+    data: tableData
+  },
+  // head 头数据
+  {
+    url: /\/base\/metadata\/detailDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/base\/detailService\/findBy/,
+    type: 'post',
+    data: tableData
+  }
+]
diff --git a/template/src/mockData/base/handle.js b/template/src/mockData/base/handle.js
new file mode 100644
index 0000000000..fc904e416c
--- /dev/null
+++ b/template/src/mockData/base/handle.js
@@ -0,0 +1,153 @@
+// 表头
+const tableHead = {
+  resultCode: 0,
+  head: [
+    {
+      name: 'a1',
+      nameCN: '序号',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      'canQuery': true,
+      'constraint': '',
+      'constraintParams': '',
+      'constraintParamsExtra': '',
+      'defaultValue': '',
+      'displayLen': 64,
+      'enumerationType': false,
+      'fixed': '',
+      'formSize': '',
+      'format': '',
+      'metaId': '',
+      'name': 'goodsName',
+      'nameCN': '商品名称',
+      'nameEN': 'goodsName',
+      'pageTotal': false,
+      'persistent': true,
+      'readOnly': true,
+      'required': true,
+      'scene': '',
+      'sensitive': true,
+      'sortable': false,
+      'tag': '',
+      'total': false,
+      'type': '枚举',
+      'visible': true
+    },
+    {
+      name: 'a3',
+      nameCN: '商品代码',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a4',
+      nameCN: '等级',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a5',
+      nameCN: '规格',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a6',
+      nameCN: '基本单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseNum',
+      nameCN: '请购数量',
+      visible: true,
+      type: '整型',
+      required: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'danjia',
+      nameCN: '库存单价',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'confirmNum',
+      nameCN: '确认数量',
+      visible: true,
+      type: '整型',
+      required: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseAmount',
+      nameCN: '请购金额',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'arrivalDate',
+      nameCN: '应到货日期',
+      visible: true,
+      readOnly: true,
+      canQuery: false,
+      type: '日期'
+    },
+    {
+      name: 'a10',
+      nameCN: '备注',
+      visible: true,
+      canQuery: false
+    }
+  ],
+  tableMultiSelect: true
+}
+
+// table内容
+const tableData = {
+  resultCode: 0,
+  data: {
+    content: [
+      {
+        id: '123',
+        a1: 1,
+        goodsName: 'a级东方红苹果(大)',
+        a3: '10103311',
+        a4: 'a级',
+        a5: '800',
+        a6: 'kg',
+        reqPurchaseNum: '500',
+        danjia: '6.8',
+        confirmNum: 400,
+        reqPurchaseAmount: 3400,
+        arrivalDate: '2018-05-01',
+        a10: '我是备注'
+      }
+    ]
+  }
+}
+
+export default [
+  // head 头数据
+  {
+    url: /\/base\/metadata\/handleDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/base\/handleService\/findBy/,
+    type: 'post',
+    data: tableData
+  }
+]
diff --git a/template/src/mockData/base/index.js b/template/src/mockData/base/index.js
new file mode 100644
index 0000000000..06d78f402b
--- /dev/null
+++ b/template/src/mockData/base/index.js
@@ -0,0 +1,9 @@
+import listdata from './list'
+import detaildata from './detail'
+import handledata from './handle'
+
+export default [
+  ...listdata,
+  ...detaildata,
+  ...handledata
+]
diff --git a/template/src/mockData/base/list.js b/template/src/mockData/base/list.js
new file mode 100644
index 0000000000..f466f48a40
--- /dev/null
+++ b/template/src/mockData/base/list.js
@@ -0,0 +1,129 @@
+// 表头
+const tableHead = {
+  resultCode: 0,
+  head: [
+    {
+      name: '序号',
+      nameCN: '序号',
+      visible: true,
+      canQuery: true
+    }, {
+      name: 'XX单号',
+      nameCN: 'XX单号',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: 'XX金额',
+      nameCN: 'XX金额',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: 'XX数量',
+      nameCN: 'XX数量',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: '重量',
+      nameCN: '重量',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: '税率',
+      nameCN: '税率',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: '备注',
+      nameCN: '备注',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: '最后修改人',
+      nameCN: '最后修改人',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }, {
+      name: '最后修改时间',
+      nameCN: '最后修改时间',
+      visible: true,
+      canQuery: true,
+      sortable: true
+    }
+  ],
+  tableMultiSelect: true
+}
+
+// table内容
+const tableData = {
+  resultCode: 0,
+  data: {
+    'number': 0,
+    numberOfElements: 3,
+    totalElements: 3,
+    'total': 3,
+    'last': true,
+    'size': 0,
+    'totalPages': 1,
+    'first': true,
+    pageable: {
+      offset: 0,
+      pageNumber: 0,
+      pageSize: 10
+    },
+    content: [
+      {
+        '序号': 1,
+        'XX单号': 'QG2018050112001034',
+        'XX金额': '10.2000',
+        'XX数量': '12.50',
+        '重量': '5.00',
+        '税率': '5%',
+        '备注': '我是备注我是备注我是备注我是备注',
+        '最后修改人': '管理员',
+        '最后修改时间': '2018-01-08 07:28:11'
+      }, {
+        '序号': 2,
+        'XX单号': '',
+        'XX金额': '靠右对齐',
+        'XX数量': '靠右对齐',
+        '重量': '靠右对齐',
+        '税率': '靠右对齐',
+        '备注': '',
+        '最后修改人': '',
+        '最后修改时间': ''
+      }, {
+        '序号': 3,
+        'XX单号': '一般根据单据代码规则自动生成。',
+        'XX金额': '前端显示保留4位小数,后端保存10位小数四舍五入每个功能做系统参数配置',
+        'XX数量': '根据商品的计量单位校验是否需要保留小数。如果保留小数,前端显示保留2位小数,后端保存2位小数。件数、个数为整数,公斤可保留小数。',
+        '重量': '如果保留小数,前端显示保留2位小数,后端保存2位小数。',
+        '税率': '靠右对齐',
+        '备注': '内容超出列宽,截短用省略号…形式展示,鼠标移中再显示完整信息。Config文件统一为200字符',
+        '最后修改人': '管理员',
+        '最后修改时间': '2018-01-08 07:28:11'
+      }
+    ]
+  }
+}
+
+export default [
+  // head 头数据
+  {
+    url: /\/base\/metadata\/listDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 请购单列表行数据
+  {
+    url: /\/base\/listService\/findBy/,
+    type: 'post',
+    data: tableData
+  }
+]
diff --git a/template/src/mockData/classifyMenu.json b/template/src/mockData/classifyMenu.json
new file mode 100644
index 0000000000..cbf0837559
--- /dev/null
+++ b/template/src/mockData/classifyMenu.json
@@ -0,0 +1,40 @@
+[
+	{
+		"label": "一级 1",
+		"key": "1",
+		"children": [
+			{
+				"label": "二级 1-1",
+				"key": "1-1",
+				"children": [
+					{
+						"label": "三级 1-1-1",
+						"key": "1-1-1"
+					},
+					{
+						"label": "三级 1-1-2",
+						"key": "1-1-2"
+					}
+				]
+			},
+			{
+				"label": "二级 1-2",
+				"key": "1-2",
+				"children": [
+					{
+						"label": "三级 2-1",
+						"key": "1-2-1"
+					},
+					{
+						"label": "三级 2-2",
+						"key": "1-2-2"
+					}
+				]
+			}
+		]
+	},
+	{
+		"label": "一级 2",
+		"key": "2"
+	}
+]
\ No newline at end of file
diff --git a/template/src/mockData/common/demo.js b/template/src/mockData/common/demo.js
new file mode 100644
index 0000000000..59fde5a312
--- /dev/null
+++ b/template/src/mockData/common/demo.js
@@ -0,0 +1,199 @@
+// 表头
+const tableHead = {
+  resultCode: 0,
+  head: [
+    {
+      name: 'a1',
+      nameCN: '序号',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      'canQuery': true,
+      'constraint': '',
+      'constraintParams': '',
+      'constraintParamsExtra': '',
+      'defaultValue': '',
+      'displayLen': 64,
+      'enumerationType': false,
+      'fixed': '',
+      'formSize': '',
+      'format': '',
+      'metaId': '',
+      'name': 'goodsName',
+      'nameCN': '商品名称',
+      'nameEN': 'goodsName',
+      'pageTotal': false,
+      'persistent': true,
+      'readOnly': false,
+      'required': true,
+      'scene': '',
+      'sensitive': true,
+      'sortable': false,
+      'tag': '',
+      'total': false,
+      'type': '枚举',
+      'visible': true
+    },
+    {
+      name: 'a3',
+      nameCN: '商品代码',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a4',
+      nameCN: '等级',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a5',
+      nameCN: '规格',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'a6',
+      nameCN: '基本单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseNum',
+      nameCN: '请购数量',
+      visible: true,
+      type: '整型',
+      required: true,
+      canQuery: false
+    },
+    {
+      name: 'danjia',
+      nameCN: '库存单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'reqPurchaseAmount',
+      nameCN: '请购金额',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    },
+    {
+      name: 'arrivalDate',
+      nameCN: '应到货日期',
+      visible: true,
+      readOnly: false,
+      canQuery: false,
+      type: '日期'
+    },
+    {
+      name: 'a10',
+      nameCN: '备注',
+      visible: true,
+      canQuery: false
+    },
+    {
+      name: 'a11',
+      nameCN: '转采购数量',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a12',
+      nameCN: '采购订单号',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a13',
+      nameCN: '转调拨数量',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a14',
+      nameCN: '内部调拨单号',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a15',
+      nameCN: '未发货数量',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a16',
+      nameCN: '折扣方式',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    },
+    {
+      name: 'a17',
+      nameCN: '折扣额度',
+      visible: true,
+      canQuery: false,
+      readOnly: true
+    }
+  ],
+  tableMultiSelect: true
+}
+
+// table内容
+const tableData = {
+  resultCode: 0,
+  data: {
+    content: [
+      {
+        id: '123',
+        a1: 1,
+        goodsName: '',
+        a3: '',
+        a4: '',
+        a5: '',
+        a6: '',
+        reqPurchaseNum: '',
+        danjia: '',
+        reqPurchaseAmount: '',
+        arrivalDate: '',
+        a10: '',
+        a11: '',
+        a12: '',
+        a13: '',
+        a14: '',
+        a15: '',
+        a16: '',
+        a17: ''
+      }
+    ]
+  }
+}
+
+export default [
+  // head 头数据
+  {
+    url: /\/login\/metadata\/demoDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/login\/demoService\/findBy/,
+    type: 'post',
+    data: tableData
+  }
+]
diff --git a/template/src/mockData/common/food.json b/template/src/mockData/common/food.json
new file mode 100644
index 0000000000..e73adcfd9c
--- /dev/null
+++ b/template/src/mockData/common/food.json
@@ -0,0 +1,224 @@
+{
+  "data": [{
+    "code": "100021",
+    "name": "B级-青苹果(中)",
+    "typeCode": "10117",
+    "typeName": "青苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100022",
+    "name": "B级-青苹果(小)",
+    "typeCode": "10117",
+    "typeName": "青苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100041",
+    "name": "招牌-东方红苹果(大)",
+    "typeCode": "10101",
+    "typeName": "东方红苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100042",
+    "name": "招牌-东方红苹果(中)",
+    "typeCode": "10101",
+    "typeName": "东方红苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100043",
+    "name": "招牌-东方红苹果(小)",
+    "typeCode": "10101",
+    "typeName": "东方红苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100051",
+    "name": "B级-红将军苹果(大)",
+    "typeCode": "10102",
+    "typeName": "红将军苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100052",
+    "name": "B级-红将军苹果(中)",
+    "typeCode": "10102",
+    "typeName": "红将军苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100053",
+    "name": "B级-红将军苹果(小)",
+    "typeCode": "10102",
+    "typeName": "红将军苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100063",
+    "name": "C级-水晶富士",
+    "typeCode": "10103",
+    "typeName": "水晶富士",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100071",
+    "name": "A级-红玫瑰苹果(大)",
+    "typeCode": "10106",
+    "typeName": "红玫瑰苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100072",
+    "name": "A级-红玫瑰苹果(中)",
+    "typeCode": "10106",
+    "typeName": "红玫瑰苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100073",
+    "name": "A级-红玫瑰苹果(小)",
+    "typeCode": "10106",
+    "typeName": "红玫瑰苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100074",
+    "name": "A级-樱桃小苹果(3个装)",
+    "typeCode": "10121",
+    "typeName": "樱桃小苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "tiao",
+    "saleUnitCode": "tiao",
+    "invUnitCodeHan": "条",
+    "purUnitCodeHan": "条",
+    "saleUnitCodeHan": "条"
+  }, {
+    "code": "100075",
+    "name": "A级-樱桃小苹果(4个装)",
+    "typeCode": "10121",
+    "typeName": "樱桃小苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "tiao",
+    "saleUnitCode": "tiao",
+    "invUnitCodeHan": "条",
+    "purUnitCodeHan": "条",
+    "saleUnitCodeHan": "条"
+  }, {
+    "code": "100076",
+    "name": "A级-樱桃小苹果(5个装)",
+    "typeCode": "10121",
+    "typeName": "樱桃小苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "tiao",
+    "saleUnitCode": "tiao",
+    "invUnitCodeHan": "条",
+    "purUnitCodeHan": "条",
+    "saleUnitCodeHan": "条"
+  }, {
+    "code": "100077",
+    "name": "A级-樱桃小苹果(6个装)",
+    "typeCode": "10121",
+    "typeName": "樱桃小苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "tiao",
+    "saleUnitCode": "tiao",
+    "invUnitCodeHan": "条",
+    "purUnitCodeHan": "条",
+    "saleUnitCodeHan": "条"
+  }, {
+    "code": "100078",
+    "name": "A级-樱桃小苹果(2个装)",
+    "typeCode": "10121",
+    "typeName": "樱桃小苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "tiao",
+    "saleUnitCode": "tiao",
+    "invUnitCodeHan": "条",
+    "purUnitCodeHan": "条",
+    "saleUnitCodeHan": "条"
+  }, {
+    "code": "100122",
+    "name": "B级-阿克苏苹果(中)",
+    "typeCode": "10104",
+    "typeName": "阿克苏苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }, {
+    "code": "100126",
+    "name": "B级-阿克苏苹果(礼盒)",
+    "typeCode": "10104",
+    "typeName": "阿克苏苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "he",
+    "saleUnitCode": "he",
+    "invUnitCodeHan": "盒",
+    "purUnitCodeHan": "盒",
+    "saleUnitCodeHan": "盒"
+  }, {
+    "code": "100131",
+    "name": "A级-红旗坡蜜心富士(大)",
+    "typeCode": "10104",
+    "typeName": "阿克苏苹果",
+    "topTypeCode": "1",
+    "purUnitCode": "kg",
+    "saleUnitCode": "kg",
+    "invUnitCodeHan": "公斤",
+    "purUnitCodeHan": "公斤",
+    "saleUnitCodeHan": "公斤"
+  }],
+  "resultCode": 0
+}
\ No newline at end of file
diff --git a/template/src/mockData/common/goodsdetail.js b/template/src/mockData/common/goodsdetail.js
new file mode 100644
index 0000000000..771b2318d3
--- /dev/null
+++ b/template/src/mockData/common/goodsdetail.js
@@ -0,0 +1,125 @@
+// 表头
+const tableHead = {
+  resultCode: 0,
+  head: [
+    {
+      name: 'a1',
+      nameCN: '商品代码',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a2',
+      nameCN: '商品名称',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a3',
+      nameCN: '等级',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a4',
+      nameCN: '规格',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a5',
+      nameCN: '基本单位',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a6',
+      nameCN: '需求数量',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a7',
+      nameCN: '请购数量',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a8',
+      nameCN: '库存单价',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a9',
+      nameCN: '需求金额',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a10',
+      nameCN: '应到货日期',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }, {
+      name: 'a11',
+      nameCN: '备注',
+      visible: true,
+      readOnly: true,
+      canQuery: false
+    }
+  ],
+  tableMultiSelect: true
+}
+
+// table内容
+const tableData = {
+  resultCode: 0,
+  data: {
+    content: [
+      {
+        id: '11',
+        a1: 10103311,
+        a2: 'a级东方红苹果(大)',
+        a3: 'a级',
+        a4: '800',
+        a5: 'kg',
+        a6: '400',
+        a7: '500',
+        a8: '6.8',
+        a9: '3400',
+        a10: '2018-05-01',
+        a11: 'test'
+      }, {
+        id: '11',
+        a1: 10103311,
+        a2: 'a级东方红苹果(大)',
+        a3: 'a级',
+        a4: '800',
+        a5: 'kg',
+        a6: '400',
+        a7: '500',
+        a8: '6.8',
+        a9: '3400',
+        a10: '2018-05-01',
+        a11: 'test'
+      }
+    ]
+  }
+}
+
+export default [
+  // head 头数据
+  {
+    url: /\/order\/metadata\/goods_detailDTO/,
+    type: 'get',
+    data: tableHead
+  },
+  // body 行数据
+  {
+    url: /\/order\/goods_detailService\/findBy/,
+    type: 'post',
+    data: tableData
+  }
+]
diff --git a/template/src/mockData/common/index.js b/template/src/mockData/common/index.js
new file mode 100644
index 0000000000..99d58cc4b8
--- /dev/null
+++ b/template/src/mockData/common/index.js
@@ -0,0 +1,38 @@
+import goodsdetail from './goodsdetail' // 商品详情
+import demo from './demo' // 商品详情
+export default [
+  // 公用head 头数据
+  // {
+  //   url: /undefined(.)*DTO/,
+  //   type: 'get',
+  //   data: require('../common/table-head-json').default
+  // },
+  // // 公用body 行数据
+  // {
+  //   url: /undefined(.)*findBy/,
+  //   type: 'post',
+  //   data: require('../common/table-body-json').default
+  // },
+  // 公用商品名称数据
+  {
+    url: /order\/tb_req_orderService\/goods\/list/,
+    type: 'get',
+    data: require('../common/food.json')
+  },
+  // 2018-5-31 15:59:33 状态options 未提交 待审核 请购完成 已作废
+  {
+    url: /\/mock\/get_status/,
+    type: 'get',
+    data: {
+      resultCode: 0,
+      data: [
+        {name: '未提交'},
+        {name: '待审核'},
+        {name: '请购完成'},
+        {name: '已作废'}
+      ]
+    }
+  },
+  ...goodsdetail,
+  ...demo
+]
diff --git a/template/src/mockData/common/table-body-json.js b/template/src/mockData/common/table-body-json.js
new file mode 100644
index 0000000000..7948df4002
--- /dev/null
+++ b/template/src/mockData/common/table-body-json.js
@@ -0,0 +1,147 @@
+export default {
+  'data': {
+    'number': 0,
+    'total': 9,
+    'numberOfElements': 9,
+    'last': true,
+    'size': 0,
+    'totalPages': 1,
+    'first': true,
+    'content': [{
+      'lastModifiedAt': '2018-04-13 14:38:19',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'enabled': true,
+      'createdAt': '2018-04-13 14:38:19',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'goodsCode': '102',
+      'id': 1,
+      'goodsName': '苹果'
+    }, {
+      'lastModifiedAt': '2018-04-13 14:41:56',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'enabled': true,
+      'createdAt': '2018-04-13 14:41:56',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'goodsCode': '102',
+      'id': 2,
+      'goodsName': '苹果'
+    }, {
+      'reqPurchaseNum': 123,
+      'lastModifiedAt': '2018-04-13 15:55:58',
+      'level': 10,
+      'goodsCategoryLink': '',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '',
+      'reqOrderCode': 'o1523606060661',
+      'remark': '12',
+      'enabled': true,
+      'spec': 10,
+      'creatorOrgCode': '',
+      'createdAt': '2018-04-13 15:55:58',
+      'unit': 10,
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'reqOrderId': 4,
+      'goodsCode': '100051',
+      'id': 21,
+      'modifierOrgCode': '',
+      'goodsName': 'B级-红将军苹果(大)',
+      'reqPurchaseAmount': 1230
+    }, {
+      'reqPurchaseNum': 12,
+      'lastModifiedAt': '2018-04-13 15:55:58',
+      'level': 10,
+      'goodsCategoryLink': '',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '',
+      'reqOrderCode': 'o1523606060661',
+      'remark': '1',
+      'enabled': true,
+      'spec': 10,
+      'creatorOrgCode': '',
+      'createdAt': '2018-04-13 15:55:58',
+      'unit': 10,
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'reqOrderId': 4,
+      'goodsCode': '100051',
+      'id': 22,
+      'modifierOrgCode': '',
+      'goodsName': 'B级-红将军苹果(大)',
+      'reqPurchaseAmount': 120
+    }, {
+      'reqPurchaseNum': 12,
+      'lastModifiedAt': '2018-04-13 16:27:13',
+      'level': 10,
+      'goodsCategoryLink': '',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '',
+      'reqOrderCode': 'o1523607490540',
+      'remark': '1',
+      'enabled': true,
+      'spec': 10,
+      'creatorOrgCode': '',
+      'createdAt': '2018-04-13 16:27:13',
+      'unit': 10,
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'reqOrderId': 6,
+      'goodsCode': '100021',
+      'id': 23,
+      'modifierOrgCode': '',
+      'goodsName': 'B级-青苹果(中)',
+      'reqPurchaseAmount': 120
+    }, {
+      'lastModifiedAt': '2018-04-19 16:39:35',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'enabled': true,
+      'createdAt': '2018-04-19 16:39:35',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'goodsCode': '102',
+      'id': 29,
+      'goodsName': '苹果'
+    }, {
+      'lastModifiedAt': '2018-04-19 17:03:17',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'enabled': true,
+      'createdAt': '2018-04-19 17:03:17',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'goodsCode': '102',
+      'id': 39,
+      'goodsName': '苹果'
+    }, {
+      'lastModifiedAt': '2018-04-25 15:29:35',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'reqOrderCode': '001',
+      'enabled': true,
+      'createdAt': '2018-04-25 15:29:35',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'reqOrderId': 1,
+      'goodsCode': '10222',
+      'id': 42
+    }, {
+      'lastModifiedAt': '2018-04-25 15:29:44',
+      'lastModifiedBy': 'unknown_user',
+      'goodsCategory': '10102',
+      'enabled': true,
+      'createdAt': '2018-04-25 15:29:44',
+      'deleted': false,
+      'createdBy': 'unknown_user',
+      'goodsCode': '102',
+      'id': 43,
+      'goodsName': '苹果'
+    }],
+    'totalElements': 9
+  },
+  'resultCode': 0
+}
diff --git a/template/src/mockData/common/table-head-json.js b/template/src/mockData/common/table-head-json.js
new file mode 100644
index 0000000000..90fbf05834
--- /dev/null
+++ b/template/src/mockData/common/table-head-json.js
@@ -0,0 +1,572 @@
+export default {
+  'head': [{
+    'canQuery': false, // 是否能查询
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'id', // 标题key
+    'nameCN': '主键id', // 标题value
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true, // 是否只读
+    'required': true, // 是否必须
+    'scene': '',
+    'sensitive': false,
+    'sortable': false, // 是否可排序
+    'tag': '',
+    'total': false,
+    'type': 'integer', // 字段类型
+    'visible': false
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'deleted',
+    'nameCN': '软删除标记',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'boolean',
+    'visible': false
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'enabled',
+    'nameCN': '是否启用',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': false,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'boolean',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'createdAt',
+    'nameCN': '创建时间',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'datetime',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'createdBy',
+    'nameCN': '创建人',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'string',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'creatorOrgCode',
+    'nameCN': '创建人所属部门',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'string',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'lastModifiedAt',
+    'nameCN': '最近修改时间',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'datetime',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'lastModifiedBy',
+    'nameCN': '最近修改人',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'string',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': -1,
+    'metaId': '',
+    'name': 'modifierOrgCode',
+    'nameCN': '修改人所属部门',
+    'nameEN': '',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': 'string',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 64,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'goodsCode',
+    'nameCN': '商品代码',
+    'nameEN': 'goodsCode',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': true,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '字符串',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': 'md_goods',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 64,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'goodsName',
+    'nameCN': '商品名称',
+    'nameEN': 'goodsName',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': false,
+    'required': true,
+    'scene': '',
+    'sensitive': true,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '枚举',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 64,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'goodsCategory',
+    'nameCN': '商品品类',
+    'nameEN': 'goodsCategory',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': true,
+    'sortable': true,
+    'tag': '',
+    'total': false,
+    'type': '字符串',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 5000,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'goodsCategoryLink',
+    'nameCN': '商品品类链',
+    'nameEN': 'goodsCategoryLink',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': true,
+    'sortable': true,
+    'tag': '',
+    'total': false,
+    'type': '字符串',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 4,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'level',
+    'nameCN': '等级',
+    'nameEN': 'level',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': true,
+    'tag': '',
+    'total': false,
+    'type': '整型',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 4,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'spec',
+    'nameCN': '规格',
+    'nameEN': 'spec',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '整型',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 4,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'unit',
+    'nameCN': '单位',
+    'nameEN': 'unit',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '整型',
+    'visible': true
+  }, {
+    'canQuery': false,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 255,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'remark',
+    'nameCN': '备注',
+    'nameEN': 'remark',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': false,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '字符串',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'reqOrderId',
+    'nameCN': '请购单id',
+    'nameEN': 'reqOrderId',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '长整型',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 64,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'reqOrderCode',
+    'nameCN': '请购单code',
+    'nameEN': 'reqOrderCode',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '字符串',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '11.2',
+    'index': 0,
+    'metaId': '',
+    'name': 'reqPurchaseAmount',
+    'nameCN': '请购金额',
+    'nameEN': 'reqPurchaseAmount',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': true,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '整数钱',
+    'visible': true
+  }, {
+    'canQuery': true,
+    'constraint': '',
+    'constraintParams': '',
+    'constraintParamsExtra': '',
+    'defaultValue': '',
+    'displayLen': 1,
+    'enumerationType': false,
+    'fixed': '',
+    'formSize': '',
+    'format': '',
+    'index': 0,
+    'metaId': '',
+    'name': 'reqPurchaseNum',
+    'nameCN': '请购数量',
+    'nameEN': 'reqPurchaseNum',
+    'pageTotal': false,
+    'persistent': true,
+    'readOnly': false,
+    'required': true,
+    'scene': '',
+    'sensitive': false,
+    'sortable': false,
+    'tag': '',
+    'total': false,
+    'type': '整型',
+    'visible': true
+  }],
+  'tableMultiSelect': true, // 是否能多选
+  'requestUrl': '/order/com.pagoda.order.api.tb_req_goodsService/findBy'
+}
diff --git a/template/src/mockData/index.js b/template/src/mockData/index.js
new file mode 100644
index 0000000000..19dbd924b3
--- /dev/null
+++ b/template/src/mockData/index.js
@@ -0,0 +1,25 @@
+import Mock from 'mockjs'
+// 一些正则匹配的公用拦截
+import commonMock from './common'
+// 单据
+import baseMock from './base'
+
+const HOST = ''
+
+const mockArr = [
+  ...baseMock,
+  ...commonMock
+]
+
+Mock.setup({
+  timeout: 200
+})
+mockArr.forEach(mockItem => {
+  let rurl = mockItem.url
+  Mock.mock(
+    // 兼容正则匹配
+    typeof rurl === 'string' ? HOST + rurl : rurl,
+    mockItem.type,
+    mockItem.data
+  )
+})
diff --git a/template/src/mockData/no-mock.js b/template/src/mockData/no-mock.js
new file mode 100644
index 0000000000..c215a9b1fc
--- /dev/null
+++ b/template/src/mockData/no-mock.js
@@ -0,0 +1 @@
+console.log('no-mock')
diff --git a/template/src/mockData/sideMenu.json.js b/template/src/mockData/sideMenu.json.js
new file mode 100644
index 0000000000..06f108fd14
--- /dev/null
+++ b/template/src/mockData/sideMenu.json.js
@@ -0,0 +1,94 @@
+export default roleName => {
+	return [
+		{
+			icon: "el-icon-tickets",
+			label: "门店费用管理",
+			subMenu: [
+				{
+					label: "收款人信息维护",
+					url: "/expenses/payee",
+					name: "payee"
+				},
+				{
+					label: "费用类别维护",
+					url: "/expenses/classes",
+					name: "classes"
+				},
+				{
+					label: "门店费用申请",
+					url: "/expenses/requisition",
+					name: "requisition"
+				}
+			]
+		},
+		{
+			icon: "el-icon-tickets",
+			label: "POS用户管理",
+			subMenu: [
+				{
+					label: "角色定义",
+					url: "/role/definition"
+				},
+				{
+					label: "POS用户定义",
+					url: "/pos/user"
+				}
+			]
+		},
+		{
+			icon: "el-icon-tickets",
+			label: "营业款管理",
+			subMenu: [
+        {
+          label: "门店存款银行账户",
+          url: "/business/bankAccount",
+          name: 'bankAccount'
+        },
+        {
+          label: "营业款实收录入",
+          url: "/business/received",
+          name: 'business-received'
+        },
+        {
+          label: "营业款实存录入",
+          url: "/business/saved",
+          name: 'business-saved'
+        },
+        {
+          label: "营业款审核",
+          url: "/business/businessAudit",
+          name: 'business-audit'
+        },
+        {
+          label: "门店实存金额审核",
+          url: "/business/storeSavedAudit",
+          name: 'store-saved-audit'
+        }
+			]
+		},
+		{
+			icon: "el-icon-tickets",
+			label: "销售目标管理",
+			subMenu: [
+				{
+					label: "销售目标查看",
+					url: "/sales/target"
+				}
+			]
+		},
+		{
+			icon: "el-icon-tickets",
+			label: "银行存款",
+			subMenu: [
+				{
+					label: "银行存款管理",
+					url: "/bank/deposit"
+				},
+				{
+					label: "银行存款账户维护",
+					url: "/bank/account"
+				}
+			]
+		}
+	];
+};
diff --git a/template/src/mockData/topMenu.json.js b/template/src/mockData/topMenu.json.js
new file mode 100644
index 0000000000..8375b8e94a
--- /dev/null
+++ b/template/src/mockData/topMenu.json.js
@@ -0,0 +1,34 @@
+export default [
+  {
+    'label': '基础数据',
+    'url': '/basedata'
+  },
+  {
+    'label': '采购管理',
+    'url': '/*'
+  },
+  {
+    'label': '销售管理',
+    'url': '/price'
+  },
+  {
+    'label': '门店运营',
+    'url': '/store'
+  },
+  {
+    'label': '库存管理',
+    'url': '/stock'
+  },
+  {
+    'label': '应收应付',
+    'url': '/*'
+  },
+  {
+    'label': '存货管理',
+    'url': '/'
+  },
+  {
+    'label': '加盟商管理',
+    'url': '/*'
+  }
+]
diff --git a/template/src/router/index.js b/template/src/router/index.js
index 5fa7f9d319..b7c58b9474 100644
--- a/template/src/router/index.js
+++ b/template/src/router/index.js
@@ -1,15 +1,57 @@
-import Vue from 'vue'
-import Router from 'vue-router'
-import HelloWorld from '@/components/HelloWorld'
-
-Vue.use(Router)
-
-export default new Router({
-  routes: [
-    {
-      path: '/',
-      name: 'HelloWorld',
-      component: HelloWorld
-    }
-  ]
-})
+import Vue from "vue";
+import store from "../store";
+import Router from "vue-router";
+import {deepCopy} from "@/utils/utils";
+import Home from "@/views/home";
+// import { Message } from 'element-ui'
+import expenses from "./views/expenses";
+import businese from "./views/businese";
+
+Vue.use(Router);
+
+const home = [
+	{
+		path: "/",
+		name: "/",
+		component: Home
+	},
+	{
+		name: "404",
+		path: "*",
+		redirect: "/"
+	}
+];
+
+const router = new Router({
+	routes: home.concat(expenses, businese)
+});
+router.beforeResolve((to, from, next) => {
+	// 全局解析守卫
+	next();
+});
+router.afterEach((to, from) => {
+	// 全局后置钩子
+	// 设置面包屑
+	let $route = to;
+	let result;
+	try {
+		let path = $route.meta && $route.meta.path;
+		if (path) {
+			result =
+				typeof path === "string"
+					? path.split("/").map(label => {
+							return {label};
+					  })
+					: deepCopy(path);
+
+			// 加入首页
+			result.unshift({label: "门店运营", name: "/"});
+		} else {
+			throw new Error();
+		}
+	} catch (e) {
+		result = [];
+	}
+	store.commit("setBreadcrumb", result); // 通过vuex设置
+});
+export default router;
diff --git a/template/src/router/views/businese.js b/template/src/router/views/businese.js
new file mode 100644
index 0000000000..5fdeaa3457
--- /dev/null
+++ b/template/src/router/views/businese.js
@@ -0,0 +1,95 @@
+const currentStr = "营业款管理";
+const current = {label: currentStr};
+
+export default [
+	// 收款人信息维护
+	{
+		path: "/business/bankAccount",
+		name: "businessBankAccount",
+		meta: {
+			name: "门店存款银行账户",
+			path: `${currentStr}/门店存款银行账户`
+		},
+		component: resolve => require(["@/views/business/bankAccount"], resolve)
+	},
+	{
+		path: "/business/bankAccount/add",
+		name: "bankAccountAdd",
+		meta: {
+			name: "门店存款银行账户",
+			path: [
+				{...current},
+				{label: "门店存款银行账户", name: "businessBankAccount"},
+				{label: "新增"}
+			],
+			back: "businessBankAccount"
+		},
+		component: resolve => require(["@/views/business/bankAccount/add"], resolve)
+	},
+	{
+		path: "/business/bankAccount/detail/:id",
+		name: "bankAccountDetail",
+		meta: {
+			name: "门店存款银行账户",
+			path: [
+				{...current},
+				{label: "门店存款银行账户", name: "businessBankAccount"},
+				{label: "详情"}
+			],
+			back: "businessBankAccount"
+		},
+		component: resolve =>
+			require(["@/views/business/bankAccount/detail"], resolve)
+	},
+	{
+		path: "/business/bankAccount/update/:id",
+		name: "bankAccountUpdate",
+		meta: {
+			name: "门店存款银行账户",
+			path: [
+				{...current},
+				{label: "门店存款银行账户", name: "businessBankAccount"},
+				{label: "修改"}
+			],
+			back: "businessBankAccount"
+		},
+		component: resolve =>
+			require(["@/views/business/bankAccount/update"], resolve)
+	},
+	{
+		path: "/business/received",
+		name: "businessReceived",
+		meta: {
+			name: "营业款实收录入",
+			path: `${currentStr}/营业款实收录入`
+		},
+		component: resolve => require(["@/views/business/received"], resolve)
+	},
+	{
+		path: "/business/saved",
+		name: "businessSaved",
+		meta: {
+			name: "营业款实存录入",
+			path: `${currentStr}/营业款实存录入`
+		},
+		component: resolve => require(["@/views/business/saved"], resolve)
+	},
+  {
+    path: "/business/businessAudit",
+    name: "businessAudit",
+    meta: {
+      name: "营业款审核",
+      path: `${currentStr}/营业款审核`
+    },
+    component: resolve => require(["@/views/business/businessAudit"], resolve)
+  },
+  {
+    path: "/business/storeSavedAudit",
+    name: "storeSavedAudit",
+    meta: {
+      name: "门店实存金额审核",
+      path: `${currentStr}/门店实存金额审核`
+    },
+    component: resolve => require(["@/views/business/storeSavedAudit"], resolve)
+  }
+];
diff --git a/template/src/router/views/expenses.js b/template/src/router/views/expenses.js
new file mode 100644
index 0000000000..7162f65168
--- /dev/null
+++ b/template/src/router/views/expenses.js
@@ -0,0 +1,119 @@
+const currentStr = "门店费用管理";
+const current = {label: currentStr};
+
+export default [
+  // 收款人信息维护
+  {
+    path: '/expenses/payee',
+    name: 'expensesPayee',
+    meta: {
+      name: '收款人信息维护',
+      path: `${currentStr}/收款人信息维护`
+    },
+    component: (resolve) => require(['@/views/expenses/payee'], resolve)
+  },
+  {
+    path: '/expenses/payee/add',
+    name: 'payeeAdd',
+    meta: {
+      name: '收款人信息维护',
+      path: [
+        {...current},
+        {label: '收款人信息维护', name: 'expensesPayee'},
+        {label: '新增'}
+      ],
+      back: 'expensesPayee'
+    },
+    component: (resolve) => require(['@/views/expenses/payee/add'], resolve)
+  },
+  {
+    path: '/expenses/payee/detail/:id',
+    name: 'payeeDetail',
+    meta: {
+      name: '收款人信息维护',
+      path: [
+        {...current},
+        {label: '收款人信息维护', name: 'expensesPayee'},
+        {label: '详情'}
+      ],
+      back: 'expensesPayee'
+    },
+    component: (resolve) => require(['@/views/expenses/payee/detail'], resolve)
+  },
+  {
+    path: '/expenses/payee/update/:id',
+    name: 'payeeUpdate',
+    meta: {
+      name: '收款人信息维护',
+      path: [
+        {...current},
+        {label: '收款人信息维护', name: 'expensesPayee'},
+        {label: '修改'}
+      ],
+      back: 'expensesPayee'
+    },
+    component: (resolve) => require(['@/views/expenses/payee/update'], resolve)
+  },
+  // 费用类别维护
+  {
+    path: '/expenses/classes',
+    name: 'expensesClasses',
+    meta: {
+      name: '费用类别维护',
+      path: `${currentStr}/费用类别维护`
+    },
+    component: (resolve) => require(['@/views/expenses/classes'], resolve)
+  },
+  // 门店费用申请单
+  {
+    path: '/expenses/requisition',
+    name: 'expensesRequisition',
+    meta: {
+      name: '门店费用申请单',
+      path: `${currentStr}/门店费用申请单`
+    },
+    component: (resolve) => require(['@/views/expenses/requisition'], resolve)
+  },
+  {
+    path: '/expenses/requisition/add',
+    name: 'requisitionAdd',
+    meta: {
+      name: '门店费用申请单',
+      path: [
+        {...current},
+        {label: '门店费用申请单', name: 'expensesRequisition'},
+        {label: '新增'}
+      ],
+      back: 'expensesRequisition'
+    },
+    component: (resolve) => require(['@/views/expenses/requisition/add'], resolve)
+  },
+  {
+    path: '/expenses/requisition/detail/:id',
+    name: 'requisitionDetail',
+    meta: {
+      name: '门店费用申请单',
+      path: [
+        {...current},
+        {label: '门店费用申请单', name: 'expensesRequisition'},
+        {label: '详情'}
+      ],
+      back: 'expensesRequisition'
+    },
+    component: (resolve) => require(['@/views/expenses/requisition/detail'], resolve)
+  },
+  {
+    path: '/expenses/requisition/update/:id',
+    name: 'requisitionUpdate',
+    meta: {
+      name: '门店费用申请单',
+      path: [
+        {...current},
+        {label: '门店费用申请单', name: 'expensesRequisition'},
+        {label: '修改'}
+      ],
+      back: 'expensesRequisition'
+    },
+    component: (resolve) => require(['@/views/expenses/requisition/update'], resolve)
+  }
+]
diff --git a/template/src/services/ajax.service.js b/template/src/services/ajax.service.js
new file mode 100644
index 0000000000..f42a2d0c79
--- /dev/null
+++ b/template/src/services/ajax.service.js
@@ -0,0 +1,171 @@
+/**
+ * 这是ajax请求相关的服务
+ */
+import axios from "axios";
+import {Message} from "element-ui";
+import {isArray, isObject, isString} from "@/utils/utils";
+import store from "@/store";
+const baseUrl = "/erp_store";
+/* 2018-8-13 16:35:39 增加环境配置host */
+const config = {
+	development: {
+		// devUrl1: "http://192.168.2.25:8080" + baseUrl, // 曾文基本机ip
+		// devUrl2: "http://192.168.2.77:8080" + baseUrl, // 刘婷婷本机ip
+		// devUrl1: "http://192.168.7.25:8080" + baseUrl, // 谢翔
+		// devUrl2: "http://192.168.7.25:8080" + baseUrl // 谢翔
+    devUrl1: "http://erp2.hwdev.pagoda.com.cn" + baseUrl, // 测试
+    devUrl2: "http://erp2.hwdev.pagoda.com.cn" + baseUrl // 测试
+	},
+	// 线上不存在跨域问题,都是当前域名
+	production: {
+		devUrl1: baseUrl,
+		devUrl2: baseUrl
+	}
+};
+const env = config[process.env.NODE_ENV] || config["production"];
+
+// 1.0 创建axiox实例
+export const instance = axios.create({
+	baseURL: "",
+	timeout: 30000,
+	withCredentials: true,
+	headers: {"Content-Type": "application/json;charset=UTF-8"}
+});
+instance.interceptors.response.use(
+	function(response) {
+		// console.log(response)
+		if (
+			response.headers.sessionstatus === "timeout" ||
+			response.headers.Sessionstatus === "timeout"
+		) {
+			window.location.href = window.location.origin + "/rbac-backend/login"; // 登录超时,跳转单点登录链接
+		}
+		// Do something with response data
+		return response;
+	},
+	function(error) {
+		// Do something with response error
+		Message.error("网络异常,请重试");
+		return Promise.reject(error);
+	}
+);
+
+export default class AjaxService {
+	name = "AjaxService";
+	xhrQueue = {}; // ajax请求队列
+	$store = store; // vuex对象
+	baseUrl = env.baseUrl;
+	devUrl1 = env.devUrl1; // 万桥本机ip
+	devUrl2 = env.devUrl2; // 郑灿标本机ip
+	constructor() {
+		console.log(this.devUrl2);
+	}
+	/* 公用业务处理 start */
+	queue(source) {
+		// 负责存队列
+		const _id = `${+new Date()}${Math.ceil(Math.random() * 10000)}`;
+		this.xhrQueue[_id] = source;
+		return _id;
+	}
+	queueCleaner(id) {
+		// 删除队列中某个source
+		delete this.xhrQueue[id];
+	}
+	xhrCancel() {
+		// 清除所有队列
+		Object.keys(this.xhrQueue).forEach(id => {
+			let source = this.xhrQueue[id];
+			source.cancel(); // 退订
+		});
+	}
+	// 对Object/Array的数据递归去空格,用了递归小心爆炸(*  ̄3)(ε ̄ *)
+	trimParams(data) {
+		if (!data) return;
+		Object.keys(data).forEach(key => {
+			if (isString(data[key])) {
+				// string
+				data[key] = data[key].trim();
+			}
+			if (isObject(data[key]) || isArray(data[key])) {
+				// obejct or array
+				this.trimParams(data[key]);
+			}
+		});
+	}
+	/* 公用业务处理 end */
+	request({method, url, params = null, options = {}}) {
+		// 默认执行去空格 可通过options屏蔽
+		if (!options.noTrim) {
+			this.trimParams(params);
+		}
+		// 是否需要loading
+		if (options.loading) {
+			this.$store.commit("setLoading", true); // 通过vuex设置
+		}
+		if (method === "GET") {
+			options.params = params;
+		} else {
+			options.data = params;
+		}
+		const config = Object.assign(
+			{
+				url,
+				method
+			},
+			options
+		);
+		return new Promise((resolve, reject) => {
+			let source = axios.CancelToken.source();
+			config.cancelToken = source.token;
+			const queueId = this.queue(source); // 存进队列
+			instance
+				.request(config)
+				.then(res => {
+					switch (res.data.resultCode) {
+						case 0:
+							resolve(res.data);
+							break;
+						case 401:
+							Message.error("登录已过期,需重新登录");
+							reject(res.data);
+							// go login
+							break;
+						default:
+							// 限制错误提示长度,避免过长占满整个屏幕
+							Message.error(
+								res.data.errorMsg && res.data.errorMsg.substr(0, 200)
+							);
+							reject(res.data);
+							break;
+					}
+				})
+				.catch(error => {
+					console.dir(error);
+					reject(error);
+				})
+				.finally(() => {
+					this.queueCleaner(queueId); // 释放队列中的subscription
+					if (options.loading) {
+						// 请求完成取消loading
+						this.$store.commit("setLoading", false); // 通过vuex设置
+					}
+				});
+		});
+	}
+
+	ajax(method, url, params, options) {
+		return this.request({method, url, params, options});
+	}
+
+	get(url, params, options) {
+		return this.request({method: "GET", url, params, options});
+	}
+
+	post(url, params, options) {
+		return this.request({method: "POST", url, params, options});
+	}
+
+	setHeaderAuthorization(token) {
+		instance.defaults.headers.common["Authorization"] = `Bearer ${token}`;
+	}
+}
diff --git a/template/src/services/business.service.js b/template/src/services/business.service.js
new file mode 100644
index 0000000000..fd3ea529c3
--- /dev/null
+++ b/template/src/services/business.service.js
@@ -0,0 +1,147 @@
+/**
+ * 这是营业款管理子项目采购订单模块内的公用业务逻辑的服务
+ * 可引用AjaxService, StoreService, CommonService 的功能
+ */
+import {isArray} from "@/utils/utils";
+export default class BusinessService {
+	name = "BusinessService";
+	constructor(AjaxService, StoreService, CommonService) {
+		const {baseUrl, devUrl1, devUrl2} = AjaxService;
+		Object.assign(
+			this,
+			{
+				AjaxService,
+				StoreService,
+				CommonService
+			},
+			{
+				baseUrl,
+				devUrl1,
+				devUrl2
+			}
+		);
+	}
+
+	/* api公用定义 */
+	//----------------------------------存款银行账户---------------------------------------------
+	// 门店运营-营业款管理-门店存款银行账户-启用
+	accountServiceStart(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasStoreAccountService/batchStart`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营-营业款管理-门店存款银行账户-禁用
+	accountServiceStop(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasStoreAccountService/batchStop`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营-营业款管理-门店存款银行账户-添加
+	addAccount(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/BasStoreAccountService/create`,
+			params,
+			{loading: isShow}
+		);
+	}
+	//-------------------------------------门店费用管理---------------------------------------
+	// 门店运营门-店费用管理-费用类别-编辑类型
+	editAccount(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasStoreAccountService/update`,
+			params,
+			{loading: isShow}
+		);
+	}
+  // 门店运营-门店费用管理-收款人信息维护-通过ID查询收款人
+  checkAccountById(params = {}, isShow = false) {
+    return this.AjaxService.get(
+      `${this.devUrl1}/BasStoreAccountService/getById`,
+      params,
+      {loading: isShow}
+    );
+	}
+	//-------------------------------实存------------------------------------------------
+  // 门店运营-门店费用管理-营业款实存录入-添加
+  addBusinessSaved(params = {}, isShow = false) {
+    return this.AjaxService.post(
+      `${this.devUrl1}/StoreBusinessMoneyService/addSave`,
+      params,
+      {loading: isShow}
+    );
+  }
+
+  // 门店运营-门店费用管理-营业款实存录入-编辑
+  editBusinessSaved(params = {}, isShow = false) {
+    return this.AjaxService.post(
+      `${this.devUrl1}/StoreBusinessMoneyService/editSave`,
+      params,
+      {loading: isShow}
+    );
+  }
+
+  
+	// 门店运营-门店费用管理-收款人信息维护-通过ID查询收款人
+	checkAccountById(params = {}, isShow = false) {
+		return this.AjaxService.get(
+			`${this.devUrl1}/BasStoreAccountService/getById`,
+			params,
+			{loading: isShow}
+		);
+	}
+
+	// 门店运营-门店费用管理-营业款实存录入-添加
+	addBusinessSaved(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreBusinessMoneyService/addSave`,
+			params,
+			{loading: isShow}
+		);
+	}
+	//----------------------------------------实收--------------------------------------------
+	 // 门店运营-门店费用管理-营业款实收录入-编辑
+	 editBusinessReceived(params = {}, isShow = false) {
+    return this.AjaxService.post(
+      `${this.devUrl1}/StoreBusinessMoneyService/editRec`,
+      params,
+      {loading: isShow}
+    );
+  }
+	// 门店运营-门店费用管理-营业款实收录入-新增保存
+	addBusinessReceived(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreBusinessMoneyService/addRec`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营-门店费用管理-营业款实收录入-删除
+	delBusinessReceived(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreBusinessMoneyService/logicalDeleteById`,
+			params,
+			{loading: isShow}
+		);
+	}
+	//-------------------------------实收实入公用-------------------------------------------------
+	// 门店运营-门店费用管理-营业款实收实存录入-修改状态(提交)
+  setBusinessStatus(params = {}, isShow = false) {
+    return this.AjaxService.post(
+      `${this.devUrl1}/StoreBusinessMoneyService/changeStatus`,
+      params,
+      {loading: isShow}
+    );
+	}
+	// 门店运营-门店费用管理-营业款实收实存录入-删除
+  deleteBusinessReceivedOrSaved(params = {}, isShow = false) {
+    return this.AjaxService.post(
+      `${this.devUrl1}/StoreBusinessMoneyService/logicalDeleteById`,
+      params,
+      {loading: isShow}
+    );
+  }
+}
diff --git a/template/src/services/common.service.js b/template/src/services/common.service.js
new file mode 100644
index 0000000000..242bd5b550
--- /dev/null
+++ b/template/src/services/common.service.js
@@ -0,0 +1,24 @@
+/**
+ * 这是所有模块公用业务逻辑的服务 (也可以设置公用配置)
+ * 可引用AjaxService, StoreService的功能
+ */
+import {Message} from "element-ui";
+export default class CommonService {
+	name = "CommonService";
+	constructor(AjaxService, StoreService) {
+		Object.assign(this, {
+			AjaxService,
+			StoreService
+		});
+		console.log(this.name, this.AjaxService.name, this.StoreService.name);
+	}
+
+	/* 公用业务处理 start */
+	// 校验参数通用方法
+	check(flag, tips) {
+		if (flag) {
+			Message.error(tips);
+		}
+		return flag;
+	}
+}
diff --git a/template/src/services/index.js b/template/src/services/index.js
new file mode 100644
index 0000000000..fce54ef61a
--- /dev/null
+++ b/template/src/services/index.js
@@ -0,0 +1,31 @@
+import AjaxService from "./ajax.service";
+import StoreService from "./store.service";
+import CommonService from "./common.service";
+import PayeeService from "./payee.service";
+import BusinessService from './business.service'
+
+export default {
+	install(Vue) {
+		/**
+		 * 注册service, 维护公用业务逻辑
+		 */
+		let ajaxService = new AjaxService();
+		let storeService = new StoreService(ajaxService);
+		let commonService = new CommonService(ajaxService, storeService);
+		let payeeService = new PayeeService(
+			ajaxService,
+			storeService,
+			commonService
+		);
+    let businessService = new BusinessService(
+      ajaxService,
+      storeService,
+      commonService
+    );
+		Vue.prototype.AjaxService = ajaxService;
+		Vue.prototype.StoreService = storeService;
+		Vue.prototype.CommonService = commonService;
+		Vue.prototype.PayeeService = payeeService;
+		Vue.prototype.BusinessService = businessService
+	}
+};
diff --git a/template/src/services/payee.service.js b/template/src/services/payee.service.js
new file mode 100644
index 0000000000..4f227bf507
--- /dev/null
+++ b/template/src/services/payee.service.js
@@ -0,0 +1,133 @@
+/**
+ * 这是门店费用管理子项目采购订单模块内的公用业务逻辑的服务
+ * 可引用AjaxService, StoreService, CommonService 的功能
+ */
+import {isArray} from "@/utils/utils";
+export default class PayeeService {
+	name = "PayeeService";
+	constructor(AjaxService, StoreService, CommonService) {
+		const {baseUrl, devUrl1, devUrl2} = AjaxService;
+		Object.assign(
+			this,
+			{
+				AjaxService,
+				StoreService,
+				CommonService
+			},
+			{
+				baseUrl,
+				devUrl1,
+				devUrl2
+			}
+		);
+	}
+
+	/* api公用定义 */
+	// 门店运营/门店费用管理/收款人信息维护-禁用/启用
+	payeeEnabled(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/BasPayeeDefService/editEnabled`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/收款人信息维护-添加收款人
+	addPayee(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/BasPayeeDefService/addPayee`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/收款人信息维护-通过ID查询收款人
+	checkPayeeById(params = {}, isShow = false) {
+		return this.AjaxService.get(
+			`${this.devUrl1}/BasPayeeDefService/getById`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/收款人信息维护-编辑收款人
+	editPayee(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/BasPayeeDefService/editPayee`,
+			params,
+			{loading: isShow}
+		);
+	}
+
+	// 门店运营/门店费用管理/费用类别-添加类型
+	addClass(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/BasCostCatService/batchCreate`,
+			params,
+			{loading: isShow}
+		);
+	}
+
+	// 门店运营门/店费用管理/费用类别-编辑类型
+	editClass(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasCostCatService/batchUpdate`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/费用类别-启用
+	classesServiceStart(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasCostCatService/batchStart`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/费用类别-禁用
+	classesServiceStop(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasCostCatService/batchStop`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/费用类别-通过类别获得
+	checkRequisitionByType(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl2}/BasCostCatService/findByPreParam`,
+			params,
+			{loading: isShow}
+		);
+	}
+
+	// 门店运营/门店费用管理/门店费用申请单-修改状态
+	setRequisitionStatus(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreCostAppHeadService/editStatus`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/门店费用申请单-新增
+	addRequisition(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreCostAppHeadService/addCost`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/门店费用申请单-编辑
+	editRequisition(params = {}, isShow = false) {
+		return this.AjaxService.post(
+			`${this.devUrl1}/StoreCostAppHeadService/editCost`,
+			params,
+			{loading: isShow}
+		);
+	}
+	// 门店运营/门店费用管理/门店费用申请单-通过ID查询
+	checkRequisitionById(params = {}, isShow = false) {
+		return this.AjaxService.get(
+			`${this.devUrl1}/StoreCostAppHeadService/viewDetail`,
+			params,
+			{loading: isShow}
+		);
+	}
+}
diff --git a/template/src/services/store.service.js b/template/src/services/store.service.js
new file mode 100644
index 0000000000..f199dfc840
--- /dev/null
+++ b/template/src/services/store.service.js
@@ -0,0 +1,24 @@
+/**
+ * 这是负责储存公用数据的服务 (一些页面过渡需要短暂缓存或者公用请求需要共享的数据可以放这里)
+ * 可引用AjaxService 的功能
+ */
+
+export default class StoreService {
+	name = "StoreService";
+	// 记录每个路由最近一次的params和query {路由名字: {query: {}, params: {}}...}
+	routeParams = {};
+	constructor(AjaxService) {
+		Object.assign(this, {
+			AjaxService
+		});
+	}
+
+	setRouteParams(route) {
+		// 记录最近一次路由的params和query
+		console.log("-----通过StoreService储存最近一次路由的params和query-----");
+		this.routeParams[route.name] = {
+			query: route.query,
+			params: route.params
+		};
+	}
+}
diff --git a/template/src/store/action.js b/template/src/store/action.js
new file mode 100644
index 0000000000..03048022aa
--- /dev/null
+++ b/template/src/store/action.js
@@ -0,0 +1,3 @@
+export default {
+
+}
diff --git a/template/src/store/getters.js b/template/src/store/getters.js
new file mode 100644
index 0000000000..7d47acf037
--- /dev/null
+++ b/template/src/store/getters.js
@@ -0,0 +1,16 @@
+import getSideMenu from '@/mockData/sideMenu.json'
+export default {
+  sideMenu: state => { // 侧边栏菜单根据role变化
+    return getSideMenu(state.role.name)
+  },
+  // 2018-5-22 11:24:26 过滤子菜单数组对象,获取所有菜单没有权限的对象{'菜单路由name': disabled}
+  navNoPermission: (state, getters) => {
+    let navNoPermission = {}
+    getters.sideMenu.forEach(side => {
+      side.subMenu.forEach(sub => {
+        navNoPermission[sub.url] = sub.disabled
+      })
+    })
+    return navNoPermission
+  }
+}
diff --git a/template/src/store/index.js b/template/src/store/index.js
new file mode 100644
index 0000000000..7dd6fc51a4
--- /dev/null
+++ b/template/src/store/index.js
@@ -0,0 +1,39 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import mutations from './mutations'
+import actions from './action'
+import getters from './getters'
+import topMenu from '@/mockData/topMenu.json'
+
+Vue.use(Vuex)
+
+const state = {
+  breadcrumb: [], // 面包屑数组
+  loading: {
+    show: false, // 主体路由内容的遮罩显示控制
+    fullShow: false // layout全局内容的遮罩是否显示 (也可以用vue实例的$loading)
+  },
+  roles: [
+    {id: 1, name: '采购文员', img: '/static/imgs/采购文员2.png'}, // 84ebcfd4a5f22c7b3ec55038d961a91e
+    {id: 2, name: '采购经理', img: '/static/imgs/采购经理.png'},
+    {id: 3, name: '采购总监', img: '/static/imgs/采购总监.png'},
+    {id: 4, name: '仓管', img: '/static/imgs/仓管.png'},
+    {id: 5, name: '仓管主管', img: '/static/imgs/仓管主管.png'},
+    {id: 6, name: '供应商', img: '/static/imgs/供应商.png'},
+    {id: 7, name: '店长', img: '/static/imgs/店长.png'},
+    {id: 8, name: '会计', img: '/static/imgs/会计.png'},
+    {id: 9, name: '出纳', img: '/static/imgs/出纳.png'}
+  ],
+  role: JSON.parse(localStorage.getItem('erp_role')) || { // 存储角色权限资料
+    id: 1,
+    name: '采购文员', // 采购文员 采购经理 采购总监 仓管 仓管主管
+    img: '/static/imgs/采购文员2.png'
+  },
+  topMenu // 顶级菜单
+}
+export default new Vuex.Store({
+  state,
+  getters,
+  actions,
+  mutations
+})
diff --git a/template/src/store/mutations.js b/template/src/store/mutations.js
new file mode 100644
index 0000000000..45caa654f0
--- /dev/null
+++ b/template/src/store/mutations.js
@@ -0,0 +1,31 @@
+export default {
+	setBreadcrumb(state, breadcrumb) {
+		// 动态设置面包屑
+		state.breadcrumb = breadcrumb;
+	},
+	setLoading(state, boolean) {
+		// 动态设置路由页面内容的loading
+		state.loading.show = boolean;
+	},
+	setLoadingFull(state, boolean) {
+		// 动态设置整个页面的的loading遮罩
+		state.loading.fullShow = boolean;
+	},
+	setRole(state, role) {
+		// 2018-5-31 14:49:05提供实时切换角色功能,方便开发测试
+		state.role = role;
+		// 2018-6-6 15:56:37 记录最近一次设置的角色,便于本地调试
+		localStorage.setItem("erp_role", JSON.stringify(role));
+	},
+	setRouteParams(state, route) {
+		// 记录最近一次路由的params和query
+		state.routeParams[route.name] = {
+			query: route.query,
+			params: route.params
+		};
+	},
+	setTopMenuActive(state, topMenuActive) {
+		// console.log(topMenuActive)
+		state.topMenuActive = topMenuActive;
+	}
+};
diff --git a/template/src/table-config/index.js b/template/src/table-config/index.js
new file mode 100644
index 0000000000..b92b760c28
--- /dev/null
+++ b/template/src/table-config/index.js
@@ -0,0 +1,9 @@
+let viewConfig = {};
+
+(r => r.keys().map(sourcePath => {
+  const viewName = sourcePath.replace('./', '').replace('.json', '')
+
+  viewConfig[viewName] = r(sourcePath)
+}))(require.context('./', false, /\.json$/))
+
+export default viewConfig
diff --git a/template/src/table-config/payee_classes_maintenance.json b/template/src/table-config/payee_classes_maintenance.json
new file mode 100644
index 0000000000..da9f322279
--- /dev/null
+++ b/template/src/table-config/payee_classes_maintenance.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"componentsProps":"","fixed":"","name":"类别代码","pageTotal":false,"prop":"code","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":""},{"componentsProps":"","fixed":"","name":"费用类别","pageTotal":false,"prop":"name","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":""},{"componentsProps":"","fixed":"","name":"费用类型","pageTotal":false,"prop":"costTypeName","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"门店费用\",\n    \"value\": \"门店费用\"\n  },\n  {\n    \"label\": \"宿舍费用\",\n    \"value\": \"宿舍费用\"\n  }\n]","sortable":false,"type":"select","validate":["required"],"width":""},{"componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"isEnabled","readOnly":false,"selectOptions":"[\n\t{\n  \t\"label\": \"启用\",\n    \"value\": 1\n  },\n  {\n  \t\"label\": \"关闭\",\n    \"value\": 0\n  }\n]","sortable":false,"type":"select","validate":["required"],"width":""},{"name":"录入人","pageTotal":false,"prop":"creatorName","readOnly":true,"sortable":false},{"name":"录入时间","pageTotal":false,"prop":"lastModifiedAt","readOnly":true,"sortable":false},{"componentsProps":"","fixed":"","name":"备注","pageTotal":false,"prop":"remark","readOnly":false,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"}],"modifiedAt":"2018-09-25 19:13:39","name":"payee_classes_maintenance","operatedType":"update","preVersion":1,"tableMultiSelect":true,"version":2}
\ No newline at end of file
diff --git a/template/src/table-config/payee_cost_classes_subitem.json b/template/src/table-config/payee_cost_classes_subitem.json
new file mode 100644
index 0000000000..9f90e70400
--- /dev/null
+++ b/template/src/table-config/payee_cost_classes_subitem.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"name":"费用类别","pageTotal":false,"prop":"costCatName","readOnly":true,"sortable":false,"width":""},{"componentsProps":"","fixed":"","name":"本期起始日期","pageTotal":false,"prop":"periorBegin","readOnly":false,"selectOptions":"","sortable":false,"type":"date-picker","validate":["required"]},{"componentsProps":"","fixed":"","name":"本期截止日期","pageTotal":false,"prop":"periorEnd","readOnly":false,"selectOptions":"","sortable":false,"type":"date-picker","validate":["required"]},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"金额","pageTotal":true,"prop":"amount","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"]},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"备注","pageTotal":false,"prop":"remark","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[]}],"modifiedAt":"2018-09-20 14:38:28","name":"payee_cost_classes_subitem","operatedType":"update","preVersion":6,"tableMultiSelect":true,"version":7}
\ No newline at end of file
diff --git a/template/src/table-config/payee_cost_requisition.json b/template/src/table-config/payee_cost_requisition.json
new file mode 100644
index 0000000000..1d02ea05f9
--- /dev/null
+++ b/template/src/table-config/payee_cost_requisition.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"name":"申请单号","pageTotal":false,"prop":"costApplyNo","readOnly":true,"sortable":false,"width":"150"},{"name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":true,"sortable":false,"width":"150"},{"name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"sortable":false,"width":"150"},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"费用类型","pageTotal":false,"prop":"costTypeName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"name":"收款人","pageTotal":false,"prop":"payeeName","readOnly":true,"sortable":false,"width":"150"},{"componentsProps":"","fixed":"","name":"地址","pageTotal":false,"prop":"addr","readOnly":false,"selectOptions":"","sortable":false,"type":"remark","validate":["required"],"width":"300"},{"name":"开户银行","pageTotal":false,"prop":"bankName","readOnly":true,"sortable":false,"width":"150"},{"name":"银行支行","pageTotal":false,"prop":"registerBank","readOnly":false,"sortable":false,"type":"remark","validate":["required"],"width":"200"},{"name":"账号","pageTotal":false,"prop":"bankAccountNo","readOnly":true,"sortable":false,"width":"150"},{"componentsProps":"","fixed":"","name":"合计金额","pageTotal":true,"prop":"sum","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"name":"录入人","pageTotal":false,"prop":"creatorName","readOnly":true,"sortable":false,"width":"150"},{"name":"录入日期","pageTotal":false,"prop":"createdAt","readOnly":true,"sortable":false,"width":"150"},{"componentsProps":"","fixed":"","name":"单据状态","pageTotal":false,"prop":"status","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"未提交\",\n    \"value\": 10\n  },\n  {\n    \"label\": \"待审核\",\n    \"value\": 20\n  },\n  {\n    \"label\": \"待付款\",\n    \"value\": 30\n  },\n  {\n    \"label\": \"已完成\",\n    \"value\": 40\n  },\n  {\n    \"label\": \"已拒绝\",\n    \"value\": 50\n  }\n]","sortable":false,"type":"select","validate":["required"],"width":"150"},{"name":"备注","pageTotal":false,"prop":"remark","readOnly":true,"sortable":false,"width":"200"},{"componentsProps":"","fixed":"","name":"拒绝原因","pageTotal":false,"prop":"rejectReason","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"拒绝付款原因","pageTotal":false,"prop":"rejectPayReason","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"}],"modifiedAt":"2018-10-08 16:27:26","name":"payee_cost_requisition","operatedType":"update","preVersion":6,"tableMultiSelect":true,"version":7}
\ No newline at end of file
diff --git a/template/src/table-config/payee_info_maintenance.json b/template/src/table-config/payee_info_maintenance.json
new file mode 100644
index 0000000000..58ddc07004
--- /dev/null
+++ b/template/src/table-config/payee_info_maintenance.json
@@ -0,0 +1 @@
+{"index":false,"metaData":[{"componentsProps":"","fixed":"","name":"收款人代码","pageTotal":false,"prop":"code","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收款人","pageTotal":false,"prop":"payeeName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"开户银行","pageTotal":false,"prop":"bankName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"开户支行","pageTotal":false,"prop":"registerBank","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"银行帐号","pageTotal":false,"prop":"bankAccountNo","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"所在省份","pageTotal":false,"prop":"province","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"城市","pageTotal":false,"prop":"city","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"地址","pageTotal":false,"prop":"addr","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"300"},{"componentsProps":"","fixed":"","name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"录入人","pageTotal":false,"prop":"creatorName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"录入时间","pageTotal":false,"prop":"createdAt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"isEnabled","readOnly":false,"selectOptions":"[\n\t{\n  \t\"label\": \"启用\",\n    \"value\": 1\n  },\n  {\n  \t\"label\": \"关闭\",\n    \"value\": 0\n  }\n]","sortable":false,"type":"select","validate":["required"],"width":"100"}],"modifiedAt":"2018-09-29 14:20:12","name":"payee_info_maintenance","operatedType":"update","preVersion":1,"requestUrl":"order/BasPayeeDefService/viewList","tableMultiSelect":true,"version":2}
\ No newline at end of file
diff --git a/template/src/table-config/store_business_account.json b/template/src/table-config/store_business_account.json
new file mode 100644
index 0000000000..2d3489af3a
--- /dev/null
+++ b/template/src/table-config/store_business_account.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"componentsProps":"","fixed":"","name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"存款银行","pageTotal":false,"prop":"bankName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"存款银行支行","pageTotal":false,"prop":"registerBank","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"存款银行账户名称","pageTotal":false,"prop":"bankAccName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"存款银行帐号","pageTotal":false,"prop":"bankAccNo","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"摘要","pageTotal":false,"prop":"remark","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"录入日期","pageTotal":false,"prop":"createdAt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"isEnabled","readOnly":false,"selectOptions":"[\n\t{\n  \t\"label\": \"启用\",\n    \"value\": 1\n  },\n  {\n  \t\"label\": \"关闭\",\n    \"value\": 0\n  }\n]","sortable":false,"type":"select","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"最后修改人","pageTotal":false,"prop":"modifierName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"最后修改时间","pageTotal":false,"prop":"lastModifiedAt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"}],"modifiedAt":"2018-09-27 14:48:52","name":"store_business_account","operatedType":"update","preVersion":1,"tableMultiSelect":true,"version":2}
\ No newline at end of file
diff --git a/template/src/table-config/store_business_edit_received.json b/template/src/table-config/store_business_edit_received.json
new file mode 100644
index 0000000000..47a88e2777
--- /dev/null
+++ b/template/src/table-config/store_business_edit_received.json
@@ -0,0 +1 @@
+{"index":false,"metaData":[{"componentsProps":"","fixed":"","name":"类型","pageTotal":false,"prop":"type","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"实收\", \n    \"value\": 10\n  }, \n  {\n    \"label\": \"实存\", \n    \"value\": 20\n  }\n]","sortable":false,"type":"select","validate":[]},{"componentsProps":"","fixed":"","name":"营业日期","pageTotal":false,"prop":"businessDate","readOnly":false,"selectOptions":"","sortable":false,"type":"date-picker","validate":["required"],"width":"200"},{"componentsProps":"{\n\t\"labelKey\": \"code\",\n  \"valueKey\": \"code\",\n  \"url\": \"/erp_store/GeneralService/selectOrgCusVenInfoByAuthority\",\n  \"params\": {\n    \"type\": 35\n  },\n  \"method\": \"get\",\n  \"remote\": \"cusOrgCode\",\n  \"clearable\": true\n}","fixed":"","name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":false,"selectOptions":"","sortable":false,"type":"bdc-select","width":"200"},{"componentsProps":"","fixed":"","name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"selectOptions":"","sortable":false,"type":"","width":"150"},{"componentsProps":"","fixed":"","name":"收银员代码","pageTotal":false,"prop":"cashierUserCode","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员","pageTotal":false,"prop":"cashierUserName","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员员工代码","pageTotal":false,"prop":"cashierEmpNo","readOnly":false,"selectOptions":"","sortable":false,"type":"","validate":["required"],"width":"150"},{"componentsProps":"{\n\t\"labelKey\": \"name\",\n  \"valueKey\": \"name\",\n  \"url\": \"/erp_store/GeneralService/getEmpByName\",\n  \"params\": {\n    \"name\": \"\",\n    \"pageNo\":0,\n    \"pageSize\":10\n  },\n  \"method\": \"get\",\n  \"clearable\": true\n}","fixed":"","name":"收银员员工名称","pageTotal":false,"prop":"cashierEmpName","readOnly":false,"selectOptions":"","sortable":false,"type":"bdc-select","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"缴款单图片","pageTotal":false,"prop":"payInImage","readOnly":true,"selectOptions":"","sortable":false,"type":"","width":"200"},{"componentsProps":"","fixed":"","name":"实收现金","pageTotal":true,"prop":"recAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"实收礼券","pageTotal":true,"prop":"realTicketAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"限用礼券","pageTotal":true,"prop":"limitTicketAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"赠送礼券","pageTotal":true,"prop":"largessTickAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"月结外单款","pageTotal":true,"prop":"monAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收回月结外单款","pageTotal":true,"prop":"recMonAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"存款对应营业日期","pageTotal":false,"prop":"corSalesDate","readOnly":true,"selectOptions":"","sortable":false,"type":"","width":"200"},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"status","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"未提交\",\n    \"value\": 10\n  }, \n  {\n    \"label\": \"已完成\",\n    \"value\": 20\n  }, \n  {\n    \"label\": \"实收审核\",\n    \"value\": 30\n  }, \n  {\n    \"label\": \"实存审核\",\n    \"value\": 40\n  }\n]","sortable":false,"type":"select","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"备注","pageTotal":false,"prop":"remark","readOnly":false,"selectOptions":"","sortable":false,"type":"input","width":"200"}],"modifiedAt":"2018-09-29 18:13:24","name":"store_business_edit_received","operatedType":"update","preVersion":50,"tableMultiSelect":true,"version":51}
\ No newline at end of file
diff --git a/template/src/table-config/store_business_edit_saved.json b/template/src/table-config/store_business_edit_saved.json
new file mode 100644
index 0000000000..8c00b75c94
--- /dev/null
+++ b/template/src/table-config/store_business_edit_saved.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"componentsProps":"","fixed":"","name":"类型","pageTotal":false,"prop":"type","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"实收\", \n    \"value\": 10\n  }, \n  {\n    \"label\": \"实存\", \n    \"value\": 20\n  }\n]","sortable":false,"type":"select","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"营业日期","pageTotal":false,"prop":"businessDate","readOnly":false,"selectOptions":"","sortable":false,"type":"date-picker","validate":["required"],"width":"150"},{"associationQuery":"","componentsProps":"{\n\t\"labelKey\": \"code\",\n  \"valueKey\": \"code\",\n  \"url\": \"/erp_store/GeneralService/selectOrgCusVenInfoByAuthority?type=35\",\n  \"method\": \"get\",\n  \"remote\": \"cusOrgName\",\n  \"clearable\": true\n}","fixed":"","name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":false,"selectOptions":"","sortable":false,"type":"bdc-select","validate":["required"],"width":"150"},{"associationQuery":"","associationQueryFiled":"","componentsProps":"","fixed":"","name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"月结外单款","pageTotal":true,"prop":"monAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"收回月结外单款","pageTotal":true,"prop":"recMonAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"","fixed":"","name":"实存金额","pageTotal":true,"prop":"savAmt","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":["required"],"width":"150"},{"componentsProps":"{\n\t\"labelKey\": \"bankAccName\",\n  \"valueKey\": \"bankAccName\",\n  \"url\": \"/erp_store/BasStoreAccountService/selectBankAccNoAndName\",\n  \"params\": {\n    \"orgOrgId\": \"\"\n  },\n  \"method\": \"get\",\n  \"remote\": \"bankAccName\",\n  \"clearable\": true\n}","fixed":"","name":"存款银行帐号名称","pageTotal":false,"prop":"bankAccName","readOnly":false,"selectOptions":"","sortable":false,"type":"bdc-select","validate":["required"],"width":"200"},{"componentsProps":"","fixed":"","name":"存款对应营业日期","pageTotal":false,"prop":"corSalesDate","readOnly":false,"selectOptions":"","sortable":false,"type":"date-picker","validate":["required"],"width":"200"},{"componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"status","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"未提交\",\n    \"value\": 10\n  }, \n  {\n    \"label\": \"已完成\",\n    \"value\": 20\n  }, \n  {\n    \"label\": \"实收审核\",\n    \"value\": 30\n  }, \n  {\n    \"label\": \"实存审核\",\n    \"value\": 40\n  }\n]","sortable":false,"type":"select","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"备注","pageTotal":false,"prop":"remark","readOnly":false,"selectOptions":"","sortable":false,"type":"input","validate":[],"width":"200"}],"modifiedAt":"2018-09-29 15:49:17","name":"store_business_edit_saved","operatedType":"update","preVersion":61,"tableMultiSelect":true,"version":62}
\ No newline at end of file
diff --git a/template/src/table-config/store_business_saved.json b/template/src/table-config/store_business_saved.json
new file mode 100644
index 0000000000..df676411b0
--- /dev/null
+++ b/template/src/table-config/store_business_saved.json
@@ -0,0 +1 @@
+{"index":true,"metaData":[{"componentsProps":"","fixed":"","name":"类型","pageTotal":false,"prop":"type","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"实收\", \n    \"value\": 10\n  }, \n  {\n    \"label\": \"实存\", \n    \"value\": 20\n  }\n]","sortable":false,"type":"select","validate":[],"width":"100"},{"componentsProps":"","fixed":"","name":"营业日期","pageTotal":false,"prop":"businessDate","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"客户代码","pageTotal":false,"prop":"cusOrgCode","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"客户名称","pageTotal":false,"prop":"cusOrgName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员代码","pageTotal":false,"prop":"cashierUserCode","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员","pageTotal":false,"prop":"cashierUserName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员员工代码","pageTotal":false,"prop":"cashierEmpNo","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收银员员工名称","pageTotal":false,"prop":"cashierEmpName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"缴存单图片","pageTotal":false,"prop":"payInImage","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"实收业务款","pageTotal":false,"prop":"1","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"实收现金","pageTotal":true,"prop":"recAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"实收礼券","pageTotal":true,"prop":"realTicketAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"网上支付","pageTotal":false,"prop":"3","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"限用礼券","pageTotal":true,"prop":"limitTicketAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"购物卡","pageTotal":false,"prop":"4","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"赠送礼券","pageTotal":true,"prop":"largessTickAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"银联卡","pageTotal":false,"prop":"5","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"平安会员宝","pageTotal":false,"prop":"6","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"120"},{"componentsProps":"","fixed":"","name":"储值卡","pageTotal":false,"prop":"7","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"电子果币支付","pageTotal":false,"prop":"8","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"120"},{"componentsProps":"","fixed":"","name":"储值卡充值","pageTotal":false,"prop":"9","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"储值卡套","pageTotal":false,"prop":"10","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"健康卡销售","pageTotal":false,"prop":"11","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"支付宝","pageTotal":false,"prop":"12","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"微支付","pageTotal":false,"prop":"13","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"代客送","pageTotal":false,"prop":"14","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"预售提货","pageTotal":false,"prop":"15","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"预售首款","pageTotal":false,"prop":"16","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"月结支付","pageTotal":false,"prop":"17","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"优惠支付","pageTotal":false,"prop":"19","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"线上百果园支付","pageTotal":false,"prop":"20","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"130"},{"componentsProps":"","fixed":"","name":"线上钱包支付","pageTotal":false,"prop":"21","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"果币分摊","pageTotal":false,"prop":"22","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"电子券支付","pageTotal":false,"prop":"23","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"翼支付","pageTotal":false,"prop":"24","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"旺POS支付","pageTotal":false,"prop":"25","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"瞬间退款","pageTotal":false,"prop":"26","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"线上退款","pageTotal":false,"prop":"27","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"月结外单款","pageTotal":true,"prop":"monAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"收回月结外单款","pageTotal":true,"prop":"recMonAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"实存金额","pageTotal":true,"prop":"savAmt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"存款银行帐号名称","pageTotal":false,"prop":"bankAccName","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"存款对应营业日期","pageTotal":false,"prop":"corSalesDate","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"状态","pageTotal":false,"prop":"status","readOnly":false,"selectOptions":"[\n  {\n    \"label\": \"未提交\",\n    \"value\": 10\n  }, \n  {\n    \"label\": \"已完成\",\n    \"value\": 20\n  }, \n  {\n    \"label\": \"实收审核\",\n    \"value\": 30\n  }, \n  {\n    \"label\": \"实存审核\",\n    \"value\": 40\n  }\n]","sortable":false,"type":"select","validate":[],"width":"150"},{"componentsProps":"","fixed":"","name":"备注","pageTotal":false,"prop":"remark","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"财务注明","pageTotal":false,"prop":"appRemark","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"200"},{"componentsProps":"","fixed":"","name":"录入时间","pageTotal":false,"prop":"createdAt","readOnly":true,"selectOptions":"","sortable":false,"type":"","validate":[],"width":"150"}],"modifiedAt":"2018-09-29 16:30:38","name":"store_business_saved","operatedType":"update","preVersion":41,"tableMultiSelect":true,"version":42}
\ No newline at end of file
diff --git a/template/src/utils/bus.js b/template/src/utils/bus.js
new file mode 100644
index 0000000000..a8b329ac0e
--- /dev/null
+++ b/template/src/utils/bus.js
@@ -0,0 +1,2 @@
+import Vue from 'Vue'
+export default new Vue()
diff --git a/template/src/utils/default-setting.js b/template/src/utils/default-setting.js
new file mode 100644
index 0000000000..f4807f3438
--- /dev/null
+++ b/template/src/utils/default-setting.js
@@ -0,0 +1,109 @@
+export const storeRemotePrefix = 'erp_store'
+// 2018-5-23 09:35:03 表单筛选 datePicker为daterange时间段时,props的默认设置
+export const daterangeProps = {
+  type: 'daterange',
+  'range-separator': '至',
+  'unlink-panels': true,
+  'value-format': 'yyyy-MM-dd',
+  'start-placeholder': '开始日期',
+  'end-placeholder': '结束日期'
+}
+// 2018-7-7 16:51:46 表单筛选 datePicker为范围约,props的默认设置
+export const monthrangeProps = {
+  type: 'daterange',
+  'range-separator': '至',
+  'unlink-panels': true,
+  'value-format': 'yy-MM-dd',
+  'start-placeholder': '开始月份',
+  'end-placeholder': '结束月份'
+  // 'picker-options': {
+  //   disabledDate (time) {
+  //     let lastDate = new Date(time.getFullYear(), time.getMonth(), 0)
+  //     let lastDay = lastDate.getDate()
+  //     console.log(lastDay)
+  //     let day = time.getDate()
+  //     return day !== 1 && day !== lastDay
+  //   }
+  // }
+}
+// 表单筛选默认labelWidth
+export const formLabelWidth = '110px'
+// 备注默认字数限制
+export const remarkMaxlength = '200'
+// 2018-8-23 17:05:01 给每个路由组件统一增加前缀命名
+export const prefix = 'erp-store'
+// 商品名称表单通用 props 设置
+export const goodsNameProps = {
+  labelKey: 'name',
+  valueKey: 'name',
+  placeholder: '',
+  params: {
+  },
+  clearable: true,
+  remote: 'key',
+  url: '/order/tb_req_orderService/goods/list'
+}
+// 可搜索下拉框多选功能 props 设置
+export const getSearchSelectProps = (props) => {
+  return Object.assign({
+    labelKey: 'id',
+    valueKey: 'id',
+    placeholder: '',
+    multiple: true,
+    'reserve-keyword': true, // 多选且可搜索时,是否在选中一个选项后保留当前的搜索关键词
+    'collapse-tags': true,
+    clearable: true,
+    remote: 'key'
+  }, props)
+}
+
+export const getErpTableProps = (props) => {
+  return Object.assign({
+    'column-filter': false,
+    'grid-custom-btns-size': 'small',
+    'remenber-column-width': true,
+    'validate-msg': false,
+    'double-click-edit': false,
+    'max-height': '480',
+    size: 'mini',
+    layout: 'total, sizes, prev, pager, next, jumper'
+  }, props)
+}
+
+// 分类select-tree 默认数据
+export const getSelectTreeData = () => {
+  return [{
+    label: '全部',
+    children: [{
+      label: '一级 1',
+      children: [{
+        label: '二级 1-1',
+        children: [{
+          label: '三级 1-1-1',
+          value: 0
+        }, {
+          label: '三级 1-1-2',
+          value: 1
+        }]
+      }]
+    }, {
+      label: '一级 2',
+      children: [{
+        label: '二级 2-1',
+        value: 2
+      }, {
+        label: '二级 2-2',
+        value: 3
+      }]
+    }, {
+      label: '一级 3',
+      children: [{
+        label: '二级 3-1',
+        value: 4
+      }, {
+        label: '二级 3-2',
+        value: 5
+      }]
+    }]
+  }]
+}
diff --git a/template/src/utils/dom.js b/template/src/utils/dom.js
new file mode 100644
index 0000000000..7d36cd3b49
--- /dev/null
+++ b/template/src/utils/dom.js
@@ -0,0 +1,194 @@
+/* istanbul ignore next */
+/* eslint-disable */
+import Vue from 'vue';
+
+const isServer = Vue.prototype.$isServer;
+const SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
+const MOZ_HACK_REGEXP = /^moz([A-Z])/;
+const ieVersion = isServer ? 0 : Number(document.documentMode);
+
+/* istanbul ignore next */
+const trim = function(string) {
+  return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '');
+};
+/* istanbul ignore next */
+const camelCase = function(name) {
+  return name.replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
+    return offset ? letter.toUpperCase() : letter;
+  }).replace(MOZ_HACK_REGEXP, 'Moz$1');
+};
+
+/* istanbul ignore next */
+export const on = (function() {
+  if (!isServer && document.addEventListener) {
+    return function(element, event, handler) {
+      if (element && event && handler) {
+        element.addEventListener(event, handler, false);
+      }
+    };
+  } else {
+    return function(element, event, handler) {
+      if (element && event && handler) {
+        element.attachEvent('on' + event, handler);
+      }
+    };
+  }
+})();
+
+/* istanbul ignore next */
+export const off = (function() {
+  if (!isServer && document.removeEventListener) {
+    return function(element, event, handler) {
+      if (element && event) {
+        element.removeEventListener(event, handler, false);
+      }
+    };
+  } else {
+    return function(element, event, handler) {
+      if (element && event) {
+        element.detachEvent('on' + event, handler);
+      }
+    };
+  }
+})();
+
+/* istanbul ignore next */
+export const once = function(el, event, fn) {
+  var listener = function() {
+    if (fn) {
+      fn.apply(this, arguments);
+    }
+    off(el, event, listener);
+  };
+  on(el, event, listener);
+};
+
+/* istanbul ignore next */
+export function hasClass(el, cls) {
+  if (!el || !cls) return false;
+  if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.');
+  if (el.classList) {
+    return el.classList.contains(cls);
+  } else {
+    return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;
+  }
+};
+
+/* istanbul ignore next */
+export function addClass(el, cls) {
+  if (!el) return;
+  var curClass = el.className;
+  var classes = (cls || '').split(' ');
+
+  for (var i = 0, j = classes.length; i < j; i++) {
+    var clsName = classes[i];
+    if (!clsName) continue;
+
+    if (el.classList) {
+      el.classList.add(clsName);
+    } else if (!hasClass(el, clsName)) {
+      curClass += ' ' + clsName;
+    }
+  }
+  if (!el.classList) {
+    el.className = curClass;
+  }
+};
+
+/* istanbul ignore next */
+export function removeClass(el, cls) {
+  if (!el || !cls) return;
+  var classes = cls.split(' ');
+  var curClass = ' ' + el.className + ' ';
+
+  for (var i = 0, j = classes.length; i < j; i++) {
+    var clsName = classes[i];
+    if (!clsName) continue;
+
+    if (el.classList) {
+      el.classList.remove(clsName);
+    } else if (hasClass(el, clsName)) {
+      curClass = curClass.replace(' ' + clsName + ' ', ' ');
+    }
+  }
+  if (!el.classList) {
+    el.className = trim(curClass);
+  }
+};
+
+/* istanbul ignore next */
+export const getStyle = ieVersion < 9 ? function(element, styleName) {
+  if (isServer) return;
+  if (!element || !styleName) return null;
+  styleName = camelCase(styleName);
+  if (styleName === 'float') {
+    styleName = 'styleFloat';
+  }
+  try {
+    switch (styleName) {
+      case 'opacity':
+        try {
+          return element.filters.item('alpha').opacity / 100;
+        } catch (e) {
+          return 1.0;
+        }
+      default:
+        return (element.style[styleName] || element.currentStyle ? element.currentStyle[styleName] : null);
+    }
+  } catch (e) {
+    return element.style[styleName];
+  }
+} : function(element, styleName) {
+  if (isServer) return;
+  if (!element || !styleName) return null;
+  styleName = camelCase(styleName);
+  if (styleName === 'float') {
+    styleName = 'cssFloat';
+  }
+  try {
+    var computed = document.defaultView.getComputedStyle(element, '');
+    return element.style[styleName] || computed ? computed[styleName] : null;
+  } catch (e) {
+    return element.style[styleName];
+  }
+};
+
+/* istanbul ignore next */
+export function setStyle(element, styleName, value) {
+  if (!element || !styleName) return;
+
+  if (typeof styleName === 'object') {
+    for (var prop in styleName) {
+      if (styleName.hasOwnProperty(prop)) {
+        setStyle(element, prop, styleName[prop]);
+      }
+    }
+  } else {
+    styleName = camelCase(styleName);
+    if (styleName === 'opacity' && ieVersion < 9) {
+      element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')';
+    } else {
+      element.style[styleName] = value;
+    }
+  }
+};
+// 获取元素离浏览器距离
+export const getOffsetLeft = function (obj) {
+  let tmp = obj.offsetLeft;
+  let val = obj.offsetParent;
+  while (val != null) {
+    tmp += val.offsetLeft;
+    val = val.offsetParent;
+  }
+  return tmp;
+}
+
+export const getOffsetTop = function (obj) {
+  let tmp = obj.offsetTop;
+  let val = obj.offsetParent;
+  while (val != null) {
+    tmp += val.offsetTop;
+    val = val.offsetParent;
+  }
+  return tmp;
+}
diff --git a/template/src/utils/http.js b/template/src/utils/http.js
new file mode 100644
index 0000000000..17935313f1
--- /dev/null
+++ b/template/src/utils/http.js
@@ -0,0 +1,94 @@
+import axios from "axios";
+import {Message} from "element-ui";
+
+const config = {
+	BasicUrl: ""
+};
+export const instance = axios.create({
+	baseURL: config.BasicUrl,
+	timeout: 30000,
+	withCredentials: true,
+	headers: {"Content-Type": "application/json;charset=UTF-8"}
+});
+instance.interceptors.response.use(
+	function(response) {
+		console.log(response);
+		if (
+			response.headers.sessionstatus === "timeout" ||
+			response.headers.Sessionstatus === "timeout"
+		) {
+			window.location.href = window.location.origin + "/rbac-backend/login"; // 登录超时,跳转单点登录链接
+		}
+		// Do something with response data
+		return response;
+	},
+	function(error) {
+		// Do something with response error
+		Message.error("网络异常,请重试");
+		return Promise.reject(error);
+	}
+);
+
+let xhrQueue = {};
+const queue = source => {
+	// 负责存队列
+	const _id = `${+new Date()}${Math.ceil(Math.random() * 10000)}`;
+	xhrQueue[_id] = source;
+	return _id;
+};
+const queueCleaner = id => {
+	// 删除队列中某个source
+	delete xhrQueue[id];
+};
+export const xhrCancel = () => {
+	// 清除所有队列
+	Object.keys(xhrQueue).forEach(id => {
+		let source = xhrQueue[id];
+		source.cancel(); // 退订
+	});
+};
+export const $request = ({method, url, params = null, options}) => {
+	if (method === "GET") {
+		options.params = params;
+	} else {
+		options.data = params;
+	}
+	const config = Object.assign(
+		{
+			url,
+			method
+		},
+		options
+	);
+	return new Promise((resolve, reject) => {
+		let source = instance.CancelToken.source();
+		config.cancelToken = source.token;
+		const queueId = queue(source); // 存进队列
+		instance
+			.request(config)
+			.then(res => {
+				resolve(res);
+				queueCleaner(queueId); // 释放队列中的subscription
+			})
+			.catch(error => {
+				reject(error);
+				queueCleaner(queueId); // 释放队列中的subscription
+			});
+	});
+};
+
+export const $ajax = (method, url, params, options) => {
+	return $request({method, url, params, options});
+};
+
+export const $get = (url, params, options) => {
+	return $request({method: "GET", url, params, options});
+};
+
+export const $post = (url, params, options) => {
+	return $request({method: "POST", url, params, options});
+};
+
+export const setHeaderAuthorization = token => {
+	instance.defaults.headers.common["Authorization"] = `Bearer ${token}`;
+};
diff --git a/template/src/utils/index.js b/template/src/utils/index.js
new file mode 100644
index 0000000000..6783e0fd85
--- /dev/null
+++ b/template/src/utils/index.js
@@ -0,0 +1,12 @@
+import { instance, $ajax, $get, $post } from './http'
+export default {
+  install (Vue, options) {
+    /**
+     * 注册http
+     */
+    Vue.prototype.$http = instance
+    Vue.prototype.$ajax = $ajax
+    Vue.prototype.$get = $get
+    Vue.prototype.$post = $post
+  }
+}
diff --git a/template/src/utils/utils.js b/template/src/utils/utils.js
new file mode 100644
index 0000000000..002670ce60
--- /dev/null
+++ b/template/src/utils/utils.js
@@ -0,0 +1,118 @@
+import moment from 'moment'
+export const deepCopy = (data) => JSON.parse(JSON.stringify(data))
+
+export const noop = () => () => { }
+
+export const isArray = (target) => {
+  return toString.call(target) === '[object Array]'
+}
+
+export const isObject = (target) => {
+  return toString.call(target) === '[object Object]'
+}
+
+export const isPromise = (target) => {
+  return toString.call(target) === '[object Promise]'
+}
+
+export const isString = (target) => {
+  return toString.call(target) === '[object String]'
+}
+
+export const isNumber = function (val) {
+  let isNumberRes = true
+
+  if (Number.isNaN(val)) {
+    isNumberRes = false
+  } else if (typeof val !== 'number') {
+    isNumberRes = false
+  }
+
+  return isNumberRes
+}
+
+export const isUndefined = (target) => {
+  return toString.call(target) === '[object Undefined]'
+}
+
+export const isFunction = (target) => {
+  return toString.call(target) === '[object Function]'
+}
+
+export const isEmpty = (target) => {
+  if (isUndefined(target)) {
+    return true
+  } else if (isString(target)) {
+    return target.trim().length === 0
+  } else if (isObject(target)) {
+    return Object.keys(target).length === 0
+  } else if (isArray) {
+    return target.length === 0
+  }
+  return false
+}
+
+export const getDate = () => {
+  let now = new Date()
+  return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`
+}
+
+export const getLocation = () => {
+  return new Promise((resolve, reject) => {
+    if (navigator.geolocation) {
+      navigator.geolocation.getCurrentPosition(param => {
+        resolve(param)
+      })
+    } else {
+      reject()
+    }
+  })
+}
+export const preArrayMultiple = (srcArr, column = 3, defaultValue = {}) => {
+  let bigArr = []
+  srcArr.forEach((el, i) => { // 把大数组分割成多个数组,每个数组有n项
+    let index = parseInt(i / column)
+    bigArr[index] = bigArr[index] ? bigArr[index] : []
+    bigArr[index].push(el)
+  })
+  let last = bigArr.length - 1
+  while (bigArr[last] && bigArr[last].length < column) { // 把最后一数组填满n项
+    bigArr[bigArr.length - 1].push(defaultValue) // 默认填充
+  }
+  return bigArr
+}
+export const formatDate = (date, type) => {
+  const typeObj = {
+    'default': 'YYYY-MM-DD',
+    'full': 'YYYY-MM-DD HH:mm:ss',
+    'cn': 'YYYY年MM月DD日'
+  }
+  const formatValue = typeObj[type || 'default']
+  return moment(date || new Date()).format(formatValue)
+}
+// 根据key从数组中筛选对象
+export const findObjFromArray = (arr, key, keyName) => {
+  return arr.find(item => item[keyName] === key)
+}
+// 格式化金额
+export const formatMoney = (number, places, thousand, decimal) => {
+  number = number || 0;
+  places = !isNaN(places = Math.abs(places)) ? places : 2;
+  thousand = thousand || ',';
+  decimal = decimal || '.';
+  var negative = number < 0 ? '-' : '',
+    i = parseInt(number = Math.abs(+number || 0).toFixed(places), 10) + '',
+    j = (j = i.length) > 3 ? j % 3 : 0;
+  return negative + (j ? i.substr(0, j) + thousand : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : '');
+}
+// 金钱转数字
+export const formatMoneyToNumber = (money) => {
+  if (!isNumber(money)) {
+    if (money.indexOf(',') > 0) {
+      var reg = new RegExp(',', 'g'); // g,表示全部替换。
+      money = money.replace(reg, '')
+    }
+    return parseFloat(money)
+  }
+  return money
+}
diff --git a/template/src/views/business/bankAccount.vue b/template/src/views/business/bankAccount.vue
new file mode 100644
index 0000000000..a447c13f48
--- /dev/null
+++ b/template/src/views/business/bankAccount.vue
@@ -0,0 +1,244 @@
+<template>
+<pagoda-erp-form-table v-model="formData" :form-options="formOptions" :label-width="formLabelWidth" ref="erpFormTabel" @submit="submit">
+	<template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="getBtnVisibles()"></pagoda-row-btns>
+    </template>
+	<template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        project-name="ERP2_New"
+        view="store_business_account"
+        :config="$viewConfig['store_business_account']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :edit-column-config="editColumnConfig"
+        :table-filter-data="filterForm"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+      >
+        <template slot="registerBank" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="150" :editable="false" v-model="scope.row['registerBank']"></pagoda-remark-cell>
+        </template>
+	</pagoda-erp-table-v2>
+	</template>
+</pagoda-erp-form-table>
+</template>
+
+<script>
+import {
+	mapState
+} from 'vuex'
+import searchCommon from '@/mixins/formSearchCommon'
+import publicChoice from '@/views/expenses/publicChoice'
+import {
+	formLabelWidth
+} from '@/utils/default-setting'
+import {
+	formatDate
+} from '@/utils/utils'
+
+export default {
+	name: 'bankAccount',
+	mixins: [searchCommon],
+	components: {},
+	data() {
+		return {
+			tableRequestUrl: `${this.AjaxService.devUrl2}/BasStoreAccountService/findByPreParam`,
+			formLabelWidth,
+			formData: {},
+			formOptions: [{
+					label: '客户代码',
+					type: 'bdc-select',
+					key: 'cusOrgCode',
+					props: {
+						url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectCusOrg`,
+						labelKey: 'code',
+						valueKey: 'code',
+						clearable: true,
+						remote: 'cusOrgCode'
+					}
+        },
+				{
+					label: '存款银行',
+					type: 'bdc-select',
+					key: 'bankName',
+					props: {
+						url: `${this.AjaxService.devUrl2}/BasStoreAccountService/findBankName`,
+						labelKey: 'name',
+						valueKey: 'name',
+						clearable: true,
+						remote: 'bankName'
+					}
+          },
+				{
+					label: '存款银行账号',
+					type: 'input',
+					key: 'bankAccNo'
+          },
+				{
+					label: '录入人',
+					type: 'input',
+					key: 'creatorName'
+          },
+				{
+					label: '录入日期',
+					type: 'date-picker',
+					key: 'createDateTime'
+          },
+				{
+					label: '状态',
+					type: 'select',
+					key: 'isEnabled',
+					options: publicChoice.stateOptions,
+					props: {
+						clearable: true
+					}
+          }
+        ],
+			filterForm: {},
+			editColumnConfig: {
+				label: '操作',
+				width: '150',
+				fixed: 'right',
+				setBtnGroup: this.setBtnGroup
+			},
+			rowBtns: {
+				// 表格上方操作按钮
+				add: {
+					text: '新增',
+					onClick: () => {
+						this.$router.push({
+							name: 'bankAccountAdd'
+						})
+					}
+				},
+				enable: {
+					text: '启用',
+					onClick: () => {
+						const table = this.$refs.erpTable.$refs.tableRef
+						const selection = table.selection
+						const params = []
+						if (selection.length > 0) {
+							for (let i = 0; i < selection.length; i++) {
+								params.push({
+									id: selection[i].id,
+									bankAccNo: selection[i].bankAccNo,
+									cusOrgCode: selection[i].cusOrgCode,
+									isEnabled: 1
+								})
+							}
+							this.BusinessService.accountServiceStart(params, true).then((res) => {
+								if (res.resultCode === 0) {
+									this.$message.success('批量启用成功!')
+								} else {
+									const msg = res.errorMsg
+									this.$message.error(msg ? `批量启用失败:${msg}` : `批量启用失败`)
+								}
+								// 重新刷新表格
+								this.$refs.erpTable.refreshCurrentPage()
+							})
+						} else {
+							this.$message.error('请选择项目')
+						}
+					}
+				},
+				disable: {
+					text: '禁用',
+					onClick: () => {
+						const table = this.$refs.erpTable.$refs.tableRef
+						const selection = table.selection
+						const params = []
+						if (selection.length > 0) {
+							for (let i = 0; i < selection.length; i++) {
+								params.push({
+									id: selection[i].id,
+									isEnabled: 0
+								})
+							}
+							this.BusinessService.accountServiceStop(params, true).then((res) => {
+								if (res.resultCode === 0) {
+									this.$message.success('批量关闭成功!')
+								} else {
+									const msg = res.errorMsg
+									this.$message.error(msg ? `批量关闭失败:${msg}` : `批量关闭失败`)
+								}
+								// 重新刷新表格
+								this.$refs.erpTable.refreshCurrentPage()
+							})
+						} else {
+							this.$message.error('请选择')
+						}
+					}
+				}
+			},
+			gridBtns: [],
+      query: true
+		}
+	},
+	mounted() {
+		this.doLayout()
+	},
+	methods: {
+		doLayout() {
+			this.$refs.erpFormTabel.doLayout()
+		},
+		submit() {
+      if (this.query) {
+        this.query = false
+        this.$refs.erpTable.refreshCurrentPage()
+      }
+			// table筛选
+			let reqData = {
+				cusOrgCode: this.formData.cusOrgCode, //客户代码
+				bankName: this.formData.bankName, //存款银行
+				bankAccNo: this.formData.bankAccNo, //存款银行帐号
+				creatorName: this.formData.creatorName, //录入人
+				createdAt: formatDate(this.formData.createdAt, 'date'), //录入日期
+				isEnabled: this.formData.isEnabled //状态
+			}
+			this.filterForm = Object.assign({}, reqData)
+		},
+		setBtnGroup(row) {
+			let editBtn = {
+				text: '修改',
+				type: 'text',
+				props: {
+					disabled: row.data.isEnabled === 1 ? true : false
+				},
+				onClick: (e, btnSelf, currentRowBtns) => {
+					this.$router.push({
+						name: 'bankAccountUpdate',
+						params: {
+							id: row.data.id
+						}
+					})
+				}
+			}
+			let checkBtn = {
+				text: '详情',
+				type: 'text',
+				onClick: (e, btnSelf, currentRowBtns) => {
+					this.$router.push({
+						name: 'bankAccountDetail',
+						params: {
+							id: row.data.id
+						}
+					})
+				}
+			}
+			return [checkBtn, editBtn]
+		},
+		getBtnVisibles() {
+			return ['add', 'enable', 'disable']
+		}
+	},
+	computed: {
+		...mapState(['role'])
+	}
+}
+</script>
+<style lang="stylus">
+</style>
diff --git a/template/src/views/business/bankAccount/add.vue b/template/src/views/business/bankAccount/add.vue
new file mode 100644
index 0000000000..1432e5f3fe
--- /dev/null
+++ b/template/src/views/business/bankAccount/add.vue
@@ -0,0 +1,230 @@
+<template>
+<div class="payee_add">
+	<pagoda-row-btns class="mb-10" :btns="rowBtns" :visibles="btnVisibles">
+	</pagoda-row-btns>
+	<pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+    <template slot="cusOrgCode" slot-scope="scope">
+      <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+      <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+    </template>
+	</pagoda-edit-form-table>
+</div>
+</template>
+
+<script>
+import publicChoice from '@/views/expenses/publicChoice'
+import {
+  remarkMaxlength,
+} from '@/utils/default-setting'
+
+export default {
+	name: 'payee_add',
+	data() {
+		return {
+      remarkMaxlength,
+			loading: true,
+			rowBtns: {
+				cancel: {
+					text: '取消',
+					onClick: this.handleCancel,
+					confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!'
+				},
+				save: {
+					text: '保存',
+					onClick: this.handleSave
+				}
+			},
+			tableData: [], // createTable详情单table专用
+			config: {
+				column: 3 // 一行放3列(label+value)
+			},
+			editable: true,
+			tableObjData: null,
+			cusOrg: {} // 存储选中的客户信息
+		}
+	},
+	mounted() {
+		// 初始化
+		this.setTableData()
+	},
+	methods: {
+		setTableData() {
+			this.loading = false
+			// 第一行
+			let cusOrgCode = {
+				title: '客户代码',
+				value: '',
+				type: 'bdc-select',
+				key: 'cusOrgCode',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入客户代码'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectCusOrg`,
+					labelKey: 'code',
+					valueKey: 'code',
+					clearable: true,
+					remote: 'cusOrgCode'
+				},
+				on: {
+					input: (name, selectData) => {
+						if (name && name !== '') {
+							this.cusOrg = {
+								cusOrgId: selectData.id,
+								cusOrgCode: selectData.code,
+								cusOrgName: selectData.name
+							}
+              if (cusOrgName) {
+                cusOrgName.value = selectData.name
+              }
+						} else {
+							this.cusOrg = {}
+              cusOrgName.value = '选择客户代码自动带出'
+						}
+					}
+				}
+
+			}
+			let cusOrgName = {
+				title: '客户名称',
+				value: '选择客户代码自动带出',
+				type: 'text',
+				key: 'cusOrgName'
+			}
+			let bankName = {
+				title: '存款银行',
+				value: '',
+				type: 'bdc-select',
+				key: 'bankName',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择存款银行'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl2}/BasStoreAccountService/findBankName`,
+					labelKey: 'name',
+					valueKey: 'name',
+					clearable: true
+				}
+			}
+			// 第二行
+			let registerBank = {
+				title: '存款银行支行',
+				value: '',
+				type: 'remark',
+				key: 'registerBank',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入款银行支行'
+				},
+        props: {
+          text: '修改银行支行',
+          editable: true,
+          maxlength: remarkMaxlength
+        }
+			}
+			let bankAccName = {
+				title: '存款银行账户名称',
+				value: '',
+				type: 'input',
+				key: 'bankAccName',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择存款银行账户名称'
+				}
+			}
+			let bankAccNo = {
+				title: '存款银行帐号',
+				value: '',
+				type: 'input',
+				key: 'bankAccNo',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入存款银行帐号'
+				}
+			}
+			// 第三行
+			let isEnabled = {
+				title: '状态',
+				value: '',
+				type: 'select',
+				key: 'isEnabled',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择状态'
+				},
+				options: publicChoice.stateOptions,
+				props: {
+					clearable: true
+				}
+			}
+			// 第四行
+			let remark = {
+				title: '摘要',
+				value: '',
+				type: 'remark',
+				key: 'remark',
+        props: {
+          text: '修改摘要',
+          editable: true,
+          maxlength: remarkMaxlength
+        }
+			}
+
+			let tableData
+			tableData = [cusOrgCode, cusOrgName, bankName, registerBank, bankAccName, bankAccNo, isEnabled, remark]
+			this.tableData = tableData
+			this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+			this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+		},
+		handleCancel() {
+			this.$router.push({
+				name: 'businessBankAccount'
+			})
+		},
+		handleSave() {
+			this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+				this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+				const params = this.$refs.editFormTable.resetValueData
+				// code自动生成,可以移出
+				delete params.code
+				params.cusOrgCode = this.cusOrg.cusOrgCode //客户代码
+				params.cusOrgName = this.cusOrg.cusOrgName //客户名称
+				params.cusOrgId = this.cusOrg.cusOrgId //客户ID
+				// 发送新增请求
+				this.BusinessService.addAccount(params, true).then((res) => {
+					if (res.resultCode === 0) {
+						this.$message.success('新增成功')
+						setTimeout(() => {
+							this.$router.push({
+								name: 'businessBankAccount'
+							})
+						}, 2000)
+					} else {
+						const msg = res.errorMsg
+						this.$message.error(msg ? `新增失败:${msg}` : `新增失败`)
+					}
+				})
+			}, (error) => {
+				let msgs = error.msgs.map((msg, i) => {
+					return error.items[i].title + msg
+				})
+				this.$message.error('校验不通过,' + msgs.join('、'))
+			})
+		}
+	},
+	created() {},
+	computed: {
+		btnVisibles() {
+			return ['cancel', 'save']
+		}
+	}
+}
+</script>
diff --git a/template/src/views/business/bankAccount/detail.vue b/template/src/views/business/bankAccount/detail.vue
new file mode 100644
index 0000000000..411ff5212d
--- /dev/null
+++ b/template/src/views/business/bankAccount/detail.vue
@@ -0,0 +1,148 @@
+<template>
+<div class="payee_detail">
+	<pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+	</pagoda-row-btns>
+	<pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+	</pagoda-edit-form-table>
+</div>
+</template>
+
+<script>
+export default {
+	name: 'payee_detail',
+	data() {
+		return {
+			loading: true,
+			rowBtns: {
+				update: {
+					text: '修改',
+					onClick: this.handleEdit
+				},
+				cancel: {
+					text: '取消',
+					onClick: this.handleCancel
+				}
+			},
+			tableData: [], // createTable详情单table专用
+			config: {
+				column: 3 // 一行放3列(label+value)
+			},
+			editable: true,
+			tableObjData: null
+		}
+	},
+	mounted() {
+		if (this.$route.params.id) {
+			this.setTableData(this.$route.params.id)
+		}
+	},
+	methods: {
+		setTableData(id) {
+			this.BusinessService.checkAccountById({
+				id: id
+			}, true).then((res) => {
+				this.loading = false
+				if (res.resultCode === 0) {
+					const data = res.data
+					// 第一行
+					let cusOrgCode = {
+						title: '客户代码',
+						value: data.cusOrgCode,
+						type: 'text',
+						key: '客户代码'
+					}
+					let cusOrgName = {
+						title: '客户名称',
+						value: data.cusOrgName,
+						type: 'text',
+						key: '客户名称'
+					}
+					let bankName = {
+						title: '存款银行',
+						value: data.bankName,
+						type: 'text',
+						key: '存款银行'
+					}
+					// 第二行
+					let registerBank = {
+						title: '存款银行支行',
+						value: data.registerBank,
+						type: 'remark',
+						key: '存款银行支行'
+					}
+					let bankAccName = {
+						title: '存款银行账户名称',
+						value: data.bankAccName,
+						type: 'text',
+						key: '存款银行账户名称'
+					}
+					let bankAccNo = {
+						title: '存款银行帐号',
+						value: data.bankAccNo,
+						type: 'text',
+						key: '存款银行帐号'
+					}
+					// 第三行
+					this.isEnabled = data.isEnabled === 1 ? true : false
+					let isEnabled = {
+						title: '状态',
+						value: data.isEnabled === 1 ? '启用' : '关闭',
+						type: 'text',
+						key: '状态'
+					}
+					let remark = {
+						title: '摘要',
+						value: data.remark,
+						type: 'remark',
+						key: '摘要'
+					}
+					let creatorName = {
+						title: '录入人',
+						value: data.creatorName,
+						type: 'text',
+						key: '录入人'
+					}
+					// 第四行
+					let createdAt = {
+						title: '录入日期',
+						value: data.createdAt,
+						type: 'remark',
+						key: '录入日期'
+					}
+					let tableData
+					tableData = [cusOrgCode, cusOrgName, bankName, registerBank, bankAccName, bankAccNo, isEnabled, remark, creatorName, createdAt]
+					this.tableData = tableData
+					this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+					this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+				}
+			})
+		},
+		handleCancel() {
+			this.$router.push({
+				name: 'businessBankAccount'
+			})
+		},
+		handleEdit() {
+			// 判断该项目是否被引用
+			if (this.isEnabled) {
+				this.$message({
+					message: `该项目已启用,无法修改!`,
+					type: 'warning'
+				})
+			} else {
+				this.$router.push({
+					name: 'bankAccountUpdate',
+					params: {
+						id: this.$route.params.id
+					}
+				})
+			}
+		}
+	},
+	computed: {
+		btnVisibles() {
+			return ['cancel', 'update']
+		}
+	}
+}
+</script>
diff --git a/template/src/views/business/bankAccount/update.vue b/template/src/views/business/bankAccount/update.vue
new file mode 100644
index 0000000000..ef07220d2e
--- /dev/null
+++ b/template/src/views/business/bankAccount/update.vue
@@ -0,0 +1,225 @@
+<template>
+  <div class="payee_update">
+    <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+    </pagoda-row-btns>
+    <pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+      <template slot="cusOrgCode" slot-scope="scope">
+        <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+        <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+      </template>
+    </pagoda-edit-form-table>
+  </div>
+</template>
+
+<script>
+  import {
+    remarkMaxlength,
+  } from '@/utils/default-setting'
+  import publicChoice from '@/views/expenses/publicChoice'
+
+  export default {
+    name: 'payee_update',
+    data() {
+      return {
+        remarkMaxlength,
+        loading: true,
+        rowBtns: {
+          cancel: {
+            text: '取消',
+            onClick: this.handleCancel,
+            confirm: '当前界面操作数据不保留,是否取消,确认后返回详情!'
+          },
+          save: {
+            text: '保存',
+            onClick: this.handleSave
+          }
+        },
+        tableData: [], // createTable详情单table专用
+        config: {
+          column: 3 // 一行放3列(label+value)
+        },
+        editable: true,
+        tableObjData: null,
+        id: null,
+        cusOrg: {},
+        version: 0
+      }
+    },
+    mounted() {
+      if (this.$route.params.id) {
+        this.setTableData(this.$route.params.id)
+      }
+    },
+    methods: {
+      setTableData(id) {
+        this.BusinessService.checkAccountById({
+          id: id
+        }, true).then((res) => {
+          this.loading = false
+          if (res.resultCode === 0) {
+            const data = res.data
+            this.cusOrg = {
+              cusOrgId: data.cusOrgId,
+              cusOrgCode: data.cusOrgCode,
+              cusOrgName: data.cusOrgName
+            }
+            this.id = data.id
+            this.version = data.version
+            let cusOrgCode = {
+              title: '客户代码',
+              value: data.cusOrgCode,
+              type: 'text',
+              key: '客户代码'
+            }
+            let cusOrgName = {
+              title: '客户名称',
+              value: data.cusOrgName,
+              type: 'text',
+              key: '客户名称'
+            }
+            let bankName = {
+              title: '存款银行',
+              value: data.bankName,
+              type: 'bdc-select',
+              key: 'bankName',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择存款银行'
+              },
+              props: {
+                url: `${this.AjaxService.devUrl2}/BasStoreAccountService/findBankName`,
+                labelKey: 'name',
+                valueKey: 'name',
+                editable: true,
+                clearable: true
+              }
+            }
+            //2
+            let registerBank = {
+              title: '存款银行支行',
+              value: data.registerBank,
+              type: 'remark',
+              key: 'registerBank',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请输入款银行支行'
+              },
+              props: {
+                text: '修改银行支行',
+                editable: true,
+                maxlength: remarkMaxlength
+              }
+            }
+            let bankAccName = {
+              title: '存款银行账户名称',
+              value: data.bankAccName,
+              type: 'input',
+              key: 'bankAccName',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择存款银行账户名称'
+              },
+              props: {
+                clearable: true
+              }
+            }
+            let bankAccNo = {
+              title: '存款银行帐号',
+              value: data.bankAccNo,
+              type: 'input',
+              key: 'bankAccNo',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请输入存款银行帐号'
+              },
+              props: {
+                clearable: true
+              }
+            }
+            //3
+            let isEnabled = {
+              title: '状态',
+              value: data.isEnabled,
+              type: 'select',
+              key: 'isEnabled',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择状态'
+              },
+              options: publicChoice.stateOptions,
+              props: {
+                clearable: true
+              }
+            }
+            let remark = {
+              title: '摘要',
+              value: data.remark,
+              type: 'remark',
+              key: '摘要',
+              props: {
+                text: '修改摘要',
+                editable: true,
+                maxlength: remarkMaxlength
+              }
+            }
+
+            let tableData
+            tableData = [cusOrgCode, cusOrgName, bankName, registerBank, bankAccName, bankAccNo, isEnabled, remark]
+            this.tableData = tableData
+            this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+            this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+          }
+        })
+      },
+      handleSave() {
+        this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+          this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+          const params = this.$refs.editFormTable.resetValueData
+          // 移除干扰参数
+          delete params.creatorName
+          delete params.createdAt
+          // 添加ID
+          params.id = this.id
+          // 格式化客户信息
+          params.cusOrgId = this.cusOrg.cusOrgId //客户id
+          params.version = this.version //版本
+          params.cusOrgCode = this.cusOrg.cusOrgCode //客户代码
+          // 发送修改请求
+          this.BusinessService.editAccount(params, true).then((res) => {
+            if (res.resultCode === 0) {
+              this.$message.success('修改成功')
+              setTimeout(() => {
+                this.$router.push({
+                  name: 'businessBankAccount'
+                })
+              }, 2000)
+            } else {
+              const msg = res.errorMsg
+              this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+            }
+          })
+        }, (error) => {
+          let msgs = error.msgs.map((msg, i) => {
+            return error.items[i].title + msg
+          })
+          this.$message.error('校验不通过,' + msgs.join('、'))
+        })
+      },
+      handleCancel() {
+        this.$router.push({
+          name: 'businessBankAccount'
+        })
+      }
+    },
+    computed: {
+      btnVisibles() {
+        return ['cancel', 'save']
+      }
+    }
+  }
+</script>
diff --git a/template/src/views/business/businessAudit.vue b/template/src/views/business/businessAudit.vue
new file mode 100644
index 0000000000..be1bc4b5c7
--- /dev/null
+++ b/template/src/views/business/businessAudit.vue
@@ -0,0 +1,272 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        dev
+        project-name="ERP2_New"
+        view="store_business_audit"
+        :config="$viewConfig['store_business_audit']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :table-filter-data="filterForm"
+        :summaryMethod="summaryMethod"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+      >
+        <template slot="savAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['savAmt'], 4) }}
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+        <template slot="appRemark" slot-scope="scope">
+          <pagoda-remark-cell text="编辑财务注明" :maxlength="remarkMaxlength" :editable="scope.row['status'] === 20 ? true : false" v-model="scope.row['appRemark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+  import {mapState} from 'vuex'
+  import searchCommon from '@/mixins/formSearchCommon'
+  import publicChoice from '@/views/business/publicChoice'
+  import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+  import { formatDate, formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'business-audit',
+    mixins: [searchCommon],
+    components: {
+    },
+    data () {
+      return {
+        tableRequestUrl: `${this.AjaxService.devUrl1}/StoreBusinessMoneyService/viewRecAuditList`,
+        formLabelWidth,
+        remarkMaxlength,
+        formatMoney,
+        formData: {},
+        formOptions: [
+          {
+            label: '客户代码',
+            type: 'bdc-select',
+            key: 'cusOrgCode',
+            props: {
+              url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+              labelKey: 'code',
+              valueKey: 'code',
+              clearable: true,
+              remote: 'cusOrgName'
+            }
+          },
+          {
+            label: '营业日期',
+            type: 'date-picker',
+            key: 'date',
+            props: {
+              type: 'daterange'
+            }
+          },
+          {
+            label: '是否有图',
+            type: 'select',
+            key: 'existPicture',
+            options: publicChoice.hasPic,
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '状态',
+            type: 'select',
+            key: 'status',
+            options: publicChoice.documentStatusOptions,
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '存款银行账户名称',
+            type: 'bdc-select',
+            key: 'bankAccName',
+            props: {
+              url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectBankAccNoAndName`,
+              labelKey: 'bankAccName',
+              valueKey: 'bankAccName',
+              clearable: true,
+              remote: 'bankAccName'
+            }
+          },
+          {
+            label: '差额',
+            type: 'input-range',
+            key: 'difference',
+            props: {
+              clearable: true
+            }
+          },
+        ],
+        filterForm: {},
+        rowBtns: {
+          audit: {
+            text: '审核',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 20).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      appRemark: item.appRemark,
+                      newStatus: 30
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('批量审核操作成功!')
+                      // 重新刷新表格
+                      this.$refs.erpTable.refreshCurrentPage()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `批量审核操作失败:${msg}` : `批量审核操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能选择一种状态:已完成')
+                }
+              }
+            }
+          },
+          cancelAudit: {
+            text: '取消审核',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 30).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      appRemark: '',
+                      newStatus: 20
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('批量取消审核操作成功!')
+                      // 重新刷新表格
+                      this.$refs.erpTable.refreshCurrentPage()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `批量取消审核操作失败:${msg}` : `批量取消审核操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能选择一种状态:实收审核')
+                }
+              }
+            }
+          },
+          GSsrjhsk: {
+            text: 'GS收入及好食卡',
+            onClick: () => {
+              this.$message.success(`GS收入及好食卡!`)
+            }
+          },
+          GSzbjmdck: {
+            text: 'GS总部及门店存款',
+            onClick: () => {
+              this.$message.success(`GS总部及门店存款!`)
+            }
+          },
+          GScssr: {
+            text: 'GS重算收入',
+            onClick: () => {
+              this.$message.success(`GS重算收入!`)
+            }
+          }
+        },
+        tableData: {},
+        summaryMethod: {},
+        query: true
+      }
+    },
+    created () {
+    },
+    mounted () {
+      this.doLayout()
+      const props = ['savAmt']
+      const summaryMethod = {}
+      props.forEach(item => {
+        // 添加列表小计方法
+        summaryMethod[item] = (tableData) => {
+          return this.summaryFunction(tableData, item)
+        }
+      })
+      this.summaryMethod = summaryMethod
+    },
+    methods: {
+      doLayout () {
+        this.$refs.erpFormTabel.doLayout()
+      },
+      submit () {
+        if (this.query) {
+          this.query = false
+          this.$refs.erpTable.refreshCurrentPage()
+        }
+        // table筛选
+        let reqData = {
+          bankAccName: this.formData.bankAccName,
+          businessDateStrat: this.formData.date ? formatDate(this.formData.date[0], 'startTime') : undefined,
+          businessDateEnd: this.formData.date ? formatDate(this.formData.date[1], 'endTime') : undefined,
+          cusOrgCode: this.formData.cusOrgCode,
+          status: this.formData.status,
+          existPicture: this.formData.existPicture,
+          difference: this.formData.difference
+        }
+        this.filterForm = Object.assign({}, reqData)
+      },
+      summaryFunction(tableData, key) {
+        let sum = 0
+        tableData.forEach(item => {
+          sum += formatMoneyToNumber(item[key])
+        })
+        return formatMoney(sum, 4)
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles () {
+        return ['audit', 'cancelAudit', 'GSsrjhsk', 'GSzbjmdck', 'GScssr']
+      }
+    }
+  }
+</script>
+<style lang="stylus">
+</style>
diff --git a/template/src/views/business/publicChoice.vue b/template/src/views/business/publicChoice.vue
new file mode 100644
index 0000000000..06d45c6ab7
--- /dev/null
+++ b/template/src/views/business/publicChoice.vue
@@ -0,0 +1,50 @@
+<script>
+  export default {
+    classesTypeOptions: [
+      {
+        label: '门店费用',
+        value: 1
+      }, {
+        label: '宿舍费用',
+        value: 2
+      }
+    ],
+    stateOptions: [
+      {
+        label: '启用',
+        value: 1
+      }, {
+        label: '关闭',
+        value: 0
+      }
+    ],
+    hasPic: [
+      {
+        label: '是',
+        value: 1
+      },
+      {
+        label: '否',
+        value: 0
+      },
+    ],
+    documentStatusOptions: [
+      {
+        label: '未提交',
+        value: 10
+      },
+      {
+        label: '已完成',
+        value: 20
+      },
+      {
+        label: '实收审核',
+        value: 30
+      },
+      {
+        label: '实存审核',
+        value: 40
+      }
+    ]
+  }
+</script>
diff --git a/template/src/views/business/received.vue b/template/src/views/business/received.vue
new file mode 100644
index 0000000000..fb0a0a0eba
--- /dev/null
+++ b/template/src/views/business/received.vue
@@ -0,0 +1,503 @@
+<template>
+  <pagoda-erp-form-table v-model="formData" :form-options="formOptions" :label-width="formLabelWidth" ref="erpFormTabel"  @submit="submit">
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <!-- add -->
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        v-show="action === 'add'"
+        dev
+        project-name="ERP2_New"
+        view="store_business_add_received"
+        :edit-item-input="editItemInput"
+        :summaryMethod="summaryMethod"
+        :default-data="[]"
+        :default-editing="true"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableAdd"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+        :on="onMethod"
+      >
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <!--  edit  -->
+      <pagoda-erp-table-v2
+        dev v-show="action === 'edit'"
+        :empty="true"
+        :summaryMethod="summaryMethod"
+        project-name="ERP2_New"
+        view="store_business_edit_received"
+        :edit-item-input="editItemInput"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableEdit"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+        :on="onMethod"
+      >
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" dev :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <!-- default -->
+      <pagoda-erp-table-v2
+        dev v-show="action === 'default'"
+        :summaryMethod="summaryMethod"
+        project-name="ERP2_New"
+        view="store_business_received"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :table-filter-data="filterForm"
+        :edit-item-input="editItemInput"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="business-received-default"
+      >
+        <template slot="savAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['savAmt'], 4) }}
+        </template>
+        <template slot="realTicketAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['realTicketAmt'], 4) }}
+        </template>
+        <template slot="limitTicketAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['limitTicketAmt'], 4) }}
+        </template>
+        <template slot="largessTickAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['largessTickAmt'], 4) }}
+        </template>
+        <template slot="recAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['recAmt'], 4) }}
+        </template>
+        <template slot="monAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['monAmt'], 4) }}
+        </template>
+        <template slot="recMonAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['recMonAmt'], 4) }}
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+        <template slot="appRemark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['appRemark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+  import { mapState } from 'vuex'
+  import searchCommon from '@/mixins/formSearchCommon'
+  import publicChoice from '@/views/business/publicChoice'
+  import { formLabelWidth, remarkMaxlength} from '@/utils/default-setting'
+  import { formatDate, formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'business-received',
+    mixins: [searchCommon],
+    components: {},
+    data() {
+      return {
+        tableRequestUrl: `${this.AjaxService.devUrl1}/StoreBusinessMoneyService/viewList`,
+        formLabelWidth,
+        remarkMaxlength,
+        formatMoney,
+        action: 'default',
+        tableData: {},
+        formData: {},
+        formOptions: [{
+          label: '客户代码',
+          type: 'bdc-select',
+          key: 'cusOrgCode',
+          props: {
+            url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+            labelKey: 'code',
+            valueKey: 'code',
+            clearable: true,
+            remote: 'cusOrgName'
+          }
+        }, {
+          label: '营业日期',
+          type: 'date-picker',
+          key: 'date',
+          props: {
+            type: 'daterange'
+          }
+        }, {
+          label: '是否有图',
+          type: 'select',
+          key: 'existPicture',
+          options: publicChoice.hasPic,
+          props: {
+            clearable: true
+          }
+        }, {
+          label: '状态',
+          type: 'select',
+          key: 'status',
+          options: publicChoice.documentStatusOptions,
+          props: {
+            clearable: true
+          }
+        }, {
+          label: '存款银行账户名称',
+          type: 'bdc-select',
+          key: 'bankAccName',
+          props: {
+            url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectBankAccNoAndName`,
+            labelKey: 'bankAccName',
+            valueKey: 'bankAccName',
+            clearable: true,
+            remote: 'bankAccName'
+          }
+        }
+        ],
+        filterForm: {},
+        editItemInput: {
+          cusOrgCode: function (value, selectData, rowData) {
+            rowData.cusOrgName = selectData.name
+            rowData.cusOrgId = selectData.id
+          },
+          cashierEmpName: function (value, selectData, rowData) {
+            rowData.cashierEmpNo = selectData.code
+          }
+        },
+        rowBtns: {
+          // 表格上方新增按钮
+          add: {
+            text: '新增',
+            onClick: () => {
+              this.action = 'add'
+              this.$refs.erpTableAdd.refreshCurrentPage()
+              this.$nextTick(() => {
+                this.$refs.erpTableAdd.newRows([{
+                  businessDate: new Date(),
+                  monAmt: '0.0000',
+                  recAmt: '0.0000',
+                  recMonAmt: '0.0000',
+                  savAmt: '0.0000',
+                  realTicketAmt: '0.0000',
+                  limitTicketAmt: '0.0000',
+                  largessTickAmt: '0.0000'
+                }])
+              })
+            }
+          },
+          // 表格上方修改按钮
+          edit: {
+            text: '修改',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              let _sLength = selection.length
+              const indexs = []
+              if (_sLength > 0) {
+                for (let i = 0; i < _sLength; i++) {
+                  if (selection[i].type != 10) {
+                    this.$message.error('您没有修改类型不是实收的权限')
+                    return
+                  }
+                  if (selection[i].status != 10) {
+                    this.$message.error('您没有修改状态不是未提交的权限')
+                    return
+                  }
+                }
+                this.action = 'edit'
+                const props = ['type', 'cusOrgCode', 'status']
+                this.$refs.erpTableEdit.refreshCurrentPage()
+                this.$nextTick(() => {
+                  this.$refs.erpTableEdit.$refs.tableRef.tableData.head.forEach((item) => {
+                    if (props.includes(item.prop)) {
+                      item.constraint = ''
+                    }
+                  })
+                  selection.forEach(item => {
+                    item.recAmt = formatMoney(item.recAmt, 4)
+                    item.realTicketAmt = formatMoney(item.realTicketAmt, 4)
+                    item.limitTicketAmt = formatMoney(item.limitTicketAmt, 4)
+                    item.largessTickAmt = formatMoney(item.largessTickAmt, 4)
+                    item.monAmt = formatMoney(item.monAmt, 4)
+                    item.recMonAmt = formatMoney(item.recMonAmt, 4)
+                  })
+                  this.$refs.erpTableEdit.newRows(selection)
+                })
+                // 打开选中行可编辑行
+                table.editRows(indexs)
+                // 打开选中行可编辑行
+                this.$refs.erpTableEdit.refreshCurrentPage()
+              } else {
+                this.$message.error('请选择项目')
+              }
+            }
+          },
+          // 表格上方删除按钮
+          delete: {
+            text: '删除',
+            onClick: () => {
+              const selection = this.$refs.erpTable.getSelection()
+              let _sLength = selection.length
+              let ids = []
+              if (_sLength > 0) {
+                this.$confirm('确定要删除吗?').then(() => {
+                  for (let i = 0; i < _sLength; i++) {
+                    if (selection[i].type != 10) {
+                      this.$message.error('您没有删除类型是实存的权限')
+                      return
+                    }
+                    ids.push(selection[i].id)
+                  }
+                  const params = {
+                    idList: ids
+                  }
+                  this.BusinessService.deleteBusinessReceivedOrSaved(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('删除成功!')
+                      setTimeout(() => {
+                        this.$refs.erpTable.refreshCurrentPage()
+                      }, 2000)
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `删除失败:${msg}` : `删除失败`)
+                    }
+                  })
+                })
+              } else {
+                this.$message.error('请至少选择一项项目')
+              }
+            }
+          },
+          //新增,修改上方保存按钮
+          save: {
+            text: '保存',
+            onClick: () => {
+              if (this.action === 'add') {
+                const table = this.$refs.erpTableAdd
+                let _vailResult = table.validateEditingItems()
+                if (!_vailResult) return
+                const params = {}
+                const list = table.$refs.tableRef.tableData.data
+                list.map((item) => {
+                  const tempObj = {
+                    // const params = {
+                    businessDate: formatDate(item.businessDate), //销售日期
+                    cusOrgCode: item.cusOrgCode, //客户代码
+                    cusOrgId: item.cusOrgId, //客户ID
+                    cusOrgName: item.cusOrgName, //客户名称
+                    cashierEmpName: item.cashierEmpName, //收银员员工姓名
+                    cashierEmpNo: item.cashierEmpNo, //收银员员工工号
+                    cashierUserCode: item.cashierUserCode, //收银员帐号
+                    cashierUserName: item.cashierUserName, // 收银员名称
+                    recAmt: formatMoneyToNumber(item.recAmt), //实收金额
+                    // 可选参数
+                    realTicketAmt: formatMoneyToNumber(item.realTicketAmt), //实收礼券
+                    limitTicketAmt: formatMoneyToNumber(item.limitTicketAmt), //限用礼券
+                    largessTickAmt: formatMoneyToNumber(item.largessTickAmt), //赠送礼券
+                    monAmt: formatMoneyToNumber(item.monAmt), //月结外单款
+                    recMonAmt: formatMoneyToNumber(item.recMonAmt), //收回月结外单款
+                    remark: item.remark //备注
+                  }
+                  Object.assign(params, tempObj)
+                })
+                this.BusinessService.addBusinessReceived(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('保存成功!')
+                    this.handleRefresh()
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `保存失败:${msg}` : `保存失败`)
+                  }
+                })
+              } else if (this.action === 'edit') {
+                const table = this.$refs.erpTableEdit
+                let _vailResult = table.validateEditingItems()
+                if (!_vailResult) return
+                const list = table.$refs.tableRef.tableData.data
+                let params = {}
+                let editList = []
+                const tempArr = []
+                list.map((item) => {
+                  tempArr.push({
+                    businessDate: formatDate(item.businessDate), //销售日期
+                    cusOrgId: item.cusOrgId, //客户ID
+                    cashierEmpName: item.cashierEmpName, //收银员员工姓名
+                    cashierEmpNo: item.cashierEmpNo, //收银员员工工号
+                    cashierUserCode: item.cashierUserCode, //收银员帐号
+                    cashierUserName: item.cashierUserName, // 收银员名称
+                    recAmt: formatMoneyToNumber(item.recAmt), //实收金额
+                    id: item.id, //id
+                    // 可选参数
+                    payInImage: item.payInImage, //实收缴款单图片
+                    realTicketAmt: formatMoneyToNumber(item.realTicketAmt), //实收礼券
+                    limitTicketAmt: formatMoneyToNumber(item.limitTicketAmt), //限用礼券
+                    largessTickAmt: formatMoneyToNumber(item.largessTickAmt), //赠送礼券
+                    monAmt: formatMoneyToNumber(item.monAmt), //月结外单款
+                    recMonAmt: formatMoneyToNumber(item.recMonAmt), //收回月结外单款
+                    remark: item.remark, //备注
+                    appRemark: item.appRemark, // 财务注明
+                  })
+                  Object.assign(editList, tempArr)
+                  params = {
+                    editList
+                  }
+                })
+                this.BusinessService.editBusinessReceived(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('保存成功!')
+                    this.handleRefresh()
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `保存失败:${msg}` : `保存失败`)
+                  }
+                })
+              }
+            }
+          },
+          //新增,修改上方提交按钮
+          btnSubmit: {
+            text: '提交',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              let _sLength = selection.length
+              const editList = []
+              if (_sLength > 0) {
+                for (let i = 0; i < _sLength; i++) {
+                  if (selection[i].type != 10) {
+                    this.$message.error('您没有提交类型不是实收的权限')
+                    return
+                  }
+                  if (selection[i].status != 10) {
+                    this.$message.error('您没有提交状态不是未提交的权限')
+                    return
+                  }
+                  editList.push({
+                    id: selection[i].id,
+                    newStatus: 20
+                  })
+                  const params = {
+                    editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('提交成功!')
+                      setTimeout(() => {
+                        this.$refs.erpTable.refreshCurrentPage()
+                      }, 2000)
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `提交失败:${msg}` : `提交失败`)
+                    }
+                  })
+                }
+              } else {
+                this.$message.error('请选择一项');
+              }
+            }
+          },
+          cancel: {
+            text: '取消',
+            confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!',
+            onClick: () => {
+              this.handleRefresh()
+            }
+          },
+        },
+        query: true,
+        summaryMethod: {}
+      }
+    },
+    created () {
+    },
+    mounted () {
+      this.doLayout()
+      const props = ['recAmt', 'realTicketAmt', 'limitTicketAmt', 'largessTickAmt', 'savAmt', 'monAmt', 'recMonAmt']
+      const summaryMethod = {}
+      const onMethod = {}
+      props.forEach(item => {
+        // 添加列表小计方法
+        summaryMethod[item] = (tableData) => {
+          return this.summaryFunction(tableData, item)
+        }
+        onMethod[item] = {
+          blur: (event) => {
+            let value = event.target.value
+            // 格式化输入的值
+            value = parseFloat(formatMoneyToNumber(value), 10)
+            event.target.value = formatMoney(value, 4)
+            // 重新计算合计
+            if (this.action === 'add') {
+              this.$refs.erpTableAdd.pageTotal()
+            } else if (this.action === 'edit') {
+              this.$refs.erpTableEdit.pageTotal()
+            }
+          }
+        }
+      })
+      this.summaryMethod = summaryMethod
+      this.onMethod = onMethod
+    },
+    methods: {
+      doLayout () {
+        this.$refs.erpFormTabel.doLayout()
+      },
+      submit() {
+        if (this.query) {
+          this.query = false
+          this.$refs.erpTable.refreshCurrentPage()
+        }
+        // table筛选
+        let reqData = {
+          cusOrgCode: this.formData.cusOrgCode,
+          bankAccName: this.formData.bankAccName,
+          businessDateStrat: this.formData.date ? formatDate(this.formData.date[0], 'startTime') : '',
+          businessDateEnd: this.formData.date ? formatDate(this.formData.date[1], 'endTime') : '',
+          existPicture: this.formData.existPicture,
+          status: this.formData.status
+        }
+        this.filterForm = Object.assign({}, reqData)
+      },
+      handleRefresh() {
+        this.action = 'default'
+        // 重新刷新表格
+        this.$refs.erpTable.refreshCurrentPage()
+      },
+      summaryFunction(tableData, key) {
+        let sum = 0
+        tableData.forEach(item => {
+          sum += formatMoneyToNumber(item[key])
+        })
+        return formatMoney(sum, 4)
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles() {
+        let btnsObj = {
+          'add': ['cancel', 'save',],
+          'edit': ['cancel', 'save'],
+          'default': ['add', 'edit', 'delete', 'btnSubmit']
+        }
+        return btnsObj[this.action]
+      }
+    }
+  }
+</script>
+<style lang="stylus">
+  .business-received-default {
+    .rec-amt, .real-ticket-amt, .limit-ticket-amt, .largess-tick-amt, .mon-amt, .rec-mon-amt, .sav-amt {
+      text-align right
+    }
+  }
+</style>
diff --git a/template/src/views/business/saved.vue b/template/src/views/business/saved.vue
new file mode 100644
index 0000000000..1fdec8cb90
--- /dev/null
+++ b/template/src/views/business/saved.vue
@@ -0,0 +1,727 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        v-show="action === 'add'"
+        project-name="ERP2_New"
+        view="store_business_edit_saved"
+        :config="$viewConfig['store_business_edit_saved']"
+        :edit-column-config="editColumnConfig"
+        :edit-item-input="editItemInput"
+        :default-data="[]"
+        :summaryMethod="summaryMethod"
+        :default-editing="true"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableAdd"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+        :on="onMethod"
+      >
+        <template slot="cusOrgCode-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+        </template>
+        <template slot="bankAccName-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.bankAccNo }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.bankAccName }}</span>
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <pagoda-erp-table-v2
+        v-show="action === 'edit-saved'"
+        project-name="ERP2_New"
+        view="store_business_edit_saved"
+        :config="$viewConfig['store_business_edit_saved']"
+        empty
+        :edit-item-input="editItemInput"
+        :summaryMethod="summaryMethod"
+        :default-editing="true"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableEditSaved"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+        :on="onMethod"
+      >
+        <template slot="cusOrgCode-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+        </template>
+        <template slot="bankAccName-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.bankAccNo }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.bankAccName }}</span>
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <pagoda-erp-table-v2
+        v-show="action === 'edit-received'"
+        dev
+        project-name="ERP2_New"
+        view="store_business_edit_received"
+        :config="$viewConfig['store_business_edit_received']"
+        empty
+        :edit-item-input="editItemInput"
+        :summaryMethod="summaryMethod"
+        :default-editing="true"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableEditReceived"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+        :on="onMethod"
+      >
+        <template slot="cusOrgCode-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+        </template>
+        <template slot="bankAccName-slot" slot-scope="scope">
+          <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.bankAccNo }}</span>
+          <span style="float: right; color: #8492a6;">{{ scope.bankAccName }}</span>
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <pagoda-erp-table-v2
+        dev
+        v-show="action === 'default'"
+        project-name="ERP2_New"
+        view="store_business_saved"
+        :config="$viewConfig['store_business_saved']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :table-filter-data="filterForm"
+        :edit-item-input="editItemInput"
+        :summaryMethod="summaryMethod"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="business-saved-default"
+      >
+        <template slot="savAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['savAmt'], 4) }}
+        </template>
+        <template slot="realTicketAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['realTicketAmt'], 4) }}
+        </template>
+        <template slot="limitTicketAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['limitTicketAmt'], 4) }}
+        </template>
+        <template slot="largessTickAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['largessTickAmt'], 4) }}
+        </template>
+        <template slot="recAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['recAmt'], 4) }}
+        </template>
+        <template slot="monAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['monAmt'], 4) }}
+        </template>
+        <template slot="recMonAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['recMonAmt'], 4) }}
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+        <template slot="appRemark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['appRemark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+  import {mapState} from 'vuex'
+  import searchCommon from '@/mixins/formSearchCommon'
+  import publicChoice from '@/views/business/publicChoice'
+  import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+  import { formatDate, formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'business-saved',
+    mixins: [searchCommon],
+    components: {
+    },
+    data () {
+      return {
+        tableRequestUrl: `${this.AjaxService.devUrl1}/StoreBusinessMoneyService/viewList`,
+        formLabelWidth,
+        remarkMaxlength,
+        formatMoney,
+        formData: {},
+        formOptions: [
+          {
+            label: '客户代码',
+            type: 'bdc-select',
+            key: 'cusOrgCode',
+            props: {
+              url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+              labelKey: 'code',
+              valueKey: 'code',
+              clearable: true,
+              remote: 'cusOrgName'
+            }
+          },
+          {
+            label: '营业日期',
+            type: 'date-picker',
+            key: 'date',
+            props: {
+              type: 'daterange'
+            }
+          },
+          {
+            label: '是否有图',
+            type: 'select',
+            key: 'existPicture',
+            options: publicChoice.hasPic,
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '状态',
+            type: 'select',
+            key: 'status',
+            options: publicChoice.documentStatusOptions,
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '存款银行账户名称',
+            type: 'bdc-select',
+            key: 'bankAccName',
+            props: {
+              url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectBankAccNoAndName`,
+              labelKey: 'bankAccName',
+              valueKey: 'bankAccName',
+              clearable: true,
+              remote: 'bankAccName'
+            }
+          }
+        ],
+        filterForm: {},
+        editColumnConfig: {
+          label: '操作',
+          width: '150',
+          fixed: 'right'
+        },
+        editItemInput: {
+          businessDate: function (value, rowData) {
+            if (value !== '') {
+              rowData.corSalesDate = formatDate(value.getTime() - 24*60*60*1000)
+            }
+          },
+          cusOrgCode: function (value, selectData, rowData) {
+            rowData.cusOrgName = selectData.name
+            rowData.cusOrgId = selectData.id
+          },
+          bankAccName: function (value, selectData, rowData) {
+            rowData.accountId = selectData.id
+            rowData.bankAccNo = selectData.bankAccNo
+          }
+        },
+        rowBtns: {
+          // 表格上方操作按钮
+          add: {
+            text: '新增',
+            onClick: () => {
+              // 切换按钮状态
+              this.action = 'add'
+              this.$refs.erpTableAdd.refreshCurrentPage()
+              this.$nextTick(() => {
+                this.editColumnConfig.setBtnGroup = (row) => {
+                  return [{
+                    type: 'text',
+                    text: '删除',
+                    onClick: () => {
+                      this.$refs.erpTableAdd.delRows(row.$index)
+                    }
+                  }]
+                }
+                const props = ['type', 'status']
+                setTimeout(() => {
+                  this.$refs.erpTableAdd.$refs.tableRef.tableData.head.forEach((item) => {
+                    if (props.includes(item.prop)) {
+                      item.constraint = ''
+                    }
+                  })
+                }, 0)
+                this.$refs.erpTableAdd.newRows([{
+                  businessDate: new Date(),
+                  monAmt: '0.0000',
+                  savAmt: '0.0000',
+                  recMonAmt: '0.0000',
+                  corSalesDate: new Date(new Date().getTime() - 24*60*60*1000)
+                }])
+              })
+            }
+          },
+          save: {
+            text: '保存',
+            onClick: () => {
+              let params = {}
+              if (this.action === 'add') {
+                const addList = []
+                const table = this.$refs.erpTableAdd
+                // 校验是否为空
+                if (table.validateEditingItems()) {
+                  // 构造请求参数
+                  const list = table.$refs.tableRef.tableData.data
+                  list.map((item) => {
+                    const obj = {
+                      accountId: item.accountId,
+                      bankAccName: item.bankAccName,
+                      bankAccNo: item.bankAccNo,
+                      businessDate: formatDate(item.businessDate),
+                      corSalesDate: formatDate(item.corSalesDate),
+                      cusOrgCode: item.cusOrgCode,
+                      cusOrgId: item.cusOrgId,
+                      cusOrgName: item.cusOrgName,
+                      monAmt: item.monAmt,
+                      savAmt: item.savAmt,
+                      recMonAmt: item.recMonAmt,
+                      remark: item.remark
+                    }
+                    addList.push(obj)
+                  })
+                  params = {
+                    addList: addList
+                  }
+                  this.BusinessService.addBusinessSaved(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('新增成功!')
+                      // 重新刷新表格
+                      this.handleRefresh()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `新增失败:${msg}` : `新增失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('请填写完整必填信息!')
+                }
+              } else if (this.action === 'edit-received') {
+                const editList = []
+                const table = this.$refs.erpTableEditReceived
+                // 校验是否为空
+                if (table.validateEditingItems()) {
+                  // 构造请求参数
+                  const list = table.$refs.tableRef.tableData.data
+                  list.map((item) => {
+                    const obj = {
+                      id: item.id,
+                      accountId: item.accountId,
+                      bankAccName: item.bankAccName,
+                      bankAccNo: item.bankAccNo,
+                      businessDate: formatDate(item.businessDate),
+                      corSalesDate: formatDate(item.corSalesDate),
+                      cashierEmpName: item.cashierEmpName,
+                      cashierEmpNo: item.cashierEmpNo,
+                      cashierUserCode: item.cashierUserCode,
+                      cashierUserName: item.cashierUserName,
+                      payInImage: item.payInImage,
+                      realTicketAmt: formatMoneyToNumber(item.realTicketAmt),
+                      limitTicketAmt: formatMoneyToNumber(item.limitTicketAmt),
+                      largessTickAmt: formatMoneyToNumber(item.largessTickAmt),
+                      cusOrgCode: item.cusOrgCode,
+                      cusOrgId: item.cusOrgId,
+                      cusOrgName: item.cusOrgName,
+                      monAmt: formatMoneyToNumber(item.monAmt),
+                      recAmt: formatMoneyToNumber(item.recAmt),
+                      recMonAmt: formatMoneyToNumber(item.recMonAmt),
+                      remark: item.remark
+                    }
+                    editList.push(obj)
+                  })
+                  params = {
+                    editList: editList
+                  }
+                  this.BusinessService.editBusinessReceived(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('修改成功!')
+                      // 重新刷新表格
+                      this.handleRefresh()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+                    }
+                  })
+                }
+              }else if (this.action === 'edit-saved') {
+                const editList = []
+                const table = this.$refs.erpTableEditSaved
+                // 校验是否为空
+                if (table.validateEditingItems()) {
+                  // 构造请求参数
+                  const list = table.$refs.tableRef.tableData.data
+                  list.map((item) => {
+                    const obj = {
+                      id: item.id,
+                      accountId: item.accountId,
+                      bankAccName: item.bankAccName,
+                      bankAccNo: item.bankAccNo,
+                      businessDate: formatDate(item.businessDate),
+                      corSalesDate: formatDate(item.corSalesDate),
+                      cusOrgCode: item.cusOrgCode,
+                      cusOrgId: item.cusOrgId,
+                      cusOrgName: item.cusOrgName,
+                      monAmt: formatMoneyToNumber(item.monAmt),
+                      savAmt: formatMoneyToNumber(item.savAmt),
+                      recMonAmt: formatMoneyToNumber(item.recMonAmt),
+                      remark: item.remark
+                    }
+                    editList.push(obj)
+                  })
+                  params = {
+                    editList: editList
+                  }
+                  this.BusinessService.editBusinessSaved(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('修改成功!')
+                      // 重新刷新表格
+                      this.handleRefresh()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('请填写完整必填信息!')
+                }
+              }
+            }
+          },
+          cancel: {
+            text: '取消',
+            confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!',
+            onClick: () => {
+              this.handleRefresh()
+            }
+          },
+          addCol: {
+            text: '新增行',
+            onClick: () => {
+              // 添加一行可编辑行
+              const table = this.$refs.erpTableAdd.$refs.tableRef
+              this.$nextTick(() => {
+                table.newRows([{
+                  businessDate: new Date(),
+                  monAmt: '0.0000',
+                  savAmt: '0.0000',
+                  recMonAmt: '0.0000',
+                  corSalesDate: new Date(new Date().getTime() - 24*60*60*1000)
+                }])
+              })
+            }
+          },
+          delCol: {
+            text: '删除行',
+            onClick: () => {
+              const table = this.$refs.erpTableAdd.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const indexs = []
+                for (let i = 0; i < selection.length; i++) {
+                  indexs.push(selection[i].$index)
+                }
+                table.delRows(indexs)
+              }
+            }
+          },
+          edit: {
+            text: '修改',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (selection.length > 0) {
+                if (selection.filter(item => item.status > 20).length > 0) {
+                  this.$message.error('只能修改已完成状态和未提交状态的项目')
+                  return
+                }
+                // 三种选择状态
+                // 全为实收
+                if (selection.filter(item => item.type === '10').length === selection.length) {
+                  selection.forEach(item => {
+                    item.recAmt = formatMoney(item.recAmt, 4)
+                    item.realTicketAmt = formatMoney(item.realTicketAmt, 4)
+                    item.limitTicketAmt = formatMoney(item.limitTicketAmt, 4)
+                    item.largessTickAmt = formatMoney(item.largessTickAmt, 4)
+                    item.monAmt = formatMoney(item.monAmt, 4)
+                    item.recMonAmt = formatMoney(item.recMonAmt, 4)
+                  })
+                  // 切换按钮状态
+                  this.action = 'edit-received'
+                  // 打开选中行可编辑行
+                  // 去除编辑时无需修改项的规则
+                  const props = ['type', 'cusOrgCode', 'cashierUserCode', 'cashierUserName', 'cashierEmpNo', 'cashierEmpName', 'status']
+                  this.$refs.erpTableEditReceived.refreshCurrentPage()
+                  this.$nextTick(() => {
+                    this.$refs.erpTableEditReceived.$refs.tableRef.tableData.head.forEach((item) => {
+                      if (props.includes(item.prop)) {
+                        item.constraint = ''
+                      }
+                    })
+                    this.$refs.erpTableEditReceived.newRows(selection)
+                  })
+                } else if (selection.filter(item => item.type === '20').length === selection.length) {
+                  selection.forEach(item => {
+                    item.savAmt = formatMoney(item.savAmt, 4)
+                    item.monAmt = formatMoney(item.monAmt, 4)
+                    item.recMonAmt = formatMoney(item.recMonAmt, 4)
+                  })
+                  // 切换按钮状态
+                  this.action = 'edit-saved'
+                  // 打开选中行可编辑行
+                  // 去除编辑时无需修改项的规则
+                  const props = ['type', 'cusOrgCode', 'status']
+                  this.$refs.erpTableEditSaved.refreshCurrentPage()
+                  this.$nextTick(() => {
+                    this.$refs.erpTableEditSaved.$refs.tableRef.tableData.head.forEach((item) => {
+                      if (props.includes(item.prop)) {
+                        item.constraint = ''
+                      }
+                    })
+                    this.$refs.erpTableEditSaved.newRows(selection)
+                  })
+                } else {
+                  this.$message.error('只能选择一种类型:实收或实存')
+                }
+              } else {
+                this.$message.error('请选择项目')
+              }
+            }
+          },
+          delete: {
+            text: '删除',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const idList = []
+                selection.forEach(item => {
+                  idList.push(item.id)
+                })
+                const params = {
+                  idList: idList
+                }
+                this.BusinessService.deleteBusinessReceivedOrSaved(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('删除成功!')
+                    // 重新刷新表格
+                    this.handleRefresh()
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `删除失败:${msg}` : `删除失败`)
+                  }
+                })
+              }
+            }
+          },
+          import: {
+            text: '导入',
+            onClick: () => {
+              this.$message.success(`导入成功!`)
+            }
+          },
+          export: {
+            text: '导出',
+            onClick: () => {
+              this.$message.success(`导出成功!`)
+            }
+          },
+          complete: {
+            text: '完成',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 10).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      newStatus: 20
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('完成操作成功!')
+                      // 重新刷新表格
+                      this.handleRefresh()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `完成操作失败:${msg}` : `完成操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能修改未提交状态的项目的状态')
+                }
+              }
+            }
+          },
+          cancelComplete: {
+            text: '取消完成',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 20).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      newStatus: 10
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('取消完成操作成功!')
+                      // 重新刷新表格
+                      this.handleRefresh()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `取消完成操作失败:${msg}` : `取消完成操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能修改已完成状态的项目的状态')
+                }
+              }
+            }
+          },
+        },
+        action: 'default',
+        query: true,
+        tableData: {},
+        summaryMethod: {},
+        onMethod: {}
+      }
+    },
+    created () {
+    },
+    mounted () {
+      this.doLayout()
+      const props = ['recAmt', 'realTicketAmt', 'limitTicketAmt', 'largessTickAmt', 'savAmt', 'monAmt', 'recMonAmt']
+      const summaryMethod = {}
+      const onMethod = {}
+      props.forEach(item => {
+        // 添加列表小计方法
+        summaryMethod[item] = (tableData) => {
+          return this.summaryFunction(tableData, item)
+        }
+        onMethod[item] = {
+          blur: (event) => {
+            let value = event.target.value
+            // 格式化输入的值
+            value = parseFloat(formatMoneyToNumber(value), 10)
+            event.target.value = formatMoney(value, 4)
+            // 重新计算合计
+            if (this.action === 'add') {
+              this.$refs.erpTableAdd.pageTotal()
+            } else if (this.action === 'edit-received') {
+              this.$refs.erpTableEditReceived.pageTotal()
+            } else if (this.action === 'edit-saved') {
+              this.$refs.erpTableEditSaved.pageTotal()
+            }
+          }
+        }
+      })
+      this.summaryMethod = summaryMethod
+      this.onMethod = onMethod
+    },
+    methods: {
+      doLayout () {
+        this.$refs.erpFormTabel.doLayout()
+      },
+      submit () {
+        if (this.query) {
+          this.query = false
+          this.$refs.erpTable.refreshCurrentPage()
+        }
+        // table筛选
+        let reqData = {
+          bankAccName: this.formData.bankAccName,
+          businessDateStrat: this.formData.date ? formatDate(this.formData.date[0], 'startTime') : undefined,
+          businessDateEnd: this.formData.date ? formatDate(this.formData.date[1], 'endTime') : undefined,
+          cusOrgCode: this.formData.cusOrgCode,
+          status: this.formData.status,
+          existPicture: this.formData.existPicture
+        }
+        this.filterForm = Object.assign({}, reqData)
+      },
+      handleRefresh () {
+        // 切换按钮状态
+        this.action = 'default'
+        // 重新刷新表格
+        this.editColumnConfig.setBtnGroup = (row) => {
+          return []
+        }
+        this.$refs.erpTable.refreshCurrentPage()
+      },
+      summaryFunction(tableData, key) {
+        let sum = 0
+        tableData.forEach(item => {
+          sum += formatMoneyToNumber(item[key])
+        })
+        return formatMoney(sum, 4)
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles () {
+        let btnsObj = {
+          'add': ['cancel', 'save', 'addCol', 'delCol'],
+          'edit-saved': ['cancel', 'save'],
+          'edit-received': ['cancel', 'save'],
+          'default': ['add', 'edit', 'delete', 'import', 'export', 'complete', 'cancelComplete']
+        }
+        return btnsObj[this.action]
+      }
+    }
+  }
+</script>
+<style lang="stylus">
+  .business-saved-default {
+    .rec-amt, .real-ticket-amt, .limit-ticket-amt, .largess-tick-amt, .mon-amt, .rec-mon-amt, .sav-amt {
+      text-align right
+    }
+  }
+</style>
diff --git a/template/src/views/business/storeSavedAudit.vue b/template/src/views/business/storeSavedAudit.vue
new file mode 100644
index 0000000000..2c528195e1
--- /dev/null
+++ b/template/src/views/business/storeSavedAudit.vue
@@ -0,0 +1,273 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="monthDifference">
+      <div slot="prepend">大于</div>
+    </template>
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        dev
+        project-name="ERP2_New"
+        view="store_saved_audit"
+        :config="$viewConfig['store_saved_audit']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :table-filter-data="filterForm"
+        :summaryMethod="summaryMethod"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="store-saved-audit-list"
+      >
+        <template slot="monAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['monAmt'], 4) }}
+        </template>
+        <template slot="recMonAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['recMonAmt'], 4) }}
+        </template>
+        <template slot="savAmt" slot-scope="scope">
+          {{ formatMoney(scope.row['savAmt'], 4) }}
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+        <template slot="appRemark" slot-scope="scope">
+          <pagoda-remark-cell text="编辑财务注明" :maxlength="remarkMaxlength" :editable="scope.row['status'] === 20 ? true : false" v-model="scope.row['appRemark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+  import {mapState} from 'vuex'
+  import searchCommon from '@/mixins/formSearchCommon'
+  import publicChoice from '@/views/business/publicChoice'
+  import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+  import { formatDate, formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'store-saved-audit',
+    mixins: [searchCommon],
+    components: {
+    },
+    data () {
+      return {
+        tableRequestUrl: `${this.AjaxService.devUrl1}/StoreBusinessMoneyService/viewSaveAuditList`,
+        formLabelWidth,
+        remarkMaxlength,
+        formatMoney,
+        formData: {},
+        formOptions: [
+          {
+            label: '客户代码',
+            type: 'bdc-select',
+            key: 'cusOrgCode',
+            props: {
+              url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+              labelKey: 'code',
+              valueKey: 'code',
+              clearable: true,
+              remote: 'cusOrgName'
+            }
+          },
+          {
+            label: '营业日期',
+            type: 'date-picker',
+            key: 'date',
+            props: {
+              type: 'daterange'
+            }
+          },
+          {
+            label: '实存金额',
+            type: 'input-range',
+            key: 'savAmt',
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '存款银行账户名称',
+            type: 'bdc-select',
+            key: 'bankAccName',
+            props: {
+              url: `${this.AjaxService.devUrl2}/BasStoreAccountService/selectBankAccNoAndName`,
+              labelKey: 'bankAccName',
+              valueKey: 'bankAccName',
+              clearable: true,
+              remote: 'bankAccName'
+            }
+          },
+          {
+            label: '实存差额',
+            type: 'input-range',
+            key: 'difference',
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '月累计实存差额 ',
+            type: 'input',
+            key: 'monthDifference'
+          },
+          {
+            label: '状态',
+            type: 'select',
+            key: 'status',
+            options: publicChoice.documentStatusOptions,
+            props: {
+              clearable: true
+            }
+          }
+        ],
+        filterForm: {},
+        rowBtns: {
+          audit: {
+            text: '审核',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 20).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      appRemark: item.appRemark,
+                      newStatus: 40
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('批量审核操作成功!')
+                      // 重新刷新表格
+                      this.$refs.erpTable.refreshCurrentPage()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `批量审核操作失败:${msg}` : `批量审核操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能选择一种状态:已完成')
+                }
+              }
+            }
+          },
+          cancelAudit: {
+            text: '取消审核',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                if (selection.filter(item => item.status === 40).length === selection.length) {
+                  const editList = []
+                  selection.forEach(item => {
+                    editList.push({
+                      id: item.id,
+                      appRemark: '',
+                      newStatus: 20
+                    })
+                  })
+                  const params = {
+                    editList: editList
+                  }
+                  this.BusinessService.setBusinessStatus(params, true).then((res) => {
+                    if (res.resultCode === 0) {
+                      this.$message.success('批量取消审核操作成功!')
+                      // 重新刷新表格
+                      this.$refs.erpTable.refreshCurrentPage()
+                    } else {
+                      const msg = res.errorMsg
+                      this.$message.error(msg ? `批量取消审核操作失败:${msg}` : `批量取消审核操作失败`)
+                    }
+                  })
+                } else {
+                  this.$message.error('只能选择一种状态:实存审核')
+                }
+              }
+            }
+          }
+        },
+        tableData: {},
+        summaryMethod: {},
+        query: true
+      }
+    },
+    created () {
+    },
+    mounted () {
+      this.doLayout()
+      const props = ['savAmt', 'monAmt', 'recMonAmt']
+      const summaryMethod = {}
+      props.forEach(item => {
+        // 添加列表小计方法
+        summaryMethod[item] = (tableData) => {
+          return this.summaryFunction(tableData, item)
+        }
+      })
+      this.summaryMethod = summaryMethod
+    },
+    methods: {
+      doLayout () {
+        this.$refs.erpFormTabel.doLayout()
+      },
+      submit () {
+        if (this.query) {
+          this.query = false
+          this.$refs.erpTable.refreshCurrentPage()
+        }
+        // table筛选
+        let reqData = {
+          bankAccName: this.formData.bankAccName,
+          businessDateStrat: this.formData.date ? formatDate(this.formData.date[0], 'startTime') : undefined,
+          businessDateEnd: this.formData.date ? formatDate(this.formData.date[1], 'endTime') : undefined,
+          cusOrgCode: this.formData.cusOrgCode,
+          status: this.formData.status,
+          savAmtMax: this.formData.savAmt ? this.formData.savAmt[0] : undefined,
+          savAmtMin: this.formData.savAmt ? this.formData.savAmt[0] : undefined,
+          difference: this.formData.difference
+        }
+        this.filterForm = Object.assign({}, reqData)
+      },
+      summaryFunction(tableData, key) {
+        let sum = 0
+        tableData.forEach(item => {
+          sum += formatMoneyToNumber(item[key])
+        })
+        return formatMoney(sum, 4)
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles () {
+        return ['audit', 'cancelAudit']
+      }
+    }
+  }
+</script>
+<style lang="stylus">
+  .store-saved-audit-list {
+    .mon-amt, .rec-mon-amt, .sav-amt {
+      text-align right
+    }
+  }
+</style>
diff --git a/template/src/views/common/advanced-search-common.vue b/template/src/views/common/advanced-search-common.vue
new file mode 100644
index 0000000000..d58731fb55
--- /dev/null
+++ b/template/src/views/common/advanced-search-common.vue
@@ -0,0 +1,91 @@
+<template>
+<!-- 该组件仅做demo展示,具体视场景进行封装改良 -->
+<el-tabs v-model="activeTab" type="card">
+	<el-tab-pane label="条件查询" name="1">
+		<pagoda-form-group :form-options="formOptions" v-model="formData" inline>
+			<el-button type="primary" @click="tableFilterData = Object.assign({}, formData)">查询</el-button>
+		</pagoda-form-group>
+		<pagoda-table :request="request" selection-column="single" :table-filter-data="tableFilterData" @selection-change="handleSelectChange" ref="selectGoodsTable">
+		</pagoda-table>
+		<div class="fz12 text-gray">是否多选视场景而定</div>
+		<pagoda-row-btns class="text-center mt-20" :btns="rowBtnsTmpl" :visibles="btnVisibles"></pagoda-row-btns>
+	</el-tab-pane>
+	<el-tab-pane label="分组筛选" name="2">
+		<advanced-search-groups @confirm="$emit('confirm', $event)" @cancel="$emit('cancel')"></advanced-search-groups>
+	</el-tab-pane>
+</el-tabs>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			activeTab: '1',
+			formData: {},
+			tableFilterData: {},
+			selection: null,
+			formOptions: [{
+				label: '商品名称',
+				key: 'key',
+				type: 'input'
+      }],
+			rowBtnsTmpl: {
+				confirm: {
+					type: 'primary',
+					text: '确定',
+					onClick: () => {
+						// console.log(this.selection)
+						if (!this.selection || this.selection.length === 0) {
+							this.$message.error('请选择')
+							return
+						}
+						this.$emit('confirm', this.selection.map(el => el.code))
+					}
+				},
+				cancel: {
+					text: '取消',
+					onClick: () => {
+						this.$emit('cancel')
+					}
+				}
+			},
+			btnVisibles: ['confirm', 'cancel']
+		}
+	},
+	props: {},
+	created() {},
+	mounted() {
+
+	},
+	watch: {},
+	methods: {
+		request(tableFilterData) {
+			return new Promise(resolve => {
+				this.AjaxService.get('order/tb_req_orderService/goods/list?resourceTagCode=purchaseGoods&key=' + (tableFilterData.key || ''))
+					.then(res => {
+						console.log(res)
+						resolve({
+							head: [{
+								label: '商品代码',
+								prop: 'code'
+              }, {
+								label: '商品名称',
+								prop: 'name'
+              }],
+							data: res.data.slice(0, 10)
+						})
+					})
+			})
+		},
+		handleSelectChange(selection) {
+			console.log(selection)
+			this.selection = selection
+		}
+	},
+	computed: {}
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+</style>
diff --git a/template/src/views/common/dialog-remark.vue b/template/src/views/common/dialog-remark.vue
new file mode 100644
index 0000000000..09c964ae38
--- /dev/null
+++ b/template/src/views/common/dialog-remark.vue
@@ -0,0 +1,80 @@
+<template>
+  <el-dialog v-bind="$attrs" :title="title" :visible.sync="visibleTmpl" :before-close="beforeClose">
+    <el-input
+      type="textarea"
+      :rows="4"
+      resize="none"
+      v-model="remark">
+    </el-input>
+    <pagoda-row-btns class="text-center mt-10" :btns="rowBtnsTmpl" :visibles="btnVisibles"></pagoda-row-btns>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      remark: '',
+      visibleTmpl: this.visible,
+      rowBtnsTmpl: {
+        save: {
+          type: 'primary',
+          text: '保存',
+          onClick: () => {
+            this.$emit('save', this.remark)
+          }
+        },
+        cancel: {
+          text: '取消',
+          type: 'text',
+          onClick: () => {
+            this.$emit('update:visible', false)
+            this.$emit('cancel', this.remark)
+          }
+        }
+      }
+    }
+  },
+  props: {
+    title: String,
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    rowBtns: Object,
+    btnVisibles: {
+      type: Array,
+      default: () => {
+        return ['save', 'cancel']
+      }
+    }
+  },
+  created () {
+    if (this.rowBtns) {
+      this.rowBtnsTmpl = this.this.rowBtns
+    }
+  },
+  mounted () {
+  },
+  watch: {
+    visible (n) {
+      console.log(n)
+      this.remark = ''
+      this.visibleTmpl = n
+    }
+  },
+  methods: {
+    beforeClose (done) {
+      console.log('要关闭了')
+      this.$emit('update:visible', false)
+      done()
+    }
+  },
+  computed: {
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+</style>
diff --git a/template/src/views/common/form-group-btns.vue b/template/src/views/common/form-group-btns.vue
new file mode 100644
index 0000000000..c629bc1012
--- /dev/null
+++ b/template/src/views/common/form-group-btns.vue
@@ -0,0 +1,34 @@
+<template>
+  <div class="form-group-btns mb-20" :style="{'padding-left': formLabelWidth}">
+    <el-button type="primary" @click="submit">查询</el-button>
+    <el-button type="warning" @click="reset">重置</el-button>
+  </div>
+</template>
+
+<script>
+import { formLabelWidth } from '@/utils/default-setting'
+export default {
+  data () {
+    return {
+      formLabelWidth
+    }
+  },
+  methods: {
+    submit () {
+      this.$emit('submit')
+    },
+    reset () {
+      this.$emit('reset')
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+// 筛选表单按钮组统一样式
+.form-group-btns
+  text-align left
+  padding 0px 0 15px 40px
+  border-bottom 1px solid #ebeff2
+</style>
diff --git a/template/src/views/common/goods-detail.vue b/template/src/views/common/goods-detail.vue
new file mode 100644
index 0000000000..986a77f338
--- /dev/null
+++ b/template/src/views/common/goods-detail.vue
@@ -0,0 +1,42 @@
+<template>
+  <div>
+    <pagoda-erp-table
+      service="order"
+      model="goods_detail"
+      :head-selection="false"
+      :selection-column="false"
+      ref="erpTable"
+      :fit="true"
+      size="mini"
+      :table-filter-data="filterData"
+    >
+    </pagoda-erp-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+    }
+  },
+  props: {
+    filterData: null
+  },
+  created () {
+  },
+  mounted () {
+
+  },
+  watch: {
+  },
+  methods: {
+  },
+  computed: {
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style lang="stylus">
+</style>
diff --git a/template/src/views/expenses/classes.vue b/template/src/views/expenses/classes.vue
new file mode 100644
index 0000000000..90fd55f96a
--- /dev/null
+++ b/template/src/views/expenses/classes.vue
@@ -0,0 +1,445 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        v-show="action === 'add'"
+        project-name="ERP2_New"
+        view="payee_classes_maintenance"
+        :config="$viewConfig['payee_classes_maintenance']"
+        :default-data="[]"
+        :default-editing="true"
+        :edit-column-config="editColumnConfig"
+        :edit-item-input="editItemInput"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableAdd"
+        :column-filter="false"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+      >
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <pagoda-erp-table-v2
+        v-show="action === 'edit'"
+        project-name="ERP2_New"
+        view="payee_classes_maintenance"
+        :config="$viewConfig['payee_classes_maintenance']"
+        empty
+        :edit-item-input="editItemInput"
+        :head-selection="false"
+        :pagination="false"
+        ref="erpTableEdit"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+        :column-filter="false"
+      >
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <pagoda-erp-table-v2
+        v-show="action === 'default'"
+        project-name="ERP2_New"
+        view="payee_classes_maintenance"
+        :config="$viewConfig['payee_classes_maintenance']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :table-filter-data="filterForm"
+        :edit-item-input="editItemInput"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+      >
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <el-dialog :title="dialog.title" :visible.sync="dialog.show" width="600px">
+        <h4 v-if="dialog.note !== ''">{{dialog.note}}</h4>
+        <el-table :data="dialog.data"  border>
+          <el-table-column property="name" label="费用类型" width="150"></el-table-column>
+          <el-table-column property="result" label="失败原因"></el-table-column>
+        </el-table>
+      </el-dialog>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+import {mapState} from 'vuex'
+import searchCommon from '@/mixins/formSearchCommon'
+import publicChoice from '@/views/expenses/publicChoice'
+import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+import { formatDate } from '@/utils/utils'
+
+export default {
+  name: 'classes',
+  mixins: [searchCommon],
+  components: {
+  },
+  data () {
+    return {
+      tableRequestUrl: `${this.AjaxService.devUrl2}/BasCostCatService/findByPreParam`,
+      formLabelWidth,
+      remarkMaxlength,
+      formData: {},
+      formOptions: [
+        {
+          label: '类别代码',
+          type: 'input',
+          key: 'code'
+        },
+        {
+          label: '费用类别',
+          type: 'input',
+          key: 'name'
+        },
+        {
+          label: '费用类型',
+          type: 'select',
+          key: 'costType',
+          options: publicChoice.classesTypeOptions,
+          props: {
+            clearable: true
+          }
+        },
+        {
+          label: '状态',
+          type: 'select',
+          key: 'isEnabled',
+          options: publicChoice.stateOptions,
+          props: {
+            clearable: true
+          }
+        },
+        {
+          label: '录入日期',
+          type: 'date-picker',
+          key: 'date',
+          props: {
+            type: 'daterange'
+          }
+        }
+      ],
+      filterForm: {},
+      editColumnConfig: {
+        label: '操作',
+        width: '150',
+        fixed: 'right'
+      },
+      editItemInput: {
+        costTypeName: function (value, rowData) {
+          rowData.costType = publicChoice.classesTypeOptions.filter(item => item.label === value)[0].value
+        }
+      },
+      rowBtns: {
+        // 表格上方操作按钮
+        add: {
+          text: '新增',
+          onClick: () => {
+            // 切换按钮状态
+            this.action = 'add'
+            this.$refs.erpTableAdd.refresh()
+            this.$nextTick(() => {
+              this.editColumnConfig.setBtnGroup = (row) => {
+                return [{
+                  type: 'text',
+                  text: '删除',
+                  onClick: () => {
+                    this.$refs.erpTableAdd.delRows(row.$index)
+                  }
+                }]
+              }
+              this.$refs.erpTableAdd.newRows([{}])
+            })
+          }
+        },
+        save: {
+          text: '保存',
+          onClick: () => {
+            const params = []
+            if (this.action === 'add') {
+              const table = this.$refs.erpTableAdd
+              // 校验是否为空
+              if (table.validateEditingItems()) {
+                // 构造请求参数
+                const list = table.$refs.tableRef.tableData.data
+                list.map((item) => {
+                  const obj = {
+                    code: item.code,
+                    costType: item.costType,
+                    createdAt: formatDate(new Date()),
+                    isEnabled: item.isEnabled,
+                    name: item.name,
+                    remark: item.remark,
+                    lastModifiedAt: formatDate(new Date()),
+                    costTypeName: item.costTypeName
+                  }
+                  params.push(obj)
+                })
+                this.PayeeService.addClass(params, true).then((res) => {
+                  console.log(res.resultCode)
+                  if (res.resultCode === 0) {
+                    this.$message.success('添加成功!')
+                    // 重新刷新表格
+                    this.handleRefresh()
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `添加失败:${msg}` : `添加失败`)
+                  }
+                })
+              } else {
+                this.$message.error('请填写完整必填信息!')
+              }
+            } else if (this.action === 'edit') {
+              const table = this.$refs.erpTableEdit
+              // 校验是否为空
+              if (table.validateEditingItems()) {
+                const list = table.$refs.tableRef.tableData.data
+                list.forEach(item => {
+                  // 排除所有引用项目
+                  if (item.isEnabled !== 1) {
+                    // 构造请求参数
+                    const obj = {
+                      id: item.id,
+                      code: item.code,
+                      costType: item.costType,
+                      createdAt: item.createdAt,
+                      isEnabled: item.isEnabled,
+                      name: item.name,
+                      version: item.version,
+                      remark: item.remark,
+                      lastModifiedAt: formatDate(new Date()),
+                      costTypeName: item.costTypeName
+                    }
+                    params.push(obj)
+                  }
+                })
+                this.PayeeService.editClass(params, true).then((res) => {
+                  console.log(res.resultCode)
+                  if (res.resultCode === 0) {
+                    this.$message.success('修改成功!')
+                    // 重新刷新表格
+                    this.handleRefresh()
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+                  }
+                })
+              } else {
+                this.$message.error('请填写完整必填信息!')
+              }
+            }
+          }
+        },
+        cancel: {
+          text: '取消',
+          confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!',
+          onClick: () => {
+            this.handleRefresh()
+          }
+        },
+        addCol: {
+          text: '新增行',
+          onClick: () => {
+            // 添加一行可编辑行
+            const table = this.$refs.erpTableAdd.$refs.tableRef
+            this.$nextTick(() => {
+              table.newRows([{code: '', name: '', costTypeName: '', isEnabled: '', remark: ''}])
+            })
+          }
+        },
+        delCol: {
+          text: '删除行',
+          onClick: () => {
+            const table = this.$refs.erpTableAdd.$refs.tableRef
+            const selection = table.selection
+            if (!selection || selection.length === 0) {
+              this.$message.error('请选择项目')
+            } else {
+              const indexs = []
+              for (let i = 0; i < selection.length; i++) {
+                indexs.push(selection[i].$index)
+              }
+              table.delRows(indexs)
+            }
+          }
+        },
+        edit: {
+          text: '修改',
+          onClick: () => {
+            const table = this.$refs.erpTable.$refs.tableRef
+            const selection = table.selection
+            if (selection.length > 0) {
+              // 判断是否存在启用
+              let data = []
+              selection.forEach((item) => {
+                if (item.isEnabled === 1) {
+                  data.push({
+                    name: item.name,
+                    result: '该项目在其他环境已被启用,无法进行操作!'
+                  })
+                }
+              })
+              if (data.length !== 0) {
+                this.dialog = {
+                  title: '失败结果',
+                  show: true,
+                  note: '以下项目操作失败:',
+                  data: data
+                }
+              } else {
+                // 切换按钮状态
+                this.action = 'edit'
+                // 打开选中行可编辑行
+                this.$refs.erpTableEdit.refresh()
+                this.$nextTick(() => {
+                  this.$refs.erpTableEdit.newRows(selection)
+                })
+              }
+            } else {
+              this.$message.error('请选择项目')
+            }
+          }
+        },
+        enable: {
+          text: '启用',
+          onClick: () => {
+            const table = this.$refs.erpTable.$refs.tableRef
+            const selection = table.selection
+            const params = []
+            if (selection.length > 0) {
+              for (let i = 0; i < selection.length; i++) {
+                params.push({
+                  id: selection[i].id,
+                  version: selection[i].version,
+                  isEnabled: 1
+                })
+              }
+              this.PayeeService.classesServiceStart(params, true).then((res) => {
+                console.log(res.resultCode)
+                if (res.resultCode === 0) {
+                  this.$message.success('批量启用成功!')
+                } else {
+                  const msg = res.errorMsg
+                  this.$message.error(msg ? `批量启用失败:${msg}` : `批量启用失败`)
+                }
+                // 重新刷新表格
+                this.$refs.erpTable.refreshCurrentPage()
+              })
+            } else {
+              this.$message.error('请选择项目')
+            }
+          }
+        },
+        disable: {
+          text: '禁用',
+          onClick: () => {
+            const table = this.$refs.erpTable.$refs.tableRef
+            const selection = table.selection
+            const params = []
+            if (selection.length > 0) {
+              for (let i = 0; i < selection.length; i++) {
+                params.push({
+                  id: selection[i].id,
+                  version: selection[i].version,
+                  isEnabled: 0
+                })
+              }
+              this.PayeeService.classesServiceStop(params, true).then((res) => {
+                if (res.resultCode === 0) {
+                  this.$message.success('批量禁用成功!')
+                } else {
+                  const msg = res.errorMsg
+                  this.$message.error(msg ? `批量禁用失败:${msg}` : `批量禁用失败`)
+                }
+                // 重新刷新表格
+                this.$refs.erpTable.refreshCurrentPage()
+              })
+            } else {
+              this.$message.error('请选择项目')
+            }
+          }
+        }
+      },
+      action: 'default',
+      query: true,
+      tableData: {},
+      // 失败提示弹窗
+      dialog: {
+        title: '',
+        show: false,
+        note: '',
+        data: []
+      }
+    }
+  },
+  created () {
+  },
+  mounted () {
+    this.doLayout()
+  },
+  methods: {
+    doLayout () {
+      this.$refs.erpFormTabel.doLayout()
+    },
+    submit () {
+      if (this.query) {
+        this.query = false
+        this.$refs.erpTable.refreshCurrentPage()
+      }
+      // table筛选
+      let reqData = {
+        code: this.formData.code,
+        name: this.formData.name,
+        costType: this.formData.costType,
+        isEnabled: this.formData.isEnabled,
+        reqDate1: this.formData.date ? formatDate(this.formData.date[0], 'startTime') : '',
+        reqDate2: this.formData.date ? formatDate(this.formData.date[1], 'endTime') : ''
+      }
+      this.filterForm = Object.assign({}, reqData)
+      console.log(this.formData)
+    },
+    handleRefresh () {
+      // 切换按钮状态
+      this.action = 'default'
+      // 重新刷新表格
+      this.editColumnConfig.setBtnGroup = (row) => {
+        return []
+      }
+      this.$nextTick(() => {
+        this.$refs.erpTable.refreshCurrentPage()
+      })
+    }
+  },
+  computed: {
+    ...mapState(['role']),
+    btnVisibles () {
+      let btnsObj = {
+        'add': ['cancel', 'save', 'addCol', 'delCol'],
+        'edit': ['cancel', 'save'],
+        'default': ['add', 'edit', 'enable', 'disable']
+      }
+      return btnsObj[this.action]
+    }
+  }
+}
+</script>
+<style lang="stylus">
+</style>
diff --git a/template/src/views/expenses/payee.vue b/template/src/views/expenses/payee.vue
new file mode 100644
index 0000000000..fcd5675edc
--- /dev/null
+++ b/template/src/views/expenses/payee.vue
@@ -0,0 +1,305 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        dev
+        project-name="ERP2_New"
+        view="payee_info_maintenance"
+        :config="$viewConfig['payee_info_maintenance']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :edit-column-config="editColumnConfig"
+        :table-filter-data="filterForm"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="base-list"
+      >
+        <template slot="registerBank" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['registerBank']"></pagoda-remark-cell>
+        </template>
+        <template slot="addr" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['addr']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+import {mapState} from 'vuex'
+import searchCommon from '@/mixins/formSearchCommon'
+import publicChoice from '@/views/expenses/publicChoice'
+import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+import { formatDate } from '@/utils/utils'
+
+export default {
+  name: 'payee',
+  mixins: [searchCommon],
+  components: {
+  },
+  data () {
+    return {
+      tableRequestUrl: `${this.AjaxService.devUrl1}/BasPayeeDefService/viewList`,
+      formLabelWidth,
+      remarkMaxlength,
+      formData: {},
+      formOptions: [
+        {
+          label: '收款人',
+          type: 'input',
+          key: 'payeeName'
+        },
+        {
+          label: '开户银行',
+          type: 'bdc-select',
+          key: 'bankName',
+          props: {
+            url: `${this.AjaxService.devUrl1}/GeneralService/selectLookupValueByTypeCode?code=BAS_BANK_LIST`,
+            labelKey: 'value',
+            valueKey: 'value',
+            clearable: true
+          }
+        },
+        {
+          label: '省份',
+          type: 'bdc-select',
+          key: 'province',
+          props: {
+            url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?pCode=0&levelType=10`,
+            labelKey: 'name',
+            valueKey: 'name',
+            clearable: true,
+            remote: 'name'
+          },
+          'on': {
+            input: (name, selectData) => {
+              this.formData.city = ''
+              if (selectData) {
+                this.$nextTick(() => {
+                  this.formOptions[3].props.params.pCode = selectData.code
+                  this.formOptions[3].props.disabled = false
+                })
+              } else {
+                this.$nextTick(() => {
+                  this.formOptions[3].props.params.pCode = '0'
+                  this.formOptions[3].props.disabled = true
+                })
+              }
+            }
+          }
+        },
+        {
+          label: '城市',
+          type: 'bdc-select',
+          key: 'city',
+          props: {
+            url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?levelType=20`,
+            params: {
+              pCode: '0'
+            },
+            labelKey: 'name',
+            valueKey: 'name',
+            clearable: true,
+            remote: 'name',
+            disabled: true
+          }
+        },
+        {
+          label: '银行账号',
+          type: 'bdc-select',
+          key: 'bankAccountNo',
+          props: {
+            url: `${this.AjaxService.devUrl1}/BasPayeeDefService/findBankAccountNoByFuzzy`,
+            labelKey: 'bankAccountNo',
+            valueKey: 'bankAccountNo',
+            clearable: true,
+            remote: 'bankAccountNo'
+          }
+        },
+        {
+          label: '录入人',
+          type: 'input',
+          key: 'creatorName'
+        },
+        {
+          label: '录入日期',
+          type: 'date-picker',
+          key: 'createdAt'
+        },
+        {
+          label: '客户名称',
+          type: 'bdc-select',
+          key: 'cusOrgName',
+          props: {
+            url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+            labelKey: 'name',
+            valueKey: 'name',
+            clearable: true,
+            remote: 'cusOrgName'
+          }
+        },
+        {
+          label: '状态',
+          type: 'select',
+          key: 'isEnabled',
+          options: publicChoice.stateOptions,
+          props: {
+            clearable: true
+          }
+        }
+      ],
+      filterForm: {},
+      editColumnConfig: {
+        label: '操作',
+        width: '150',
+        fixed: 'right',
+        setBtnGroup: this.setBtnGroup
+      },
+      rowBtns: {
+        // 表格上方操作按钮
+        add: {
+          text: '新增',
+          onClick: () => {
+            this.$router.push({name: 'payeeAdd'})
+          }
+        },
+        enable: {
+          text: '启用',
+          onClick: () => {
+            const table = this.$refs.erpTable.$refs.tableRef
+            const selection = table.selection
+            const ids = []
+            if (selection.length > 0) {
+              for (let i = 0; i < selection.length; i++) {
+                ids.push({
+                  id: selection[i].id,
+                  code: selection[i].code,
+                  version: selection[i].version
+                })
+              }
+              const params = {
+                idList: ids,
+                status: 1
+              }
+              this.PayeeService.payeeEnabled(params, true).then((res) => {
+                if (res.resultCode === 0) {
+                  this.$message.success('批量启用成功!')
+                } else {
+                  const msg = res.errorMsg
+                  this.$message.error(msg ? `批量启用失败:${msg}` : `批量启用失败`)
+                }
+                // 重新刷新表格
+                this.$refs.erpTable.refreshCurrentPage()
+              })
+            } else {
+              this.$message.error('请选择项目')
+            }
+          }
+        },
+        disable: {
+          text: '禁用',
+          onClick: () => {
+            const table = this.$refs.erpTable.$refs.tableRef
+            const selection = table.selection
+            const ids = []
+            if (selection.length > 0) {
+              for (let i = 0; i < selection.length; i++) {
+                ids.push({
+                  id: selection[i].id,
+                  code: selection[i].code,
+                  version: selection[i].version
+                })
+              }
+              const params = {
+                idList: ids,
+                status: 0
+              }
+              this.PayeeService.payeeEnabled(params, true).then((res) => {
+                if (res.resultCode === 0) {
+                  this.$message.success('批量禁用成功!')
+                } else {
+                  const msg = res.errorMsg
+                  this.$message.error(msg ? `批量禁用失败:${msg}` : `批量禁用失败`)
+                }
+                // 重新刷新表格
+                this.$refs.erpTable.refreshCurrentPage()
+              })
+            } else {
+              this.$message.error('请选择项目')
+            }
+          }
+        }
+      },
+      gridBtns: [],
+      query: true
+    }
+  },
+  mounted () {
+    this.doLayout()
+  },
+  methods: {
+    doLayout () {
+      this.$refs.erpFormTabel.doLayout()
+    },
+    submit () {
+      if (this.query) {
+        this.query = false
+        this.$refs.erpTable.refreshCurrentPage()
+      }
+      // table筛选
+      let reqData = {
+        payeeName: this.formData.payeeName,
+        bankName: this.formData.bankName,
+        province: this.formData.province,
+        city: this.formData.city,
+        bankAccountNo: this.formData.bankAccountNo,
+        creatorName: this.formData.creatorName,
+        createdAt: this.formData.createdAt === '' ? formatDate(this.formData.createdAt) : undefined,
+        cusOrgName: this.formData.cusOrgName,
+        isEnabled: this.formData.isEnabled
+      }
+      this.filterForm = Object.assign({}, reqData)
+    },
+    setBtnGroup (row) {
+      let editBtn = {
+        text: '修改',
+        type: 'text',
+        props: {
+          disabled: row.data.isEnabled === 1 ? true : false
+        },
+        onClick: (e, btnSelf, currentRowBtns) => {
+          this.$router.push({name: 'payeeUpdate', params: {id: row.data.id}})
+        }
+      }
+      let checkBtn = {
+        text: '详情',
+        type: 'text',
+        onClick: (e, btnSelf, currentRowBtns) => {
+          this.$router.push({ name: 'payeeDetail', params: {id: row.data.id} })
+        }
+      }
+      return [checkBtn, editBtn]
+    }
+  },
+  computed: {
+    ...mapState(['role']),
+    btnVisibles () {
+      return ['add', 'enable', 'disable']
+    }
+  }
+}
+</script>
+<style lang="stylus">
+</style>
diff --git a/template/src/views/expenses/payee/add.vue b/template/src/views/expenses/payee/add.vue
new file mode 100644
index 0000000000..95a103e04e
--- /dev/null
+++ b/template/src/views/expenses/payee/add.vue
@@ -0,0 +1,282 @@
+<template>
+<div class="payee_add">
+	<pagoda-row-btns class="mb-10" :btns="rowBtns" :visibles="btnVisibles">
+	</pagoda-row-btns>
+	<pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+	</pagoda-edit-form-table>
+</div>
+</template>
+
+<script>
+import {
+  remarkMaxlength,
+} from '@/utils/default-setting'
+import publicChoice from '@/views/expenses/publicChoice'
+
+export default {
+	name: 'payee_add',
+	data() {
+		return {
+      remarkMaxlength,
+			loading: true,
+			rowBtns: {
+				cancel: {
+					text: '取消',
+					onClick: this.handleCancel,
+					confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!'
+				},
+				save: {
+					text: '保存',
+					onClick: this.handleSave
+				}
+			},
+			tableData: [], // createTable详情单table专用
+			config: {
+				column: 3 // 一行放3列(label+value)
+			},
+			editable: true,
+			tableObjData: null,
+			cusOrg: {} // 存储选中的客户信息
+		}
+	},
+	mounted() {
+		// 初始化
+		this.setTableData()
+	},
+	methods: {
+		setTableData() {
+			this.loading = false
+			// 第一行
+			let code = {
+				title: '收款人代码',
+				value: '自动生成',
+				type: 'text',
+				key: 'code'
+			}
+			let payeeName = {
+				title: '收款人',
+				value: '',
+				type: 'input',
+				key: 'payeeName',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入收款人'
+				}
+			}
+			let bankName = {
+				title: '开户银行',
+				value: '',
+				type: 'bdc-select',
+				key: 'bankName',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择开户银行'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl1}/GeneralService/selectLookupValueByTypeCode?code=BAS_BANK_LIST`,
+					labelKey: 'value',
+					valueKey: 'value',
+					clearable: true
+				}
+			}
+			// 第二行
+			let registerBank = {
+				title: '银行支行',
+				value: '',
+				type: 'remark',
+				key: 'registerBank',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入银行支行'
+				},
+				props: {
+					text: '修改银行支行',
+					editable: true,
+					maxlength: remarkMaxlength
+				}
+			}
+			let province = {
+				title: '所在省份',
+				value: '',
+				type: 'bdc-select',
+				key: 'province',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择所在省份'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?pCode=0&levelType=10`,
+					labelKey: 'name',
+					valueKey: 'name',
+					clearable: true,
+					remote: 'name'
+				},
+				'on': {
+					input: (name, selectData) => {
+						if (city) {
+							city.value = ''
+							if (selectData) {
+								this.$nextTick(() => {
+									city.props.params.pCode = selectData.code
+									city.props.disabled = false
+								})
+							} else {
+								city.props.params.pCode = '0'
+								city.props.disabled = true
+							}
+						}
+					}
+				}
+			}
+			let city = {
+				title: '城市',
+				value: '',
+				type: 'bdc-select',
+				key: 'city',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择城市'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?levelType=20`,
+					params: {
+						pCode: '0'
+					},
+					labelKey: 'name',
+					valueKey: 'name',
+					clearable: true,
+					remote: 'name',
+					disabled: true
+				}
+			}
+			// 第三行
+			let bankAccountNo = {
+				title: '银行账号',
+				value: '',
+				type: 'input',
+				key: 'bankAccountNo',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入银行账号'
+				}
+			}
+			let cusOrgName = {
+				title: '所属客户',
+				value: '',
+				type: 'bdc-select',
+				key: 'cusOrgName',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择所属客户'
+				},
+				props: {
+					url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+					labelKey: 'name',
+					valueKey: 'name',
+					clearable: true,
+					remote: 'cusOrgName'
+				},
+				on: {
+					input: (value, selectData) => {
+						if (value && value !== '') {
+							this.cusOrg = {
+								cusOrgId: selectData.id,
+								cusOrgCode: selectData.code,
+								cusOrgName: selectData.name
+							}
+						} else {
+							this.cusOrg = {}
+						}
+					}
+				}
+			}
+			let isEnabled = {
+				title: '状态',
+				value: '',
+				type: 'select',
+				key: 'isEnabled',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请选择状态'
+				},
+				options: publicChoice.stateOptions,
+				props: {
+					clearable: true
+				}
+			}
+			// 第四行
+			let addr = {
+				title: '地址',
+				value: '',
+				type: 'remark',
+				key: 'addr',
+				required: true,
+				rules: {
+					required: true,
+					msg: '请输入地址'
+				},
+				props: {
+					text: '修改地址',
+					editable: true,
+					maxlength: remarkMaxlength
+				}
+			}
+
+			let tableData
+			tableData = [code, payeeName, bankName, registerBank, province, city, bankAccountNo, cusOrgName, isEnabled, addr]
+			this.tableData = tableData
+			this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+			this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+		},
+		handleCancel() {
+			this.$router.push({
+				name: 'expensesPayee'
+			})
+		},
+		handleSave() {
+      this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+        this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+        const params = this.$refs.editFormTable.resetValueData
+        // code自动生成,可以移出
+        delete params.code
+        params.cusOrgId = this.cusOrg.cusOrgId
+        params.cusOrgCode = this.cusOrg.cusOrgCode
+        params.cusOrgName = this.cusOrg.cusOrgName
+        // 发送新增请求
+        this.PayeeService.addPayee(params, true).then((res) => {
+          if (res.resultCode === 0) {
+            this.$message.success('新增成功')
+            setTimeout(() => {
+              this.$router.push({
+                name: 'expensesPayee'
+              })
+            }, 2000)
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `新增失败:${msg}` : `新增失败`)
+          }
+        })
+      }, (error) => {
+        let msgs = error.msgs.map((msg, i) => {
+          return error.items[i].title + msg
+        })
+        this.$message.error('校验不通过,' + msgs.join('、'))
+      })
+		}
+	},
+	created() {},
+	computed: {
+		btnVisibles() {
+			return ['cancel', 'save']
+		}
+	}
+}
+</script>
diff --git a/template/src/views/expenses/payee/detail.vue b/template/src/views/expenses/payee/detail.vue
new file mode 100644
index 0000000000..79b4ba4130
--- /dev/null
+++ b/template/src/views/expenses/payee/detail.vue
@@ -0,0 +1,167 @@
+<template>
+  <div class="payee_detail">
+    <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+    </pagoda-row-btns>
+    <pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+    </pagoda-edit-form-table>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'payee_detail',
+    data() {
+      return {
+        loading: true,
+        rowBtns: {
+          update: {
+            text: '修改',
+            onClick: this.handleEdit
+          },
+          cancel: {
+            text: '取消',
+            onClick: this.handleCancel
+          }
+        },
+        tableData: [], // createTable详情单table专用
+        isEnabled: true,
+        config: {
+          column: 3 // 一行放3列(label+value)
+        },
+        editable: true,
+        tableObjData: null
+      }
+    },
+    mounted() {
+      if (this.$route.params.id) {
+        this.setTableData(this.$route.params.id)
+      }
+    },
+    methods: {
+      setTableData(id) {
+        this.PayeeService.checkPayeeById({id: id}, true).then((res) => {
+          this.loading = false
+          if (res.resultCode === 0) {
+            const data = res.data
+            // 第一行
+            let code = {
+              title: '收款人代码',
+              value: data.code,
+              type: 'text',
+              key: '收款人代码'
+            }
+            let payeeName = {
+              title: '收款人',
+              value: data.payeeName,
+              type: 'text',
+              key: '收款人'
+            }
+            let bankName = {
+              title: '开户银行',
+              value: data.bankName,
+              type: 'text',
+              key: '开户银行'
+            }
+            // 第二行
+            let registerBank = {
+              title: '银行支行',
+              value: data.registerBank,
+              type: 'remark',
+              key: '银行支行'
+            }
+            let province = {
+              title: '所在省份',
+              value: data.province,
+              type: 'text',
+              key: '所在省份'
+            }
+            let city = {
+              title: '城市',
+              value: data.city,
+              type: 'text',
+              key: '城市'
+            }
+            // 第三行
+            let bankAccountNo = {
+              title: '银行账号',
+              value: data.bankAccountNo,
+              type: 'text',
+              key: '银行账号'
+            }
+            let cusOrgName = {
+              title: '所属客户',
+              value: data.cusOrgName,
+              type: 'text',
+              key: '所属客户'
+            }
+            let cusOrgCode = {
+              title: '客户代码',
+              value: data.cusOrgCode,
+              type: 'text',
+              key: '客户代码'
+            }
+            // 第四行
+            let addr = {
+              title: '地址',
+              value: data.addr,
+              type: 'remark',
+              key: '地址'
+            }
+            let creatorName = {
+              title: '录入人',
+              value: data.creatorName,
+              type: 'text',
+              key: '录入人'
+            }
+            let createdAt = {
+              title: '录入时间',
+              value: data.createdAt,
+              type: 'text',
+              key: '录入时间'
+            }
+            // 第五行
+            this.isEnabled = data.isEnabled === 1 ? true : false
+            let isEnabled = {
+              title: '状态',
+              value: data.isEnabled === 1 ? '启用' : '关闭',
+              type: 'text',
+              key: '状态'
+            }
+
+            let tableData
+            tableData = [code, payeeName, bankName, registerBank, province, city, bankAccountNo, cusOrgName, cusOrgCode, addr, creatorName, createdAt, isEnabled]
+            this.tableData = tableData
+            this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+            this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+          }
+        })
+      },
+      handleCancel() {
+        this.$router.push({
+          name: 'expensesPayee'
+        })
+      },
+      handleEdit() {
+        // 判断该项目是否被引用
+        if (this.isEnabled) {
+          this.$message({
+            message: `该项目已启用,无法修改!`,
+            type: 'warning'
+          })
+        } else {
+          this.$router.push({
+            name: 'payeeUpdate',
+            params: {
+              id: this.$route.params.id
+            }
+          })
+        }
+      }
+    },
+    computed: {
+      btnVisibles() {
+        return this.isEnabled ? ['cancel'] : ['cancel', 'update']
+      }
+    }
+  }
+</script>
diff --git a/template/src/views/expenses/payee/update.vue b/template/src/views/expenses/payee/update.vue
new file mode 100644
index 0000000000..16d205af8c
--- /dev/null
+++ b/template/src/views/expenses/payee/update.vue
@@ -0,0 +1,313 @@
+<template>
+<div class="payee_update">
+	<pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+	</pagoda-row-btns>
+	<pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+	</pagoda-edit-form-table>
+</div>
+</template>
+
+<script>
+import {
+  remarkMaxlength,
+} from '@/utils/default-setting'
+import publicChoice from '@/views/expenses/publicChoice'
+export default {
+	name: 'payee_update',
+	data() {
+		return {
+      remarkMaxlength,
+			loading: true,
+			rowBtns: {
+				cancel: {
+					text: '取消',
+					onClick: this.handleCancel,
+					confirm: '当前界面操作数据不保留,是否取消,确认后返回详情!'
+				},
+				save: {
+					text: '保存',
+					onClick: this.handleSave
+				}
+			},
+			tableData: [], // createTable详情单table专用
+			config: {
+				column: 3 // 一行放3列(label+value)
+			},
+			editable: true,
+			tableObjData: null,
+			id: null,
+			cusOrg: {},
+			version: 0
+		}
+	},
+	mounted() {
+		if (this.$route.params.id) {
+			this.setTableData(this.$route.params.id)
+		}
+	},
+	methods: {
+		setTableData(id) {
+			this.PayeeService.checkPayeeById({id: id}, true).then((res) => {
+				this.loading = false
+				if (res.resultCode === 0) {
+					const data = res.data
+					this.cusOrg = {
+						cusOrgId: data.cusOrgId,
+						cusOrgCode: data.cusOrgCode,
+						cusOrgName: data.cusOrgName
+					}
+					this.id = data.id
+					this.version = data.version
+					// 第一行
+					let code = {
+						title: '收款人代码',
+						value: data.code,
+						type: 'text',
+						key: 'code'
+					}
+					let payeeName = {
+						title: '收款人',
+						value: data.payeeName,
+						type: 'input',
+						key: 'payeeName',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请输入收款人'
+						}
+					}
+					let bankName = {
+						title: '开户银行',
+						value: data.bankName,
+						type: 'bdc-select',
+						key: 'bankName',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请选择开户银行'
+						},
+						props: {
+							url: `${this.AjaxService.devUrl1}/GeneralService/selectLookupValueByTypeCode?code=BAS_BANK_LIST`,
+							labelKey: 'value',
+							valueKey: 'value',
+							clearable: true
+						}
+					}
+					// 第二行
+					let registerBank = {
+						title: '银行支行',
+						value: data.registerBank,
+						type: 'remark',
+						key: 'registerBank',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请输入银行支行'
+						},
+						props: {
+							text: '修改银行支行',
+							editable: true,
+							maxlength: 150
+						}
+					}
+					let province = {
+						title: '所在省份',
+						value: data.province,
+						type: 'bdc-select',
+						key: 'province',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请选择所在省份'
+						},
+						props: {
+							url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?pCode=0&levelType=10`,
+							labelKey: 'name',
+							valueKey: 'name',
+							clearable: true,
+							remote: 'name'
+						},
+						'on': {
+							input: (name, selectData) => {
+								if (city) {
+									city.value = ''
+									if (selectData) {
+										this.$nextTick(() => {
+											city.props.params.pCode = selectData.code
+											city.props.disabled = false
+										})
+									} else {
+										city.props.params.pCode = '0'
+										city.props.disabled = true
+									}
+								}
+							}
+						}
+					}
+					let city = {
+						title: '城市',
+						value: data.city,
+						type: 'bdc-select',
+						key: 'city',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请选择城市'
+						},
+						props: {
+							url: `${this.AjaxService.devUrl1}/GeneralService/selectDistrictLikeName?levelType=20`,
+							params: {
+								pCode: '0'
+							},
+							labelKey: 'name',
+							valueKey: 'name',
+							clearable: true,
+							remote: 'name',
+							disabled: data.city !== '' ? false : true
+						}
+					}
+					// 第三行
+					let bankAccountNo = {
+						title: '银行账号',
+						value: data.bankAccountNo,
+						type: 'input',
+						key: 'bankAccountNo',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请输入银行账号'
+						}
+					}
+					let cusOrgName = {
+						title: '所属客户',
+						value: data.cusOrgName,
+						type: 'bdc-select',
+						key: 'cusOrgName',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请选择所属客户'
+						},
+						props: {
+							url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+							labelKey: 'name',
+							valueKey: 'name',
+							clearable: true,
+							remote: 'cusOrgName'
+						},
+						on: {
+							input: (name, selectData) => {
+								if (name && name !== '') {
+									this.cusOrg = {
+										cusOrgId: selectData.id,
+										cusOrgCode: selectData.code,
+										cusOrgName: selectData.name
+									}
+								} else {
+									this.cusOrg = {}
+								}
+							}
+						}
+					}
+					// 第四行
+					let addr = {
+						title: '地址',
+						value: data.addr,
+						type: 'remark',
+						key: 'addr',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请输入地址'
+						},
+						props: {
+							text: '修改地址',
+							editable: true,
+							maxlength: remarkMaxlength
+						}
+					}
+					let creatorName = {
+						title: '录入人',
+						value: data.creatorName,
+						type: 'text',
+						key: 'creatorName'
+					}
+					let createdAt = {
+						title: '录入时间',
+						value: data.createdAt,
+						type: 'text',
+						key: 'createdAt'
+					}
+					// 第五行
+					let isEnabled = {
+						title: '状态',
+						value: data.isEnabled,
+						type: 'select',
+						key: 'isEnabled',
+						required: true,
+						rules: {
+							required: true,
+							msg: '请选择状态'
+						},
+						options: publicChoice.stateOptions,
+						props: {
+							clearable: true
+						}
+					}
+					let tableData
+					tableData = [code, payeeName, bankName, registerBank, province, city, bankAccountNo, cusOrgName, addr, creatorName, createdAt, isEnabled]
+					this.tableData = tableData
+					this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+					this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+				}
+			})
+		},
+		handleSave() {
+			this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+				this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+				const params = this.$refs.editFormTable.resetValueData
+				// 移除干扰参数
+				delete params.creatorName
+				delete params.createdAt
+				// 添加ID
+				params.id = this.id
+				// 格式化客户信息
+				params.cusOrgId = this.cusOrg.cusOrgId
+				params.cusOrgCode = this.cusOrg.cusOrgCode
+				params.cusOrgName = this.cusOrg.cusOrgName
+				params.version = this.version
+				// 发送修改请求
+				console.log(params)
+				this.PayeeService.editPayee(params, true).then((res) => {
+					if (res.resultCode === 0) {
+						this.$message.success('修改成功')
+						setTimeout(() => {
+							this.$router.push({
+								name: 'payeeDetail'
+							})
+						}, 2000)
+					} else {
+						const msg = res.errorMsg
+						this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+					}
+				})
+			}, (error) => {
+				let msgs = error.msgs.map((msg, i) => {
+					return error.items[i].title + msg
+				})
+				this.$message.error('校验不通过,' + msgs.join('、'))
+			})
+		},
+		handleCancel() {
+			this.$router.push({
+				name: 'payeeDetail'
+			})
+		}
+	},
+	computed: {
+		btnVisibles() {
+			return ['cancel', 'save']
+		}
+	}
+}
+</script>
diff --git a/template/src/views/expenses/publicChoice.vue b/template/src/views/expenses/publicChoice.vue
new file mode 100644
index 0000000000..8241f5cde0
--- /dev/null
+++ b/template/src/views/expenses/publicChoice.vue
@@ -0,0 +1,44 @@
+<script>
+export default {
+	classesTypeOptions: [
+		{
+			label: '门店费用',
+			value: 1
+    }, {
+			label: '宿舍费用',
+			value: 2
+    }
+  ],
+	stateOptions: [
+		{
+			label: '启用',
+			value: 1
+    }, {
+			label: '关闭',
+			value: 0
+    }
+  ],
+  documentStatusOptions: [
+    {
+      label: '未提交',
+      value: 10
+    },
+    {
+      label: '待审核',
+      value: 20
+    },
+    {
+      label: '待付款',
+      value: 30
+    },
+    {
+      label: '已完成',
+      value: 40
+    },
+    {
+      label: '已拒绝',
+      value: 50
+    }
+  ]
+}
+</script>
diff --git a/template/src/views/expenses/requisition.vue b/template/src/views/expenses/requisition.vue
new file mode 100644
index 0000000000..5524ac7965
--- /dev/null
+++ b/template/src/views/expenses/requisition.vue
@@ -0,0 +1,661 @@
+<template>
+  <pagoda-erp-form-table
+    v-model="formData"
+    :form-options="formOptions"
+    :label-width="formLabelWidth"
+    ref="erpFormTabel"
+    @submit="submit"
+  >
+    <template slot="table-btns">
+      <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles"></pagoda-row-btns>
+    </template>
+    <template slot="table" slot-scope="scope">
+      <pagoda-erp-table-v2
+        dev
+        project-name="ERP2_New"
+        view="payee_cost_requisition"
+        :config="$viewConfig['payee_cost_requisition']"
+        :request-url="tableRequestUrl"
+        :empty="query"
+        :edit-column-config="editColumnConfig"
+        :table-filter-data="filterForm"
+        :summaryMethod="summaryMethod"
+        :head-selection="false"
+        :pageSize="10"
+        ref="erpTable"
+        :height="scope.height"
+        size="mini"
+        class="cost_requisition-list"
+      >
+        <template slot="registerBank" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false"
+                              v-model="scope.row['registerBank']"></pagoda-remark-cell>
+        </template>
+        <template slot="addr" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['addr']"></pagoda-remark-cell>
+        </template>
+        <template slot="sum" slot-scope="scope">
+          {{ formatMoney(scope.row['sum'], 4) }}
+        </template>
+        <template slot="remark" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+        </template>
+        <template slot="rejectReason" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false"
+                              v-model="scope.row['rejectReason']"></pagoda-remark-cell>
+        </template>
+        <template slot="rejectPayReason" slot-scope="scope">
+          <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false"
+                              v-model="scope.row['rejectPayReason']"></pagoda-remark-cell>
+        </template>
+      </pagoda-erp-table-v2>
+      <el-dialog class="dialog-view" title="拒绝原因" :visible.sync="rejectReason.show" width="300px">
+        <el-form ref="form">
+          <el-form-item style="width: 100%">
+            <el-input type="textarea" v-model="rejectReason.reason"></el-input>
+          </el-form-item>
+          <el-form-item style="width: 100%">
+            <el-button type="primary" @click="submitRejectReason">确定</el-button>
+            <el-button @click="cancelRejectReason">取消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+      <el-dialog class="dialog-view" title="拒绝付款原因" :visible.sync="rejectPayReason.show" width="300px">
+        <el-form ref="form">
+          <el-form-item>
+            <el-input type="textarea" v-model="rejectPayReason.reason"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="submitRejectPayReason">确定</el-button>
+            <el-button @click="cancelRejectPayReason">取消</el-button>
+          </el-form-item>
+        </el-form>
+      </el-dialog>
+    </template>
+  </pagoda-erp-form-table>
+</template>
+
+<script>
+  import { formLabelWidth, remarkMaxlength } from '@/utils/default-setting'
+  import searchCommon from '@/mixins/formSearchCommon'
+  import publicChoice from '@/views/expenses/publicChoice'
+  import {mapState} from 'vuex'
+  import { formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'requisition',
+    mixins: [searchCommon],
+    components: {},
+    data() {
+      return {
+        tableRequestUrl: `${this.AjaxService.devUrl1}/StoreCostAppHeadService/viewList`,
+        formLabelWidth,
+        remarkMaxlength,
+        formatMoney,
+        formData: {},
+        formOptions: [
+          {
+            label: '申请单号',
+            type: 'input',
+            key: 'costApplyNo'
+          },
+          {
+            label: '客户名称',
+            type: 'bdc-select',
+            key: 'cusOrgName',
+            props: {
+              url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+              labelKey: 'name',
+              valueKey: 'name',
+              clearable: true,
+              remote: 'cusOrgName'
+            }
+          },
+          {
+            label: '录入人',
+            type: 'input',
+            key: 'creatorName'
+          },
+          {
+            label: '费用类型',
+            type: 'select',
+            key: 'costType',
+            options: publicChoice.classesTypeOptions,
+            props: {
+              clearable: true
+            }
+          },
+          {
+            label: '开户银行',
+            type: 'bdc-select',
+            key: 'bankName',
+            props: {
+              url: `${this.AjaxService.devUrl1}/GeneralService/selectLookupValueByTypeCode?code=BAS_BANK_LIST`,
+              labelKey: 'value',
+              valueKey: 'value',
+              clearable: true
+            }
+          },
+          {
+            label: '录入日期',
+            type: 'date-picker',
+            key: 'date',
+            props: {
+              type: 'daterange'
+            }
+          },
+          {
+            label: '单据状态',
+            type: 'select',
+            key: 'status',
+            options: publicChoice.documentStatusOptions,
+            props: {
+              clearable: true
+            }
+          }
+        ],
+        filterForm: {},
+        editColumnConfig: {
+          label: '操作',
+          width: '150',
+          fixed: 'right',
+          collapse: true,
+          setBtnGroup: this.setBtnGroup
+        },
+        rowBtns: {
+          // 表格上方操作按钮
+          add: {
+            text: '新增',
+            onClick: () => {
+              this.$router.push({name: 'requisitionAdd'})
+            }
+          },
+          submit: {
+            text: '提交',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const headList = []
+                for (let i = 0; i < selection.length; i++) {
+                  headList.push({
+                    id: selection[i].id,
+                    costApplyNo: selection[i].costApplyNo,
+                    rejectPayReason: '',
+                    rejectReason: ''
+                  })
+                }
+                const params = {
+                  headList: headList,
+                  newStatus: 20
+                }
+                this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('批量提交成功!')
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+                  }
+                  // 重新刷新表格
+                  this.$refs.erpTable.refreshCurrentPage()
+                })
+              }
+            }
+          },
+          resolve: {
+            text: '同意',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const headList = []
+                for (let i = 0; i < selection.length; i++) {
+                  headList.push({
+                    id: selection[i].id,
+                    costApplyNo: selection[i].costApplyNo,
+                    rejectPayReason: '',
+                    rejectReason: ''
+                  })
+                }
+                const params = {
+                  headList: headList,
+                  newStatus: 30
+                }
+                this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('批量提交成功!')
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+                  }
+                  // 重新刷新表格
+                  this.$refs.erpTable.refreshCurrentPage()
+                })
+              }
+            }
+          },
+          reject: {
+            text: '拒绝',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                // 打开原因显示
+                this.rejectReason = {
+                  selection: selection,
+                  reason: '',
+                  show: true
+                }
+              }
+            }
+          },
+          pay: {
+            text: '付款',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const headList = []
+                for (let i = 0; i < selection.length; i++) {
+                  headList.push({
+                    id: selection[i].id,
+                    costApplyNo: selection[i].costApplyNo,
+                    rejectPayReason: '',
+                    rejectReason: ''
+                  })
+                }
+                const params = {
+                  headList: headList,
+                  newStatus: 40
+                }
+                this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('批量提交成功!')
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+                  }
+                  // 重新刷新表格
+                  this.$refs.erpTable.refreshCurrentPage()
+                })
+              }
+            }
+          },
+          dishonour: {
+            text: '拒绝付款',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                // 打开原因显示
+                this.rejectPayReason = {
+                  selection: selection,
+                  reason: '',
+                  show: true
+                }
+              }
+            }
+          },
+          cancelAudit: {
+            text: '取消审核',
+            onClick: () => {
+              const table = this.$refs.erpTable.$refs.tableRef
+              const selection = table.selection
+              if (!selection || selection.length === 0) {
+                this.$message.error('请选择项目')
+              } else {
+                const headList = []
+                for (let i = 0; i < selection.length; i++) {
+                  headList.push({
+                    id: selection[i].id,
+                    costApplyNo: selection[i].costApplyNo,
+                    rejectPayReason: '',
+                    rejectReason: ''
+                  })
+                }
+                const params = {
+                  headList: headList,
+                  newStatus: 20
+                }
+                this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+                  if (res.resultCode === 0) {
+                    this.$message.success('批量提交成功!')
+                  } else {
+                    const msg = res.errorMsg
+                    this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+                  }
+                  // 重新刷新表格
+                  this.$refs.erpTable.refreshCurrentPage()
+                })
+              }
+            }
+          }
+        },
+        summaryMethod: {
+          sum: function (tableData) {
+            let sum = 0
+            tableData.forEach(item => {
+              sum += formatMoneyToNumber(item.sum)
+            })
+            return formatMoney(sum, 4)
+          }
+        },
+        query: true,
+        dialogVisible: false,
+        rejectReason: {
+          selection: [],
+          reason: '',
+          show: false
+        },
+        rejectPayReason: {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      }
+    },
+    mounted () {
+      this.doLayout()
+    },
+    methods: {
+      doLayout () {
+        this.$refs.erpFormTabel.doLayout()
+      },
+      submit() {
+        if (this.query) {
+          this.query = false
+          this.$refs.erpTable.refreshCurrentPage()
+        }
+        // table筛选
+        let reqData = {
+          costApplyNo: this.formData.costApplyNo,
+          cusOrgName: this.formData.cusOrgName,
+          creatorName: this.formData.creatorName,
+          costType: this.formData.costType,
+          bankName: this.formData.bankName,
+          startDate: this.formData.date ? this.formData.date[0] : '',
+          endDate: this.formData.date ? this.formData.date[1] : '',
+          status: this.formData.status
+        }
+        this.filterForm = Object.assign({}, reqData)
+      },
+      setBtnGroup(row) {
+        let editBtn = {
+          text: '修改',
+          props: {
+            disabled: row.data.status !== 10
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            if (this.role.name !== '店长') {
+              this.$message({
+                message: `您的角色权限有限,无法进行修改操作!`,
+                type: 'warning'
+              })
+            } else {
+              this.$router.push({name: 'requisitionUpdate', params: {id: row.data.id}})
+            }
+          }
+        }
+        let checkBtn = {
+          text: '详情',
+          onClick: (e, btnSelf, currentRowBtns) => {
+            this.$router.push({name: 'requisitionDetail', params: {id: row.data.id}})
+          }
+        }
+        let submitBtn = {
+          text: '提交',
+          props: {
+            disabled: row.data.status !== 10
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            const params = {
+              headList: [{
+                id: row.data.id,
+                costApplyNo: row.data.costApplyNo,
+                rejectPayReason: '',
+                rejectReason: ''
+              }],
+              newStatus: 20
+            }
+            this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+              console.log(res.resultCode)
+              if (res.resultCode === 0) {
+                this.$message.success('提交成功!')
+              } else {
+                const msg = res.errorMsg
+                this.$message.error(msg ? `提交失败:${msg}` : `提交失败`)
+              }
+              // 重新刷新表格
+              this.$refs.erpTable.refreshCurrentPage()
+            })
+          },
+        }
+        let resolveBtn = {
+          text: '同意',
+          props: {
+            disabled: row.data.status !== 20
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            const params = {
+              headList: [{
+                id: row.data.id,
+                costApplyNo: row.data.costApplyNo,
+                rejectPayReason: '',
+                rejectReason: ''
+              }],
+              newStatus: 30
+            }
+            this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+              if (res.resultCode === 0) {
+                this.$message.success('批量提交成功!')
+              } else {
+                const msg = res.errorMsg
+                this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+              }
+              // 重新刷新表格
+              this.$refs.erpTable.refreshCurrentPage()
+            })
+          }
+        }
+
+        let rejectBtn = {
+          text: '拒绝',
+          props: {
+            disabled: row.data.status !== 20
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            // 打开原因显示
+            this.rejectReason = {
+              selection: [row.data],
+              reason: '',
+              show: true
+            }
+          }
+        }
+
+        let payBtn = {
+          text: '付款',
+          props: {
+            disabled: row.data.status !== 30
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            const params = {
+              headList: [{
+                id: row.data.id,
+                costApplyNo: row.data.costApplyNo,
+                rejectPayReason: '',
+                rejectReason: ''
+              }],
+              newStatus: 40
+            }
+            this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+              if (res.resultCode === 0) {
+                this.$message.success('批量提交成功!')
+              } else {
+                const msg = res.errorMsg
+                this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+              }
+              // 重新刷新表格
+              this.$refs.erpTable.refreshCurrentPage()
+            })
+          }
+        }
+
+        let dishonourBtn = {
+          text: '拒绝付款',
+          props: {
+            disabled: row.data.status !== 30
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            // 打开原因显示
+            this.rejectPayReason = {
+              selection: [row.data],
+              reason: '',
+              show: true
+            }
+          }
+        }
+
+        let cancelAuditBtn = {
+          text: '取消审核',
+          props: {
+            disabled: row.data.status !== 20 && row.data.status !== 30
+          },
+          onClick: (e, btnSelf, currentRowBtns) => {
+            const params = {
+              headList: [{
+                id: row.data.id,
+                costApplyNo: row.data.costApplyNo,
+                rejectPayReason: '',
+                rejectReason: ''
+              }],
+              newStatus: 20
+            }
+            this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+              if (res.resultCode === 0) {
+                this.$message.success('批量提交成功!')
+              } else {
+                const msg = res.errorMsg
+                this.$message.error(msg ? `批量提交失败:${msg}` : `批量提交失败`)
+              }
+              // 重新刷新表格
+              this.$refs.erpTable.refreshCurrentPage()
+            })
+          }
+        }
+
+        let btnsObj = {
+          '店长': [editBtn, checkBtn, submitBtn],
+          '会计': [checkBtn, resolveBtn, rejectBtn, cancelAuditBtn],
+          // '出纳': [checkBtn, payBtn, dishonourBtn, cancelAuditBtn]
+          '出纳': [checkBtn, payBtn, dishonourBtn]
+        }
+        if (btnsObj[this.role.name]) {
+          return btnsObj[this.role.name]
+        } else {
+          return [checkBtn]
+        }
+      },
+      submitRejectReason() {
+        const headList = []
+        for (let i = 0; i < this.rejectReason.selection.length; i++) {
+          headList.push({
+            id: this.rejectReason.selection[i].id,
+            costApplyNo: this.rejectReason.costApplyNo,
+            rejectPayReason: '',
+            rejectReason: this.rejectReason.reason
+          })
+        }
+        const params = {
+          headList: headList,
+          newStatus: 50
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          this.cancelRejectReason()
+          if (res.resultCode === 0) {
+            this.$message.success('批量拒绝成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `批量拒绝失败:${msg}` : `批量拒绝失败`)
+          }
+          // 重新刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      cancelRejectReason() {
+        this.rejectReason = {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      },
+      submitRejectPayReason() {
+        const headList = []
+        for (let i = 0; i < this.rejectPayReason.selection.length; i++) {
+          headList.push({
+            id: this.rejectPayReason.selection[i].id,
+            costApplyNo: this.rejectPayReason.costApplyNo,
+            rejectPayReason: this.rejectPayReason.reason,
+            rejectReason: ''
+          })
+        }
+        const params = {
+          headList: headList,
+          newStatus: 50
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          this.cancelRejectPayReason()
+          if (res.resultCode === 0) {
+            this.$message.success('批量拒绝付款成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `批量拒绝付款失败:${msg}` : `批量拒绝付款失败`)
+          }
+          // 重新刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      cancelRejectPayReason() {
+        this.rejectPayReason = {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles() { // 设置操作按钮数组
+        let btnsObj = {
+          '店长': ['add', 'submit'],
+          '会计': ['resolve', 'reject', 'cancelAudit'],
+          '出纳': ['pay', 'dishonour']
+        }
+        if (btnsObj[this.role.name]) {
+          return btnsObj[this.role.name]
+        } else {
+          return []
+        }
+      }
+    }
+  }
+</script>
+<style lang="css">
+  .dialog-view .el-form .el-form-item__content {
+    width: 100%;
+    text-align: center;
+  }
+  .cost_requisition-list .sum{
+    text-align: right;
+  }
+</style>
diff --git a/template/src/views/expenses/requisition/add.vue b/template/src/views/expenses/requisition/add.vue
new file mode 100644
index 0000000000..d6a28d32e7
--- /dev/null
+++ b/template/src/views/expenses/requisition/add.vue
@@ -0,0 +1,367 @@
+<template>
+  <div class="requisition_detail">
+    <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+    </pagoda-row-btns>
+    <pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+      <template slot="cusOrgCode" slot-scope="scope">
+        <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+        <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+      </template>
+    </pagoda-edit-form-table>
+    <el-tabs type="card">
+      <el-tab-pane label="费用明细">
+        <pagoda-erp-table-v2
+          project-name="ERP2_New"
+          view="payee_cost_classes_subitem"
+          :config="$viewConfig['payee_cost_classes_subitem']"
+          :defaultData="classesTableData"
+          ref="erpTable"
+          :summaryMethod="summaryMethod"
+          v-loading="tableLoading"
+          :on="onMethod"
+        >
+          <template slot="remark" slot-scope="scope">
+            <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+          </template>
+        </pagoda-erp-table-v2>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import { formatDate, formatMoney, formatMoneyToNumber, isEmpty } from '@/utils/utils'
+import { remarkMaxlength } from '@/utils/default-setting'
+import publicChoice from '@/views/expenses/publicChoice'
+
+export default {
+  name: 'requisition_detail',
+  data () {
+    return {
+      remarkMaxlength,
+      loading: true,
+      rowBtns: {
+        save: { text: '保存', onClick: this.handleSave},
+        cancel: { text: '取消', onClick: this.handleCancel, confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!' }
+      },
+      tableData: [], // createTable详情单table专用
+      config: {
+        column: 3 // 一行放3列(label+value)
+      },
+      editable: true,
+      tableObjData: null,
+      cusOrg: {},
+      costType: {},
+      payee: {},
+      classesTableData: [],
+      summaryMethod: {
+        amount: function (tableData) {
+          let sum = 0
+          tableData.forEach(item => {
+            sum += formatMoneyToNumber(item.amount)
+          })
+          return formatMoney(sum, 4)
+        }
+      },
+      tableLoading: false,
+      onMethod: {
+        amount: {
+          blur: (event) => {
+            let value = event.target.value
+            // 格式化输入的值
+            value = parseFloat(formatMoneyToNumber(value), 10)
+            event.target.value = formatMoney(value, 4)
+            // 重新计算合计
+            this.$refs.erpTable.pageTotal()
+          }
+        }
+      }
+    }
+  },
+  mounted () {
+    this.setTableData()
+  },
+  methods: {
+    setTableData (id) {
+      // 第一行
+      let costApplyNo = { title: '申请单号', value: '自动生成', type: 'text', key: 'costApplyNo' }
+      let cusOrgCode = {
+        title: '客户代码',
+        value: '',
+        type: 'bdc-select',
+        key: 'cusOrgCode',
+        required: true,
+        rules: {
+          required: true,
+          msg: '请选择客户代码'
+        },
+        props: {
+          url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+          labelKey: 'code',
+          valueKey: 'code',
+          clearable: true,
+          remote: 'cusOrgName'
+        },
+        on: {
+          input: (value, selectData) => {
+            if (value && value !== '') {
+              this.cusOrg = {
+                cusOrgId: selectData.id,
+                cusOrgCode: selectData.code,
+                cusOrgName: selectData.name
+              }
+              if (cusOrgName) {
+                cusOrgName.value = selectData.name
+              }
+            } else {
+              this.cusOrg = {}
+              cusOrgName.value = '选择客户代码自动带出'
+            }
+          }
+        }
+      }
+      let cusOrgName = { title: '客户名称', value: '选择客户代码自动带出', type: 'text', key: 'cusOrgName' }
+      // 第二行
+      let costTypeName = {
+        title: '费用类型',
+        value: '',
+        type: 'select',
+        required: true,
+        rules: {
+          required: true,
+          msg: '请选择状态'
+        },
+        options: publicChoice.classesTypeOptions,
+        key: 'costTypeName',
+        on: {
+          change: (value) => {
+            if (value && value !== '') {
+              this.costType = {
+                name: publicChoice.classesTypeOptions.filter(item => item.value === value)[0].label,
+                value: value
+              }
+            } else {
+              this.costType = {}
+            }
+          }
+        }
+      }
+      let payeeName = {
+        title: '收款人',
+        value: '',
+        type: 'text',
+        key: '收款人',
+        type: 'bdc-select',
+        key: 'payeeName',
+        required: true,
+        rules: {
+          required: true,
+          msg: '请选择收款人'
+        },
+        props: {
+          url: `${this.AjaxService.devUrl1}/BasPayeeDefService/findByPayeeName`,
+          labelKey: 'payeeName',
+          valueKey: 'payeeName',
+          clearable: true,
+          remote: 'payeeName'
+        },
+        on: {
+          input: (value, selectData) => {
+            if (value && value !== '') {
+              this.payee = {
+                id: selectData.id,
+                payeeName: selectData.payeeName,
+                bankName: selectData.bankName,
+                registerBank: selectData.registerBank,
+                bankAccountNo: selectData.bankAccountNo,
+                province: selectData.province,
+                city: selectData.city,
+                addr: selectData.addr
+              }
+              if (bankName) {
+                bankName.value = selectData.bankName
+              }
+              if (registerBank) {
+                registerBank.value = selectData.registerBank
+              }
+              if (bankAccountNo) {
+                bankAccountNo.value = selectData.bankAccountNo
+              }
+              if (province) {
+                province.value = selectData.province
+              }
+              if (city) {
+                city.value = selectData.city
+              }
+              if (addr) {
+                addr.value = selectData.addr
+              }
+            } else {
+              this.payee = {}
+              bankName.value = '根据收款人自动带出'
+              registerBank.value = '根据收款人自动带出'
+              bankAccountNo.value = '根据收款人自动带出'
+              province.value = '根据收款人自动带出'
+              city.value = '根据收款人自动带出'
+              addr.value = '根据收款人自动带出'
+            }
+          }
+        }
+      }
+      let bankName = { title: '开户银行', value: '根据收款人自动带出', type: 'text', key: 'bankName' }
+      // 第三行
+      let registerBank = { title: '银行支行', value: '根据收款人自动带出', type: 'remark', key: 'registerBank' }
+      let bankAccountNo = { title: '银行账号', value: '根据收款人自动带出', type: 'text', key: 'bankAccountNo' }
+      let province = { title: '省份', value: '根据收款人自动带出', type: 'text', key: 'province' }
+      // 第四行
+      let city = { title: '城市', value: '根据收款人自动带出', type: 'text', key: 'city' }
+      let addr = { title: '地址', value: '根据收款人自动带出', type: 'remark', key: 'addr' }
+      let status = { title: '单证状态', value: '未提交', type: 'text', key: 'status' }
+      // 第五行
+      let image = { title: '图片上传', value: '', type: 'text', key: 'image' }
+      let remark = {
+        title: '备注',
+        value: '',
+        type: 'remark',
+        key: 'remark',
+        props: {
+          text: '修改备注',
+          editable: true,
+          maxlength: remarkMaxlength
+        }
+      }
+
+      let tableData
+      tableData = [costApplyNo, cusOrgCode, cusOrgName, costTypeName, payeeName, bankName, registerBank, bankAccountNo, province, city, addr, status, image, remark]
+      this.tableData = tableData
+      this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+      this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+      // 默认选择门店
+      this.$nextTick(() => {
+        costTypeName.value = 1
+        this.costType = {
+          name: '门店费用',
+          value: 1
+        }
+      })
+    },
+    handleCancel () {
+      this.$router.push({name: 'expensesRequisition'})
+    },
+    handleSave () {
+      this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+        this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+        const formData = this.$refs.editFormTable.resetValueData
+        // 判断以下关键字段是否为空
+        if (isEmpty(this.cusOrg)) {
+          this.$message.error('请重新选择客户代码!')
+          return
+        }
+        if (isEmpty(this.costType)) {
+          this.$message.error('请重新选择费用类型!')
+          return
+        }
+        if (isEmpty(this.payee)) {
+          this.$message.error('请重新选择收款人!')
+          return
+        }
+        const table = this.$refs.erpTable
+        if (table.validateEditingItems()) {
+          // 构造请求参数
+          const detailList = []
+          const list = table.$refs.tableRef.tableData.data
+          list.forEach(item => {
+            detailList.push({
+              amount: formatMoneyToNumber(item.amount),
+              costCatId: item.costCatId,
+              costCatName: item.costCatName,
+              periorBegin: `${ item.periorBegin } 00:00:00`,
+              periorEnd: `${ item.periorEnd } 23:59:59`,
+              remark: item.remark
+            })
+          })
+          const params = {
+            addr: this.payee.addr,
+            bankAccountNo: this.payee.bankAccountNo,
+            bankName: this.payee.bankName,
+            city: this.payee.city,
+            costType: this.costType.value,
+            costTypeName: this.costType.name,
+            cusOrgCode: this.cusOrg.cusOrgCode,
+            cusOrgId: this.cusOrg.cusOrgId,
+            cusOrgName: this.cusOrg.cusOrgName,
+            detailList: detailList,
+            imageUrl: formData.image,
+            payeeId: this.payee.id,
+            payeeName: this.payee.payeeName,
+            province: this.payee.province,
+            registerBank: this.payee.registerBank,
+            remark: formData.remark,
+          }
+          this.PayeeService.addRequisition(params, true).then((res) => {
+            if (res.resultCode === 0) {
+              this.$message.success('新增成功')
+              setTimeout(() => {
+                this.$router.push({
+                  name: 'expensesRequisition'
+                })
+              }, 2000)
+            } else {
+              const msg = res.errorMsg
+              this.$message.error(msg ? `新增失败:${msg}` : `新增失败`)
+            }
+          })
+        } else {
+          this.$message.error('请填写完整必填信息!')
+        }
+      }, (error) => {
+        let msgs = error.msgs.map((msg, i) => {
+          return error.items[i].title + msg
+        })
+        this.$message.error('校验不通过,' + msgs.join('、'))
+      })
+    },
+    getClassesTableData(value) {
+      this.tableLoading = true
+      this.PayeeService.checkRequisitionByType({ costType: value }).then((res) => {
+        this.tableLoading = false
+        if (res.resultCode === 0) {
+          const data = res.data
+          data.content.forEach(item => {
+            // 列表添加
+            const table = this.$refs.erpTable
+            this.$nextTick(() => {
+              table.newRows([{
+                costCatId: item.id,
+                costCatName: item.name,
+                amount: '0.0000',
+                periorBegin: formatDate(new Date(), 'date'),
+                periorEnd: formatDate(new Date(), 'date'),
+                remark: ''
+              }])
+            })
+          })
+        }
+      })
+    }
+  },
+  computed: {
+    btnVisibles () {
+      return ['cancel', 'save']
+    }
+  },
+  watch: {
+    costType: {
+      handler(newName, oldName) {
+        // 清空表格
+        this.$refs.erpTable.$refs.tableRef.tableData.data = []
+        if (newName.value) {
+          // 根据费用类型显示不同的费用明细
+          this.getClassesTableData(newName.value)
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
diff --git a/template/src/views/expenses/requisition/detail.vue b/template/src/views/expenses/requisition/detail.vue
new file mode 100644
index 0000000000..3a3a6bce02
--- /dev/null
+++ b/template/src/views/expenses/requisition/detail.vue
@@ -0,0 +1,399 @@
+<template>
+  <div class="requisition_detail">
+    <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+    </pagoda-row-btns>
+    <pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+    </pagoda-edit-form-table>
+    <el-tabs type="card">
+      <el-tab-pane label="费用明细">
+        <pagoda-erp-table-v2
+          project-name="ERP2_New"
+          view="payee_cost_requisition_subitem"
+          :config="$viewConfig['payee_cost_classes_subitem']"
+          :defaultData="classesTableData"
+          ref="erpTable"
+          :summaryMethod="summaryMethod"
+          class="cost_requisition_subitem_list"
+        >
+          <template slot="amount" slot-scope="scope">
+            {{ formatMoney(scope.row['amount'], 4) }}
+          </template>
+          <template slot="remark" slot-scope="scope">
+            <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="false" v-model="scope.row['remark']"></pagoda-remark-cell>
+          </template>
+        </pagoda-erp-table-v2>
+      </el-tab-pane>
+    </el-tabs>
+    <el-dialog class="dialog-view" title="拒绝原因" :visible.sync="rejectReason.show" width="300px">
+      <el-form ref="form">
+        <el-form-item style="width: 100%">
+          <el-input type="textarea" v-model="rejectReason.reason"></el-input>
+        </el-form-item>
+        <el-form-item style="width: 100%">
+          <el-button type="primary" @click="submitRejectReason">确定</el-button>
+          <el-button @click="cancelRejectReason">取消</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <el-dialog class="dialog-view" title="拒绝付款原因" :visible.sync="rejectPayReason.show" width="300px">
+      <el-form ref="form">
+        <el-form-item>
+          <el-input type="textarea" v-model="rejectPayReason.reason"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submitRejectPayReason">确定</el-button>
+          <el-button @click="cancelRejectPayReason">取消</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import {mapState} from 'vuex'
+  import {remarkMaxlength,} from '@/utils/default-setting'
+  import publicChoice from '@/views/expenses/publicChoice'
+  import { formatMoney, formatMoneyToNumber } from '@/utils/utils'
+
+  export default {
+    name: 'requisition_detail',
+    data() {
+      return {
+        remarkMaxlength,
+        formatMoney,
+        loading: true,
+        gridBtns: [],
+        rowBtns: {
+          update: {
+            text: '修改',
+            onClick: this.handleEdit
+          },
+          cancel: {text: '取消', onClick: this.handleCancel},
+          submit: {
+            text: '提交',
+            onClick: this.handleSubmit
+          },
+          resolve: {
+            text: '同意',
+            onClick: this.handleResolve
+          },
+          reject: {
+            text: '拒绝',
+            onClick: this.handleReject
+          },
+          pay: {
+            text: '付款',
+            onClick: this.handlePay
+          },
+          dishonour: {
+            text: '拒绝付款',
+            onClick: this.handleDishonour
+          },
+          cancelAudit: {
+            text: '取消审核',
+            onClick: this.handleCancelAudit
+          }
+        },
+        tableData: [], // createTable详情单table专用
+        config: {
+          column: 3 // 一行放3列(label+value)
+        },
+        summaryMethod: {
+          amount: function (tableData) {
+            let sum = 0
+            tableData.forEach(item => {
+              sum += formatMoneyToNumber(item.amount)
+            })
+            return formatMoney(sum, 4)
+          }
+        },
+        editable: false,
+        tableObjData: null,
+        costApplyNo: '',
+        status: 0,
+        classesTableData: [],
+        rejectReason: {
+          selection: [],
+          reason: '',
+          show: false
+        },
+        rejectPayReason: {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      }
+    },
+    mounted() {
+      if (this.$route.params.id) {
+        this.setTableData(this.$route.params.id)
+      }
+    },
+    methods: {
+      setTableData(id) {
+        this.PayeeService.checkRequisitionById({id: id}, true).then((res) => {
+          this.loading = false
+          if (res.resultCode === 0) {
+            const data = res.data
+            // 第一行
+            let costApplyNo = {title: '申请单号', value: data.costApplyNo, type: 'text', key: '申请单号'}
+            this.costApplyNo = data.costApplyNo
+            let cusOrgCode = {title: '客户代码', value: data.cusOrgCode, type: 'text', key: '客户代码'}
+            let cusOrgName = {title: '客户名称', value: data.cusOrgName, type: 'text', key: '客户名称'}
+            // 第二行
+            let costTypeName = {title: '费用类型', value: data.costTypeName, type: 'text', key: '费用类型'}
+            let payeeName = {title: '收款人', value: data.payeeName, type: 'text', key: '收款人'}
+            let bankName = {title: '开户银行', value: data.bankName, type: 'text', key: '开户银行'}
+            // 第三行
+            let registerBank = {title: '银行支行', value: data.registerBank, type: 'remark', key: '银行支行'}
+            let bankAccountNo = {title: '银行账号', value: data.bankAccountNo, type: 'text', key: '银行账号'}
+            let province = {title: '省份', value: data.province, type: 'text', key: '省份'}
+            // 第四行
+            let city = {title: '城市', value: data.city, type: 'text', key: '城市'}
+            let addr = {title: '地址', value: data.addr, type: 'remark', key: '地址'}
+            let status = {title: '单证状态', value: this.getStatusLabel(data.status), type: 'text', key: '单证状态'}
+            this.status = data.status
+            // 第五行
+            let image = {title: '图片上传', value: data.image, type: 'text', key: '图片上传'}
+            let remark = {title: '备注', value: data.remark, type: 'remark', key: '备注'}
+
+            let tableData
+            tableData = [costApplyNo, cusOrgCode, cusOrgName, costTypeName, payeeName, bankName, registerBank, bankAccountNo, province, city, addr, status, image, remark]
+            this.tableData = tableData
+            this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+            this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+            // 格式化
+            if (data.detailList.length > 0) {
+              data.detailList.forEach(item => {
+                item.amount = parseFloat(item.amount).toFixed(2)
+              })
+            }
+            // 提取费用类型,存入erp-table-v2
+            this.classesTableData = data.detailList
+            // 刷新表格
+            this.$refs.erpTable.refreshCurrentPage()
+          }
+        })
+      },
+      handleCancel() {
+        this.$router.push({name: 'expensesRequisition'})
+      },
+      handleEdit() {
+        this.$router.push({name: 'requisitionUpdate', params: {id: this.$route.params.id}})
+      },
+      handleSubmit() {
+        const params = {
+          headList: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo,
+            rejectPayReason: '',
+            rejectReason: ''
+          }],
+          newStatus: 20
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          console.log(res.resultCode)
+          if (res.resultCode === 0) {
+            this.$message.success('提交成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `提交失败:${msg}` : `提交失败`)
+          }
+          // 重新刷新
+          this.setTableData(this.$route.params.id)
+          // 刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      handleResolve() {
+        const params = {
+          headList: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo,
+            rejectPayReason: '',
+            rejectReason: ''
+          }],
+          newStatus: 30
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          console.log(res.resultCode)
+          if (res.resultCode === 0) {
+            this.$message.success('同意成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `同意失败:${msg}` : `同意失败`)
+          }
+          // 重新刷新
+          this.setTableData(this.$route.params.id)
+          // 刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      handleReject() {
+        // 打开原因显示
+        this.rejectReason = {
+          selection: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo
+          }],
+          reason: '',
+          show: true
+        }
+      },
+      handleCancelAudit() {
+        const params = {
+          headList: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo,
+            rejectPayReason: '',
+            rejectReason: ''
+          }],
+          newStatus: 20
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          console.log(res.resultCode)
+          if (res.resultCode === 0) {
+            this.$message.success('取消审核成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `取消审核失败:${msg}` : `取消审核失败`)
+          }
+          // 重新刷新
+          this.setTableData(this.$route.params.id)
+          // 刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      handlePay() {
+        const params = {
+          headList: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo,
+            rejectPayReason: '',
+            rejectReason: ''
+          }],
+          newStatus: 40
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          console.log(res.resultCode)
+          if (res.resultCode === 0) {
+            this.$message.success('付款成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `付款失败:${msg}` : `付款失败`)
+          }
+          // 重新刷新
+          this.setTableData(this.$route.params.id)
+          // 刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      handleDishonour() {
+        // 打开原因显示
+        this.rejectPayReason = {
+          selection: [{
+            id: this.$route.params.id,
+            costApplyNo: this.costApplyNo
+          }],
+          reason: '',
+          show: true
+        }
+      },
+      getStatusLabel(value) {
+        return publicChoice.documentStatusOptions.filter(item => item.value === value)[0].label
+      },
+      submitRejectReason() {
+        const headList = []
+        for (let i = 0; i < this.rejectReason.selection.length; i++) {
+          headList.push({
+            id: this.rejectReason.selection[i].id,
+            costApplyNo: this.rejectReason.selection[i].costApplyNo,
+            rejectPayReason: '',
+            rejectReason: this.rejectReason.reason
+          })
+        }
+        const params = {
+          headList: headList,
+          newStatus: 50
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          this.cancelRejectReason()
+          if (res.resultCode === 0) {
+            this.$message.success('批量拒绝成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `批量拒绝失败:${msg}` : `批量拒绝失败`)
+          }
+          // 重新刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      cancelRejectReason() {
+        this.rejectReason = {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      },
+      submitRejectPayReason() {
+        const headList = []
+        for (let i = 0; i < this.rejectPayReason.selection.length; i++) {
+          headList.push({
+            id: this.rejectPayReason.selection[i].id,
+            costApplyNo: this.rejectPayReason.selection[i].costApplyNo,
+            rejectPayReason: this.rejectPayReason.reason,
+            rejectReason: ''
+          })
+        }
+        const params = {
+          headList: headList,
+          newStatus: 50
+        }
+        this.PayeeService.setRequisitionStatus(params, true).then((res) => {
+          this.cancelRejectPayReason()
+          if (res.resultCode === 0) {
+            this.$message.success('批量拒绝付款成功!')
+          } else {
+            const msg = res.errorMsg
+            this.$message.error(msg ? `批量拒绝付款失败:${msg}` : `批量拒绝付款失败`)
+          }
+          // 重新刷新表格
+          this.$refs.erpTable.refreshCurrentPage()
+        })
+      },
+      cancelRejectPayReason() {
+        this.rejectPayReason = {
+          selection: [],
+          reason: '',
+          show: false
+        }
+      }
+    },
+    computed: {
+      ...mapState(['role']),
+      btnVisibles() {
+        let btnsObj = {
+          '店长': this.status === 10 ? ['cancel', 'update', 'submit'] : ['cancel'],
+          '会计': this.status === 20 ? ['cancel', 'resolve', 'reject', 'cancelAudit'] : ['cancel'],
+          '出纳': this.status === 30 ? ['pay', 'dishonour'] : ['cancel']
+        }
+        if (btnsObj[this.role.name]) {
+          return btnsObj[this.role.name]
+        } else {
+          return []
+        }
+      },
+    }
+  }
+</script>
+
+<style lang="css">
+  .dialog-view .el-form .el-form-item__content {
+    width: 100%;
+    text-align: center;
+  }
+  .cost_requisition_subitem_list .amount {
+    text-align: right;
+  }
+</style>
+
diff --git a/template/src/views/expenses/requisition/update.vue b/template/src/views/expenses/requisition/update.vue
new file mode 100644
index 0000000000..0e0f2ecd9e
--- /dev/null
+++ b/template/src/views/expenses/requisition/update.vue
@@ -0,0 +1,472 @@
+<template>
+  <div class="requisition_detail">
+    <pagoda-row-btns :btns="rowBtns" :visibles="btnVisibles">
+    </pagoda-row-btns>
+    <pagoda-edit-form-table ref="editFormTable" :form-options="tableData" :editable="editable" :config="config">
+      <template slot="cusOrgCode" slot-scope="scope">
+        <span style="float: left; font-size: 13px; margin-right: 15px;">{{ scope.code }}</span>
+        <span style="float: right; color: #8492a6;">{{ scope.name }}</span>
+      </template>
+    </pagoda-edit-form-table>
+    <el-tabs type="card">
+      <el-tab-pane label="费用明细">
+        <pagoda-erp-table-v2
+          project-name="ERP2_New"
+          view="payee_cost_classes_subitem"
+          :config="$viewConfig['payee_cost_classes_subitem']"
+          :defaultData="classesTableData"
+          ref="erpTable"
+          :summaryMethod="summaryMethod"
+          :validate="tableValidate"
+          v-loading="tableLoading"
+          :default-editing="true"
+          :on="onMethod"
+        >
+          <template slot="remark" slot-scope="scope">
+            <pagoda-remark-cell :maxlength="remarkMaxlength" :editable="true" v-model="scope.row['remark']"></pagoda-remark-cell>
+          </template>
+        </pagoda-erp-table-v2>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+  import { formatDate, formatMoney, formatMoneyToNumber, isEmpty } from '@/utils/utils'
+  import { remarkMaxlength } from '@/utils/default-setting'
+  import publicChoice from '@/views/expenses/publicChoice'
+
+  export default {
+    name: 'requisition_detail',
+    data() {
+      return {
+        remarkMaxlength,
+        loading: true,
+        rowBtns: {
+          update: {
+            text: '保存',
+            onClick: this.handleSave
+          },
+          cancel: {
+            text: '取消',
+            onClick: this.handleCancel,
+            confirm: '当前界面操作数据不保留,是否取消,确认后返回列表!'
+          }
+        },
+        tableData: [], // createTable详情单table专用
+        config: {
+          column: 3 // 一行放3列(label+value)
+        },
+        editable: true,
+        tableObjData: null,
+        cusOrg: {},
+        costType: {},
+        payee: {},
+        classesTableData: [],
+        summaryMethod: {
+          amount: function (tableData) {
+            let sum = 0
+            tableData.forEach(item => {
+              sum += formatMoneyToNumber(item.amount)
+            })
+            return formatMoney(sum, 4)
+          }
+        },
+        tableLoading: false,
+        version: 0,
+        onMethod: {
+          amount: {
+            blur: (event) => {
+              let value = event.target.value
+              // 格式化输入的值
+              value = parseFloat(formatMoneyToNumber(value), 10)
+              event.target.value = formatMoney(value, 4)
+              // 重新计算合计
+              this.$refs.erpTable.pageTotal()
+            }
+          }
+        }
+      }
+    },
+    mounted() {
+      if (this.$route.params.id) {
+        this.setTableData(this.$route.params.id)
+      }
+    },
+    methods: {
+      setTableData(id) {
+        this.PayeeService.checkRequisitionById({
+          id: id
+        }, true).then((res) => {
+          this.loading = false
+          if (res.resultCode === 0) {
+            const data = res.data
+            // 充实特殊对象
+            this.cusOrg = {
+              cusOrgId: data.cusOrgId,
+              cusOrgCode: data.cusOrgCode,
+              cusOrgName: data.cusOrgName
+            }
+            this.costType = {
+              name: data.costTypeName,
+              value: data.costType
+            }
+            this.payee = {
+              id: data.payeeId,
+              payeeName: data.payeeName,
+              bankName: data.bankName,
+              registerBank: data.registerBank,
+              bankAccountNo: data.bankAccountNo,
+              province: data.province,
+              city: data.city,
+              addr: data.addr
+            }
+            this.version = data.version
+            // 第一行
+            let costApplyNo = {
+              title: '申请单号',
+              value: data.costApplyNo,
+              type: 'text',
+              key: 'costApplyNo'
+            }
+            let cusOrgCode = {
+              title: '客户代码',
+              value: data.cusOrgCode,
+              type: 'bdc-select',
+              key: 'cusOrgCode',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择客户代码'
+              },
+              props: {
+                url: `${this.AjaxService.devUrl1}/GeneralService/selectOrgCusVenInfoByAuthority?type=35`,
+                labelKey: 'code',
+                valueKey: 'code',
+                clearable: true,
+                remote: 'cusOrgName'
+              },
+              on: {
+                input: (value, selectData) => {
+                  if (value && value !== '') {
+                    this.cusOrg = {
+                      cusOrgId: selectData.id,
+                      cusOrgCode: selectData.code,
+                      cusOrgName: selectData.name
+                    }
+                    if (cusOrgName) {
+                      cusOrgName.value = selectData.name
+                    }
+                  } else {
+                    this.cusOrg = {}
+                    cusOrgName.value = '选择客户代码自动带出'
+                  }
+                }
+              }
+            }
+            let cusOrgName = {
+              title: '客户名称',
+              value: data.cusOrgName,
+              type: 'text',
+              key: 'cusOrgName'
+            }
+            // 第二行
+            let costTypeName = {
+              title: '费用类型',
+              value: data.costTypeName,
+              type: 'select',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择状态'
+              },
+              options: publicChoice.classesTypeOptions,
+              key: 'costTypeName',
+              on: {
+                change: (value) => {
+                  if (value && value !== '') {
+                    this.costType = {
+                      name: publicChoice.classesTypeOptions.filter(item => item.value === value)[0].label,
+                      value: value
+                    }
+                  } else {
+                    this.costType = {}
+                  }
+                }
+              }
+            }
+            let payeeName = {
+              title: '收款人',
+              value: data.payeeName,
+              type: 'text',
+              key: '收款人',
+              type: 'bdc-select',
+              key: 'payeeName',
+              required: true,
+              rules: {
+                required: true,
+                msg: '请选择收款人'
+              },
+              props: {
+                url: `${this.AjaxService.devUrl1}/BasPayeeDefService/findByPayeeName`,
+                labelKey: 'payeeName',
+                valueKey: 'payeeName',
+                clearable: true,
+                remote: 'payeeName'
+              },
+              on: {
+                input: (value, selectData) => {
+                  if (value && value !== '') {
+                    this.payee = {
+                      id: selectData.id,
+                      payeeName: selectData.payeeName,
+                      bankName: selectData.bankName,
+                      registerBank: selectData.registerBank,
+                      bankAccountNo: selectData.bankAccountNo,
+                      province: selectData.province,
+                      city: selectData.city,
+                      addr: selectData.addr
+                    }
+                    if (bankName) {
+                      bankName.value = selectData.bankName
+                    }
+                    if (registerBank) {
+                      registerBank.value = selectData.registerBank
+                    }
+                    if (bankAccountNo) {
+                      bankAccountNo.value = selectData.bankAccountNo
+                    }
+                    if (province) {
+                      province.value = selectData.province
+                    }
+                    if (city) {
+                      city.value = selectData.city
+                    }
+                    if (addr) {
+                      addr.value = selectData.addr
+                    }
+                  } else {
+                    this.payee = {}
+                    bankName.value = '根据收款人自动带出'
+                    registerBank.value = '根据收款人自动带出'
+                    bankAccountNo.value = '根据收款人自动带出'
+                    province.value = '根据收款人自动带出'
+                    city.value = '根据收款人自动带出'
+                    addr.value = '根据收款人自动带出'
+                  }
+                }
+              }
+            }
+            let bankName = {
+              title: '开户银行',
+              value: data.bankName,
+              type: 'text',
+              key: 'bankName'
+            }
+            // 第三行
+            let registerBank = {
+              title: '银行支行',
+              value: data.registerBank,
+              type: 'remark',
+              key: 'registerBank'
+            }
+            let bankAccountNo = {
+              title: '银行账号',
+              value: data.bankAccountNo,
+              type: 'text',
+              key: 'bankAccountNo'
+            }
+            let province = {
+              title: '省份',
+              value: data.province,
+              type: 'text',
+              key: 'province'
+            }
+            // 第四行
+            let city = {
+              title: '城市',
+              value: data.city,
+              type: 'text',
+              key: 'city'
+            }
+            let addr = {
+              title: '地址',
+              value: data.addr,
+              type: 'remark',
+              key: 'addr'
+            }
+            let status = {
+              title: '单证状态',
+              value: this.getStatusLabel(data.status),
+              type: 'text',
+              key: 'status'
+            }
+            // 第五行
+            let image = {
+              title: '图片上传',
+              value: data.image,
+              type: 'text',
+              key: 'image'
+            }
+            let remark = {
+              title: '备注',
+              value: data.remark,
+              type: 'remark',
+              key: 'remark',
+              props: {
+                text: '修改备注',
+                editable: true,
+                maxlength: remarkMaxlength
+              }
+            }
+
+            let tableData
+            tableData = [costApplyNo, cusOrgCode, cusOrgName, costTypeName, payeeName, bankName, registerBank, bankAccountNo, province, city, addr, status, image, remark]
+            this.tableData = tableData
+            this.$refs.editFormTable.init() // 延迟加载必须调用init方法
+            this.tableObjData = this.$refs.editFormTable.getObjData(tableData) // 因为直接获取有延迟,所以传入数组能实时拿到最新数组
+            setTimeout(() => {
+              // 清空表格
+              this.$refs.erpTable.$refs.tableRef.tableData.data = []
+              // 格式化
+              if (data.detailList.length > 0) {
+                data.detailList.forEach(item => {
+                  item.amount = formatMoney(item.amount, 4)
+                })
+              }
+              // 提取费用类型,存入erp-table-v2
+              this.classesTableData = data.detailList
+              // 刷新表格
+              this.$refs.erpTable.refreshCurrentPage()
+            }, 500)
+          }
+        })
+      },
+      handleCancel() {
+        this.$router.push({name: 'expensesRequisition'})
+      },
+      handleSave() {
+        this.$refs.editFormTable.validateForm().then(() => { // 方式二: 通过Promise形式处理结果
+          this.$refs.editFormTable.initResetValueData() // 记录重置默认值,this.$refs.editFormTable.reset()会重置为此刻的值
+          const formData = this.$refs.editFormTable.resetValueData
+          // 判断以下关键字段是否为空
+          if (isEmpty(this.cusOrg)) {
+            this.$message.error('请重新选择客户代码!')
+            return
+          }
+          if (isEmpty(this.costType)) {
+            this.$message.error('请重新选择费用类型!')
+            return
+          }
+          if (isEmpty(this.payee)) {
+            this.$message.error('请重新选择收款人!')
+            return
+          }
+          const table = this.$refs.erpTable
+          if (table.validateEditingItems()) {
+            // 构造请求参数
+            const detailList = []
+            const list = table.$refs.tableRef.tableData.data
+            list.forEach(item => {
+              detailList.push({
+                id: item.id,
+                amount: formatMoneyToNumber(item.amount),
+                costCatId: item.costCatId,
+                costCatName: item.costCatName,
+                periorBegin: `${ item.periorBegin } 00:00:00`,
+                periorEnd: `${ item.periorEnd } 23:59:59`,
+                remark: item.remark,
+              })
+            })
+            const params = {
+              id: parseInt(this.$route.params.id, 10),
+              costApplyNo: formData.costApplyNo,
+              addr: this.payee.addr,
+              bankAccountNo: this.payee.bankAccountNo,
+              bankName: this.payee.bankName,
+              city: this.payee.city,
+              costType: this.costType.value,
+              costTypeName: this.costType.name,
+              cusOrgCode: this.cusOrg.cusOrgCode,
+              cusOrgId: this.cusOrg.cusOrgId,
+              cusOrgName: this.cusOrg.cusOrgName,
+              detailList: detailList,
+              imageUrl: formData.image,
+              payeeId: this.payee.id,
+              payeeName: this.payee.payeeName,
+              province: this.payee.province,
+              registerBank: this.payee.registerBank,
+              remark: formData.remark,
+              version: this.version
+            }
+            this.PayeeService.editRequisition(params, true).then((res) => {
+              if (res.resultCode === 0) {
+                this.$message.success('修改成功')
+                setTimeout(() => {
+                  this.$router.push({
+                    name: 'expensesRequisition'
+                  })
+                }, 2000)
+              } else {
+                const msg = res.errorMsg
+                this.$message.error(msg ? `修改失败:${msg}` : `修改失败`)
+              }
+            })
+          } else {
+            this.$message.error('请填写完整必填信息!')
+          }
+        }, (error) => {
+          let msgs = error.msgs.map((msg, i) => {
+            return error.items[i].title + msg
+          })
+          this.$message.error('校验不通过,' + msgs.join('、'))
+        })
+      },
+      getStatusLabel(value) {
+        return publicChoice.documentStatusOptions.filter(item => item.value === value)[0].label
+      },
+      getClassesTableData(value) {
+        this.tableLoading = true
+        this.PayeeService.checkRequisitionByType({costType: value}).then((res) => {
+          this.tableLoading = false
+          if (res.resultCode === 0) {
+            const data = res.data
+            data.content.forEach(item => {
+              console.log(item)
+              // 列表添加
+              const table = this.$refs.erpTable
+              this.$nextTick(() => {
+                table.newRows([{
+                  costCatId: item.id,
+                  costCatName: item.name,
+                  amount: '0.0000',
+                  periorBegin: formatDate(new Date(), 'date'),
+                  periorEnd: formatDate(new Date(), 'date'),
+                  remark: ''
+                }])
+              })
+            })
+          }
+        })
+      }
+    },
+    computed: {
+      btnVisibles() {
+        return ['cancel', 'update']
+      }
+    },
+    watch: {
+      costType: {
+        handler(newName, oldName) {
+          // 清空表格
+          this.$refs.erpTable.$refs.tableRef.tableData.data = []
+          if (newName.value) {
+            // 根据费用类型显示不同的费用明细
+            this.getClassesTableData(newName.value)
+          }
+        },
+        deep: true
+      }
+    }
+  }
+</script>
diff --git a/template/src/views/home.vue b/template/src/views/home.vue
new file mode 100644
index 0000000000..6ad8efc358
--- /dev/null
+++ b/template/src/views/home.vue
@@ -0,0 +1,119 @@
+<template>
+  <div class="Home">
+    <h1>
+      <img class="vertical-middle" :src="role.img" width="50" height="50" alt="ddd">
+      欢迎 <span class="text-blue">{{role.name}}</span> 使用百果园ERP——管理系统
+    </h1>
+    <div class="backlog_list clearfix">
+      <div class="backlog_item animated"
+        :class="{'shake': backlog.count > 0 && backlog.shake, 'shadow-5 pointer': backlog.count > 0}"
+        @click="backlog.count > 0 && $router.push(backlog.to)" v-for="(backlog, index) in backlogData" :key="index">
+        <div class="_title">{{backlog.title}}</div>
+        <div class="_bottom">
+          <div class="inline-block" :class="'_icon-' + index"></div>
+          <div class="_count inline-block" :class="{'text-danger': backlog.count > 0}">{{backlog.count}}</div>
+          <span class="_detail" v-if="backlog.count > 0">详情</span>
+        </div>
+      </div>
+    </div>
+
+    <!-- <router-link to="editItemTest">测试edit-item</router-link>
+    <br>
+    <router-link to="editFormTest">测试edit-form</router-link>
+    <br>
+    <router-link to="sortTableTest">测试sortTableTest</router-link>
+    <div style="margin-left: 500px;width: 80px">
+      <remark-cell v-model="remark"></remark-cell>
+    </div> -->
+  </div>
+</template>
+
+<script>
+import { mapState } from 'vuex'
+export default {
+  name: 'Home',
+  data () {
+    return {
+      remark: '这是备注',
+      backlogData: [
+        {title: '请购单待办', count: 0, to: {name: 'purchasePending'}, shake: false},
+        {title: '采购订单待办', count: 0, to: {name: 'orderPending'}, shake: false},
+        {title: '待办业务3', count: 0, to: {name: 'purchasePending'}, shake: false},
+        {title: '待办业务4', count: 0, to: {name: 'purchasePending'}, shake: false}
+      ],
+      timerIds: []
+    }
+  },
+  created () {
+    const timeoutTodo = (index, time) => {
+      let timerId = setTimeout(() => {
+        this.backlogData[index].shake = true
+        this.backlogData[index].count += 1
+        this.$message.warning('你收到新的待办任务,请及时处理!')
+        setTimeout(() => {
+          this.backlogData[index].shake = false
+        }, 900)
+      }, time)
+      this.timerIds.push(timerId)
+    }
+    timeoutTodo(1, 100000)
+    // timeoutTodo(0, 1000)
+    // timeoutTodo(1, 5000)
+    // timeoutTodo(3, 3000)
+  },
+  computed: {
+    ...mapState(['role'])
+  },
+  beforeDestroy () {
+    this.timerIds.forEach(timerId => {
+      clearTimeout(timerId)
+    })
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped lang="stylus">
+@import "../assets/stylus/variable"
+iconCommon($left, $top)
+  display inline-block
+  width 60px
+  height 60px
+  margin-right 16px
+  background-size 240px 60px
+  background-position $left $top
+  background-repeat no-repeat
+  background-image url('data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAICAgICAgICAgIDAgICAwQDAgIDBAUEBAQEBAUGBQUFBQUFBgYHBwgHBwYJCQoKCQkMDAwMDAwMDAwMDAwMDAwBAwMDBQQFCQYGCQ0LCQsNDw4ODg4PDwwMDAwMDw8MDAwMDAwPDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/CABEIADwA8AMBEQACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAABwUGCAQCA//aAAgBAQAAAAB1AAREQABsIABCIUABwhbakEREDDlIteGwg7ub3zoRCyDSp1OBwyrMlYmn0+IiGJXq5appd7Cv0Jb7Cn/nnVC6OhbStlWOEcyZcyZIiJeKNBsqbYQ16/o/JtryKqGy4k9OZmHDLMmuMhUVKIlbzQax2NBR7CG1EWuDiMkoXRvRal8gRwnrc2PqwRHBphfTtViaHsI+73TDkQiEQowKroWrI1wgAREZ9LNU/IbCDu4e7hQiFA6OqNcIAEREAAbCAAQiFAA//8QAGwEAAQUBAQAAAAAAAAAAAAAAAAMEBQYHAgH/2gAIAQIQAAAA1MADNMzAAugAGmaWABSwbOQzTMx13w1LoHoeaZpacQ+ehS049NV05zTM3SSSyjW6KeddJeaXpdZXaScuUsipWKlTNMzkY4HzG6C3Llp1pGhQ0LNIWkpabBdhJOc0zpw2R6eMboLc98+aRpdZ5ZyViKWFPtDgzTNJdqqhw2uh6uis30zSyOd1t3P0sADNM0FkALoHvnvmmaWBzwrSwAM0zMAC6AAaZpYAH//EABwBAAIDAQEBAQAAAAAAAAAAAAAGBAUIAwcCAf/aAAgBAxAAAADHAADS1AAbpAAz3nsABLC3qAaWosevKuN0hx6fPTPee+txBgAlymaXDqKdparGPGl9q7dNFNqYDZ9eBZ7ao82pphLHNMc0waWq9ogt6jdIrz/PfUqvxjwa6vaKQpCXLZK5kU6lpdZ9fF+7So3SK0qrmy/Fs9tX1Nq1oSz99y8gqxpbGeukROMDdJ8JDepPGe89lnDZ4a6lgANLX+yoYG6Q49uPbPeewPv74pYADS1AAbpAAz3nsAD/xAAyEAABBAIAAggGAgEFAAAAAAAFAgMEBgEHABAREhMUQ0aChBUWICEwMRckIiUzNTZV/9oACAEBAAESAPrK+B6vz7v8se9/GIqqi1UuFoxOwwmpKHJXC5lfA9XMDrgqVGN2EuQgVCsOqylg5ip6rznsv5cew7+u2sOtzAUZmwjZsG2VbC8IXYfpbFknYbpFodJdHs56r09hh+S83HjMrkSHlYQyxLhy4D6os6K9CkoxjK4/G7/LHveUMQWIx50seLlzootvtiUmqatgFq8IsNpskqqxrIcwCrjJShWkdaTdRYCzipYG/IafZzjOM5xnHRnH2zjmEHxipWEOllI4WPLc6jhSLpmwYOLgl58EdX4sLJSbcGrVqELCJ1oeEsxcMWyxguSMazYJxhR3Wkx+ygjMxI7EO31L5PkQ4D54aXJuNqUSh8FfA9XLXQMWQIFDtiay9WKbBUVMxrTajFwLPFzD+FuqxhuJE4qFvL0sugoLWlxtxOWSYzZNdGBi8EnXcKxVrbBbMV9vkEonxkZGJfMokf3nr/1LNWCFWmtRJy2X0SWsPxJerzbDBCXWCfQsTZW8x1N1OspppKz2M4jOYtW67I5UyVOPlnpT2e2nlZHT1SgueFnvjCbHdp0bq9uxu/yx73lEtpao6XopWvkpFVOMWYmmKxVQFp3jLsRSxbERGerEZM93EwptKmTqaAsWzJTmvT5CK+OvG78uK2xesuiGwisE3Edy+gH2i9IXdA/pzJasA5Z3HGue0RRdwOS+nAXIeKhfMr4Hq4xjOc4xjHTnP6w7XCFToW0AMxbfxWLMqzxdnnbc5/ivUSXf97tbCpn6LB/rOtaoWx/m+DfcGyc0GLJlmH8RQUc+8zGy6mNZmixAWMY+WIhvL+MOkoIX/mxP26P7zH22l/3s77Xjd/lj3vFOIDRNuqpUyz3kOMMQZZWPulBIm5Xrk5fXNj1Yy/Ojh51zJano15E7GGhSgCbEYSRqgsAmbdtO3wHBaTNMV+wxrTHC7YsMRmhxKKW2GnZNuHHI8vE3mDOFa2ViGwkvMEpBypUSUN3Ld5B+LNsE5uyxJDChhETs8COrN9soIQ0pkaPk4TEZ2JZyGvyACn0rCK+NAMxC/bWq9Wu7LhLtBdRVQ7DiYWeCvgerihNxXbzS2p3VzBcOjkzMR7IyO2LfYFwU78Ft0wiKtarVUy1QJZHk0JcZeTh4WU4ixHJHWdyh1MJhbeJ03dHWhW1iuR2uxA1UZDH1nPOhN5PVi31FKk5lyW25wtn+Krz/AOQjg/V9iWAcCGyK9GYaAsdhHcFaxukYmOkPCkIZYlMuOr2Y80/eDq2XEuowphGVbv8ALHveVYRT7RqsRVJd3HUlkMblGb0y2vYWvxQLGvNkQLVSLQXyNBpNgZL9idK0QmJEbyoqcvWUDYq4I2eGn32hwGxlnFt5f2Dr/wChC1NrQ4jPVWjOFJzTj5K7VtNlfZIEpLXWQbmXGyzbbYSBudJzKW+rDUd3kV8D1cRWpL0qMzDStcx11CIqNr6ptpe2Sp0KFBcOPwIbhQbXZ2zAbeao5TpdjFKdyrNPs2atUFQ8HNShopuUjLrgNzcF0ZUw0BkRKkJjZVlqv3i+zb4oE8REjh0sHBwOS9ziqUmQxlD+YqsrTjvBsQzHh2SI3AJi2gEJMkfaohEi/KjMOmJTDTzqEOP2EU0wPszKBxMKiutNrHWD9/fP743f5Y97zqO0rxRoL42tGEQ4EiTiaqK2dMtG/mRolIaPd7zP+LDCEvYElrYGvnMV7dVcxmYeAblCQURKVd2gCqcXvcaY+fqH4Cvgerhp11h1t9hxTLzKsLZedlypElcx+S69McX2jkvN/veYvcs3U9mF0dXuilKUrKlZypSs9KlfU6UJvxWoL5GU9BY6Oxh8PlCcqMzDkkZUiHH6Owi8bv8ALHvfpiTJY+SxNgSnoUyKvDkaWWNGD8xRE6WmGiC04Qud+Ar4Hq/Pu/yx738H/8QANxAAAgEDAgMFBgQFBQAAAAAAAQIDBBESACEFEzEQICJBYRQwUYGRkyMyYnEGFUKDoVJyhNHT/9oACAEBABM/AO/9Pf8A2PdmPIz/AMwmeIWfIY4YX6G/p3Pp28YkaJagr+ZaSBFeacj9CEeuj/DtV7Pf/eJzJb+18tcGlM8ULN+VKmNlWWBjttIoHkCe8kLtChFtmkAxHUdTqJS7ux6BVFySfTU6NG4BFxdWAIuN+z7HZTwSSx08Zv45mRSEXY7tbUfC2rWqJSkbmZi1RTBYryhQy5XIbbbVFSzSs8VPIUNQiKhblta4a1rHR7lXlyYdiQXwBNidr+XntqKZamhFArFedEyEFyxBCobEn031JXpSvUmmYtE4p1TGysSVDEH46qQkVdQ1km6QVQuEsw6OLL/gnhspnFG4IAilksELfEKTa2/lfX07A2HtTB1ipqMN5GeZ1U/py1GMKelgTaOCnjGyRoNgB+53ueyYZ01bTPtJT1EZ2dHFxuNuo305yaCOYsstK7ebQSqydegB8+2pmwlTB2TxDyvjcemqdi0UsZ2uCQDpugmZSq/tmDj++Om258sigoy+rIygeremrgAvI1lUXNgBcAfAayV8c1Dr4kLKbqwOx19jspuW0PGoREvOq6uNlIfkcxacK+SkE+HrriTVFRKIWJzelpadGxjixGeAAQFdrdOD1QrI2poZ1EnJq3AmAhJu0LHFSAcDteKxVgiqvPuqqCZ7c02HVu6nX2Aowhyt/Tz/APPY35DXGpHslv1A5dv07IjkYop46mUwv+qOWRFcf6h3D19nNXCE+XMEv+e4PJCLJf8AZUT66qJhAsZWSO0qufME2H76nqhEkMqqtgrf12LMPlr+6uv+LFr7GsBJzKaGoR5kwOzXQEWPXXImpRRmCVXkozFMFKHGRSNhcdNhrgcaRcH4/DJEppZlqFIFOFyMdTGFOVjt4jeEfiRUUsM0FZJTR7kohKF1XoLE6ihdoeG0kdE8UtNHWNdZQzun5CR4d7EdxVRyhdCjeF1ZTdWI3GqyGJKeoo6hhzI3WJEF77hrXB9Lguxcorxo+OTbkAtYX3tqICSaqr6mnVmnqGkDByochQRYfJbNFDFgJcS+0SJe+I69n0035eUaqMPf0xvoAvJTl6ovHUonm1NMiuB8AVHXUBzpa2mbeOop5Rs6MN9unQ2O3YkbSLAsjWDNbb42BO+g2az0RiE61WQsGaoaVpCR8beXcZguUsZGVibW3RB89e00/wD6ajqYcnGCJdrykXtGOmvaIDZVcEmwcnoNKbjKOnjRh+4YEHX2OziKNJV1l4jHSz8NW55jLF+EYlxOXiNxbQhSaOOtODGOeh4jBItNIRKC2N+u51/DbEUXEzACKiSijaONfaIwCtTThSr7lb+JTTi3LsfHxHh0fVoWO8kY3jP6bHu/Ajcag4NwVoxPEoZwpnlWRwFI3t/1owxwHkQjCG8cd1U4AXAJ38+36aivmZGYBAtt7k2tqOsp46zidclOnt1VR0JfmGPmXvtdjdlBB1xnhU9VEkp6tEmKywsfMxMp+Ol49xCZ6b4Gpp45SYr9QjS5W8tcGpo4KJ8hi3tETiQ1Fx15xfXDojAksCMWiUxZFFwuQAoA36AWA7QSCgJsWuLHYakrJ2Ssk8PgIJ5Z5hNhj09OmjM9kVmALHxeQ31LWTulcxYKVIY4HO+2PT06dn2O2ejpKxEqQoTnRiqhlwfFQCVtewv0GkcrP7SzmQy5jfIsbnVEAicbjQfi1tFEBiZit+fBa0guyjcgshiSnqaSZYjVQROA8cVVkWVSNrGxI9z9NISrIym6srDcEHcEakdmkZ73yLkkk3876PEqrlW+GHMtb5aO5JPme/JM7RJbpihOI+Q7JZneNLbDFGJA+Q7Psd2ndo5Y3HRkdSCpHxB1XzyVMxVegMkrM1h5b+5+nv8A7HuP/8QAPhEAAQIDAwgHBQUJAAAAAAAAAQIDAAQREiExBQcQQURRgsITICIyYXGBFDCRocFCUmLR4TRDU3KSorGy8f/aAAgBAgEBPwDr5xdn4+T3+bvaODn927M2HUN079b91kV6mcXZ+Pk0tSilJtqISnedfkMTHQS/8X+0/n9IdlFITbBCk7x9dY61DjoIpozd7Rwc+hbzaCApQBOFTSvlvicyspt1TTKAsoRbV2rNBfdgq+7w1Q1lBhbCXioJSoDEgXkYefh1XllCCoAqI1DGFZVb6OqQSomgTgbW79YMtOOKDilIChWgpWlfGGsoFBKJgWVAVqMCN4/KJWZ6cFQSQNVbq6M4uz8fJolG0qJUvupFT47h6mHnlOqtK/54DQw+plVpPqNRG4xNtJQoFHdUKj8vQ6Ut1FawpJTDSr6HXCE2SSdUEkmCCDQxm72jg59C5NuZyi6hxIWjo01rWqDW5KTqtUtXUMTcwxkhKENM1CzTs0Ar+JR1nVXG+EMyU0l1xpgdMlJBQoWbyLqpwv1KGO+Mg09haoq12cfpw9306r1Pbm7WFk0/m1/LRP06dinetH+ml+nOLs/HyaC0WmXEnGqa/P69R/8AZ2uL4VH69RV6AYbFThWFVIwhOMO94xm72jg54nW1uy7iEGiilQHmQafOMhlDYWwGuicSASKg2qi5VRjgYkWp6cllSylJUCaLKr1tmvaFPtb0Gt3pExZlMoNOKuSpBbtb1AgpCjvN9IyPLKM0ZhDPRNlBFK3qNoEKKdVwOO/qPMoeQULFQYcyUwGyECycQRWoI84ye8p6XQtWJESMumaSp13tFVU+ASDgIlpNqXr0aaVxx+ujOLs/HyRLAF1FcLQ/zAdCXlhzBRIPxx9DDzCmlUPodRG8aEpr5RlC5ywMEgAeWNfXHqN3giOiVuhSVkAUwgNKrDveMZu9o4OfRNmYl55TwaU4VICUUwTf2gvdffaNd0ESk6tftLJQ6hNpV9Oz4KQRaF0MTADNiYSpUq53VL7yK4BRqeyfsLxGvUYlppzJ7gl5g1bNzbh/0X+LcftefVIrE0ymXc6MUA1C0vD0FIlZdLDYQBT5369OcXZ+PkhIJN2MTsk4twkAVoKioqTS8gQ0p9HYskj7pBP6j0h7o2qWmhXdaN3mNXxgz7o7tEjcBd67/WsTMyX6VABApd1BCk4+GuATChcfDRm72jg59M5kmWnFBTqakClQSm7cbJFR5wZdst9EUixSlNVMKQ62mSHs0z2pVdyVH93uSo7vuq1YGMiPqKnWCvpEtkBK8ahQrZJwJTgT7nOLs/HyQDS8QVEmpxj2p2lLaqeZ9xU6KnRm72jg5+qtCVpKVAEHUcIZYbZTZbSEjcAAPgPc5xdn4+T3+bvaODn9x//EAEYRAAIAAwUBCwkECAcBAAAAAAECAwQRAAUSITFBBhATICIyUWFxgYIHFDBDRIOhwcMVQlKRMzRicpKxstEWJDVTc6Lh8f/aAAgBAwEBPwDj7mvWeH5+n8vHsPvvpejlLqMxJTE1ipwODKnO4Qlda5Up0GvE3Nes8Pz35e7XiJwjkIn4m2/ujVu4W80ktPOD/Aafzr8LTN2RIScIpDw/xKagfvDVe8cZpmEriGXAY6Cor+WtndUUsxAA1J0tCjJFXEjBh0g1Hw3vLx7D776W9DgRIgLKpIXUgE07ei0lc6RYKxYzlA74F5OKpyz1XLPXPbaNdseHHeAELMpOgJyBpXs6+LJS6TEZYbuIYJpiauEdtLQtxs0JgpGZVhBcZighofB6YgRqToFyJsl63HKw3locOM8N6YmLhS2E1BwAUyOYr32nNzKx0SPdjGLCdsFDQRIbnRX2Z7GyHwJve6fs1lhtFR3I5QQ4sB6CdK9mm9ua9Z4fnvXbAR3aJE5kMYj17AviNB2VtNzcSZfG57BsA2ADYBvSc5ElYmNO8HRhtBHRa85ZIUQPD/RuMS9VdV8JqN+cvvzaKYfAxGpTMDI1FbXdeUOeQslRQ0IOoNt0smzQ1mYfPhGvd/5r2Vtel5G8YUGXgc6LQt+yBrXvB/h67QYUOUghRkqD4DbaWmYczDESGaqdDmNDTbnrby8ew+++lvJOxJW7YLwmKOIjUpSkQUzZhtw1CUNR1Wk5aPfLO8WPQoK8qpNP2VGwbaaZWiRp6UaFCixzwLsCIinFkDnRudydqnIHZbdDX7QjVXDytPn4ud38WRqdz0yIeoipj/46HDXqx725you68C/6Pg17OExcjv139zXrPD894yzS0rHhtzgYdeqoJp3EgHr4k5+pS9f2/wAqj514kh/lr1jwtkQBx27fiT+Vr9irDgDFEMME0qBirkcqdFrtaDBiu3DMlMlIWpI+Wy05+rv+6f5W3M/6fD8X9Rt5ePYfffStIxUhTEN4gqqspPYCCfha/wAPEKRzG4aGxYA0Iw0Oa0OmotPxZCSmlmkRkIGJAgpDigjkmv3ehxTPvzlsU5d0aGoqyOImEbFIIYqOgZVtfU0olBLPH4aKHBrTJFwkFQ23MjToz4kjPRpKMseA2F10ORpUU21GhtLbsrweZV5hhFUjAysAFZGOYIUDuOzsqLbp5CFI3lGgQRRFbIa0qAde+26K84tzxYUnJUhpDCxKjNmiMvOYmtaVoBp8KXrfs7ehUzUTHhrTIClaV5oHQN7c16zw/O13hTMww2mNa9lRZZkJNxVjc1yyt1Z6+EgG03KPLPhbuI0YdIO0byoWz2bT0WvvkxxCHMRQF61pXF4q14l+N5rNwJs80Eqx6j/9a3+J7v8A9z/q39rSN53ZKRYkRYpJiGpqpyzJyy67TW6SReE6h8ypHNbo7LbnEK3fCBFNfixI+FvLx7D776W9JiWmZBYLRVhhXLRMWbNlRSnTlycIpnmbAzkjDTzWOHhO2Fcq8rLIo4OE550tMSzNGxyzKs3CzZU5r01Kig5Q++mh2bRaalYd4w2mZZcMRc4kMf1oPw9I+72cVSQai1zz8W9JTzlg7MOeRCgUxAZ0xEMcqbLXxeUS8Zp48Q1JyBoF5IyXIZDLXf3Nes8PzsgJYBddlr3umPEjllAxUFRUYmanKZVrWlf7i0tEnIQ4Ewyy/gZSR3bQewi01wMtThJdQx+7jY07QDl2E2N8zAoIZCKPuqKL3jPF4q2n7wacwFlUFRTIUqNmXV1cSIAVNRXLTptJTbO8JyyOYjUaGFWqDPPp5PXraLLwkQsIakgHKgztITRaJBJdH4QnEgVRg/LPLr1+O95ePYfffS35K+JqSUpCagJrQhWz6RiBoeywmYgi8KGOOta7a61tBitPN5zK8iaTNlHrOllH4vxp97UdFr+l1CwpgJwbRQSyaUKmmIDUK2oHb6Hc16zw/OwJBqNbF2JxE59NvtCZph4V6dGI/wB/QJLQkcuqKGOpAFT367yS0JGLqihjqQACe073l49h999Lio7IwZSQRoRkbR5iJHbFEYs3SSSfzPodzXrPD8/T+Xj2H330vQf/2Q==')
+
+.Home
+  .backlog_list
+    .backlog_item
+      padding 15px
+      width: 21%
+      margin-right: 40px
+      float: left
+      border-radius 6px
+      box-shadow $box-shadow-inset
+      &.shadow-5
+        box-shadow $box-shadow-5
+      ._title
+        font-size 22px
+        padding 10px 0
+      ._bottom
+        padding-top 15px
+        ._icon
+          &-0
+            iconCommon(0, 0)
+          &-1
+            iconCommon(-60px, 0)
+          &-2
+            iconCommon(-120px, 0)
+          &-3
+            iconCommon(-180px, 0)
+        ._count
+          font-size 33px
+          font-weight: 700
+        ._detail
+          float: right
+          margin-top: 40px
+</style>
diff --git a/template/static/favicon.ico b/template/static/favicon.ico
new file mode 100644
index 0000000000..82ddd06cd7
Binary files /dev/null and b/template/static/favicon.ico differ
diff --git "a/template/static/imgs/\344\273\223\347\256\241.png" "b/template/static/imgs/\344\273\223\347\256\241.png"
new file mode 100644
index 0000000000..7793b99195
Binary files /dev/null and "b/template/static/imgs/\344\273\223\347\256\241.png" differ
diff --git "a/template/static/imgs/\344\273\223\347\256\241\344\270\273\347\256\241.png" "b/template/static/imgs/\344\273\223\347\256\241\344\270\273\347\256\241.png"
new file mode 100644
index 0000000000..77a18c989d
Binary files /dev/null and "b/template/static/imgs/\344\273\223\347\256\241\344\270\273\347\256\241.png" differ
diff --git "a/template/static/imgs/\344\274\232\350\256\241.png" "b/template/static/imgs/\344\274\232\350\256\241.png"
new file mode 100644
index 0000000000..ec4e84750e
Binary files /dev/null and "b/template/static/imgs/\344\274\232\350\256\241.png" differ
diff --git "a/template/static/imgs/\344\276\233\345\272\224\345\225\206.png" "b/template/static/imgs/\344\276\233\345\272\224\345\225\206.png"
new file mode 100644
index 0000000000..ec4e84750e
Binary files /dev/null and "b/template/static/imgs/\344\276\233\345\272\224\345\225\206.png" differ
diff --git "a/template/static/imgs/\345\207\272\347\272\263.png" "b/template/static/imgs/\345\207\272\347\272\263.png"
new file mode 100644
index 0000000000..ec4e84750e
Binary files /dev/null and "b/template/static/imgs/\345\207\272\347\272\263.png" differ
diff --git "a/template/static/imgs/\345\272\227\351\225\277.png" "b/template/static/imgs/\345\272\227\351\225\277.png"
new file mode 100644
index 0000000000..ec4e84750e
Binary files /dev/null and "b/template/static/imgs/\345\272\227\351\225\277.png" differ
diff --git "a/template/static/imgs/\351\207\207\350\264\255\346\200\273\347\233\221.png" "b/template/static/imgs/\351\207\207\350\264\255\346\200\273\347\233\221.png"
new file mode 100644
index 0000000000..922308f0b7
Binary files /dev/null and "b/template/static/imgs/\351\207\207\350\264\255\346\200\273\347\233\221.png" differ
diff --git "a/template/static/imgs/\351\207\207\350\264\255\346\226\207\345\221\2302.png" "b/template/static/imgs/\351\207\207\350\264\255\346\226\207\345\221\2302.png"
new file mode 100644
index 0000000000..b8c2f2a388
Binary files /dev/null and "b/template/static/imgs/\351\207\207\350\264\255\346\226\207\345\221\2302.png" differ
diff --git a/template/test/e2e/custom-assertions/elementCount.js b/template/test/e2e/custom-assertions/elementCount.js
deleted file mode 100644
index 818e602091..0000000000
--- a/template/test/e2e/custom-assertions/elementCount.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// A custom Nightwatch assertion.
-// The assertion name is the filename.
-// Example usage:
-//
-//   browser.assert.elementCount(selector, count)
-//
-// For more information on custom assertions see:
-// http://nightwatchjs.org/guide#writing-custom-assertions
-
-exports.assertion = function (selector, count) {
-  this.message = 'Testing if element <' + selector + '> has count: ' + count
-  this.expected = count
-  this.pass = function (val) {
-    return val === this.expected
-  }
-  this.value = function (res) {
-    return res.value
-  }
-  this.command = function (cb) {
-    var self = this
-    return this.api.execute(function (selector) {
-      return document.querySelectorAll(selector).length
-    }, [selector], function (res) {
-      cb.call(self, res)
-    })
-  }
-}
diff --git a/template/test/e2e/nightwatch.conf.js b/template/test/e2e/nightwatch.conf.js
deleted file mode 100644
index f019c0ac44..0000000000
--- a/template/test/e2e/nightwatch.conf.js
+++ /dev/null
@@ -1,46 +0,0 @@
-require('babel-register')
-var config = require('../../config')
-
-// http://nightwatchjs.org/gettingstarted#settings-file
-module.exports = {
-  src_folders: ['test/e2e/specs'],
-  output_folder: 'test/e2e/reports',
-  custom_assertions_path: ['test/e2e/custom-assertions'],
-
-  selenium: {
-    start_process: true,
-    server_path: require('selenium-server').path,
-    host: '127.0.0.1',
-    port: 4444,
-    cli_args: {
-      'webdriver.chrome.driver': require('chromedriver').path
-    }
-  },
-
-  test_settings: {
-    default: {
-      selenium_port: 4444,
-      selenium_host: 'localhost',
-      silent: true,
-      globals: {
-        devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port)
-      }
-    },
-
-    chrome: {
-      desiredCapabilities: {
-        browserName: 'chrome',
-        javascriptEnabled: true,
-        acceptSslCerts: true
-      }
-    },
-
-    firefox: {
-      desiredCapabilities: {
-        browserName: 'firefox',
-        javascriptEnabled: true,
-        acceptSslCerts: true
-      }
-    }
-  }
-}
diff --git a/template/test/e2e/runner.js b/template/test/e2e/runner.js
deleted file mode 100644
index 27220329fe..0000000000
--- a/template/test/e2e/runner.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// 1. start the dev server using production config
-process.env.NODE_ENV = 'testing'
-
-const webpack = require('webpack')
-const DevServer = require('webpack-dev-server')
-
-const webpackConfig = require('../../build/webpack.prod.conf')
-const devConfigPromise = require('../../build/webpack.dev.conf')
-
-let server
-
-devConfigPromise.then(devConfig => {
-  const devServerOptions = devConfig.devServer
-  const compiler = webpack(webpackConfig)
-  server = new DevServer(compiler, devServerOptions)
-  const port = devServerOptions.port
-  const host = devServerOptions.host
-  return server.listen(port, host)
-})
-.then(() => {
-  // 2. run the nightwatch test suite against it
-  // to run in additional browsers:
-  //    1. add an entry in test/e2e/nightwatch.conf.js under "test_settings"
-  //    2. add it to the --env flag below
-  // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox`
-  // For more information on Nightwatch's config file, see
-  // http://nightwatchjs.org/guide#settings-file
-  let opts = process.argv.slice(2)
-  if (opts.indexOf('--config') === -1) {
-    opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js'])
-  }
-  if (opts.indexOf('--env') === -1) {
-    opts = opts.concat(['--env', 'chrome'])
-  }
-
-  const spawn = require('cross-spawn')
-  const runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' })
-
-  runner.on('exit', function (code) {
-    server.close()
-    process.exit(code)
-  })
-
-  runner.on('error', function (err) {
-    server.close()
-    throw err
-  })
-})
diff --git a/template/test/e2e/specs/test.js b/template/test/e2e/specs/test.js
deleted file mode 100644
index 92ecc1216d..0000000000
--- a/template/test/e2e/specs/test.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// For authoring Nightwatch tests, see
-// http://nightwatchjs.org/guide#usage
-
-module.exports = {
-  'default e2e tests': function {{#if_eq lintConfig "airbnb"}}test{{/if_eq}}(browser) {
-    // automatically uses dev Server port from /config.index.js
-    // default: http://localhost:8080
-    // see nightwatch.conf.js
-    const devServer = browser.globals.devServerURL
-
-    browser
-      .url(devServer)
-      .waitForElementVisible('#app', 5000)
-      .assert.elementPresent('.hello')
-      .assert.containsText('h1', 'Welcome to Your Vue.js App')
-      .assert.elementCount('img', 1)
-      .end()
-  }
-}
diff --git a/template/test/unit/.eslintrc b/template/test/unit/.eslintrc
deleted file mode 100644
index 74061c48b8..0000000000
--- a/template/test/unit/.eslintrc
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "env": { {{#if_eq runner "karma"}}
-    "mocha": true{{/if_eq}}{{#if_eq runner "jest"}}
-    "jest": true{{/if_eq}}
-  },
-  "globals": { {{#if_eq runner "karma"}}
-    "expect": true,
-    "sinon": true{{/if_eq}}
-  }
-}
diff --git a/template/test/unit/index.js b/template/test/unit/index.js
deleted file mode 100644
index c69f33fd8a..0000000000
--- a/template/test/unit/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import Vue from 'vue'
-
-Vue.config.productionTip = false
-
-// require all test files (files that ends with .spec.js)
-const testsContext = require.context('./specs', true, /\.spec$/)
-testsContext.keys().forEach(testsContext)
-
-// require all src files except main.js for coverage.
-// you can also change this to match only the subset of files that
-// you want coverage for.
-const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/)
-srcContext.keys().forEach(srcContext)
diff --git a/template/test/unit/jest.conf.js b/template/test/unit/jest.conf.js
deleted file mode 100644
index c524e9d7bd..0000000000
--- a/template/test/unit/jest.conf.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const path = require('path')
-
-module.exports = {
-  rootDir: path.resolve(__dirname, '../../'),
-  moduleFileExtensions: [
-    'js',
-    'json',
-    'vue'
-  ],
-  moduleNameMapper: {
-    '^@/(.*)$': '<rootDir>/src/$1'
-  },
-  transform: {
-    '^.+\\.js$': '<rootDir>/node_modules/babel-jest',
-    '.*\\.(vue)$': '<rootDir>/node_modules/vue-jest'
-  },{{#e2e}}
-  testPathIgnorePatterns: [
-    '<rootDir>/test/e2e'
-  ],{{/e2e}}
-  snapshotSerializers: ['<rootDir>/node_modules/jest-serializer-vue'],
-  setupFiles: ['<rootDir>/test/unit/setup'],
-  mapCoverage: true,
-  coverageDirectory: '<rootDir>/test/unit/coverage',
-  collectCoverageFrom: [
-    'src/**/*.{js,vue}',
-    '!src/main.js',
-    {{#router}}
-    '!src/router/index.js',
-    {{/router}}
-    '!**/node_modules/**'
-  ]
-}
diff --git a/template/test/unit/karma.conf.js b/template/test/unit/karma.conf.js
deleted file mode 100644
index 5d3966d23e..0000000000
--- a/template/test/unit/karma.conf.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// This is a karma config file. For more details see
-//   http://karma-runner.github.io/0.13/config/configuration-file.html
-// we are also using it with karma-webpack
-//   https://github.com/webpack/karma-webpack
-
-var webpackConfig = require('../../build/webpack.test.conf')
-
-module.exports = function karmaConfig (config) {
-  config.set({
-    // to run in additional browsers:
-    // 1. install corresponding karma launcher
-    //    http://karma-runner.github.io/0.13/config/browsers.html
-    // 2. add it to the `browsers` array below.
-    browsers: ['PhantomJS'],
-    frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'],
-    reporters: ['spec', 'coverage'],
-    files: ['./index.js'],
-    preprocessors: {
-      './index.js': ['webpack', 'sourcemap']
-    },
-    webpack: webpackConfig,
-    webpackMiddleware: {
-      noInfo: true
-    },
-    coverageReporter: {
-      dir: './coverage',
-      reporters: [
-        { type: 'lcov', subdir: '.' },
-        { type: 'text-summary' }
-      ]
-    }
-  })
-}
diff --git a/template/test/unit/setup.js b/template/test/unit/setup.js
deleted file mode 100644
index edbdbae81e..0000000000
--- a/template/test/unit/setup.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import Vue from 'vue'
-
-Vue.config.productionTip = false
diff --git a/template/test/unit/specs/HelloWorld.spec.js b/template/test/unit/specs/HelloWorld.spec.js
deleted file mode 100644
index 1c75ca64cd..0000000000
--- a/template/test/unit/specs/HelloWorld.spec.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import Vue from 'vue'
-import HelloWorld from '@/components/HelloWorld'
-
-describe('HelloWorld.vue', () => {
-  it('should render correct contents', () => {
-    const Constructor = Vue.extend(HelloWorld)
-    const vm = new Constructor().$mount()
-    expect(vm.$el.querySelector('.hello h1').textContent)
-      {{#if_eq runner "karma"}}.to.equal('Welcome to Your Vue.js App'){{/if_eq}}{{#if_eq runner "jest"}}.toEqual('Welcome to Your Vue.js App'){{/if_eq}}
-  })
-})