king
2019-10-24 a0d5241e8b7ec3d11e5e029187c48920c3834f8c
top-menu
6 文件已重命名
15个文件已修改
6个文件已添加
3032 ■■■■■ 已修改文件
package-lock.json 2272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/dragelement/card.jsx 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/dragelement/index.jsx 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/dragelement/index.scss 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/dragelement/itemtypes.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/header/index.jsx 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/header/index.scss 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/mutilform/index.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/simpleform/index.jsx 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/simpleform/index.scss 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tabview/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/en-US/header.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/en-US/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/zh-CN/header.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/zh-CN/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/action-type.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/action.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/reducer.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainAction/index.jsx 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainAction/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainSearch/index.jsx 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainSearch/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainTable/index.jsx 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/modules/mainTable/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/datamanage/modules/search/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -1483,6 +1483,11 @@
        }
      }
    },
    "@types/asap": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/@types/asap/-/asap-2.0.0.tgz",
      "integrity": "sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg=="
    },
    "@types/babel__core": {
      "version": "7.1.3",
      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz",
@@ -1524,6 +1529,20 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
      "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
    },
    "@types/hoist-non-react-statics": {
      "version": "3.3.1",
      "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
      "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
      "requires": {
        "@types/react": "16.9.2",
        "hoist-non-react-statics": "3.3.0"
      }
    },
    "@types/invariant": {
      "version": "2.2.30",
      "resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.30.tgz",
      "integrity": "sha512-98fB+yo7imSD2F7PF7GIpELNgtLNgo5wjivu0W5V4jx+KVVJxo6p/qN4zdzSTBWy4/sN3pPyXwnhRSD28QX+ag=="
    },
    "@types/istanbul-lib-coverage": {
      "version": "2.0.1",
@@ -1571,6 +1590,14 @@
        "csstype": "2.6.6"
      }
    },
    "@types/react-dom": {
      "version": "16.9.2",
      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.2.tgz",
      "integrity": "sha512-hgPbBoI1aTSTvZwo8HYw35UaTldW6n2ETLvHAcfcg1FaOuBV3olmyCe5eMpx2WybWMBPv0MdU2t5GOcQhP+3zA==",
      "requires": {
        "@types/react": "16.9.2"
      }
    },
    "@types/react-slick": {
      "version": "0.23.4",
      "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.4.tgz",
@@ -1578,6 +1605,19 @@
      "requires": {
        "@types/react": "16.9.2"
      }
    },
    "@types/reselect": {
      "version": "2.2.0",
      "resolved": "https://registry.npmjs.org/@types/reselect/-/reselect-2.2.0.tgz",
      "integrity": "sha1-xmcgbP3DgZDh03m6vgiGWyKIV18=",
      "requires": {
        "reselect": "3.0.1"
      }
    },
    "@types/shallowequal": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/@types/shallowequal/-/shallowequal-1.1.1.tgz",
      "integrity": "sha512-Lhni3aX80zbpdxRuWhnuYPm8j8UQaa571lHP/xI4W+7BAFhSIhRReXnqjEgT/XzPoXZTJkCqstFMJ8CZTK6IlQ=="
    },
    "@types/stack-utils": {
      "version": "1.0.1",
@@ -1838,6 +1878,11 @@
      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz",
      "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ=="
    },
    "acorn-es7-plugin": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz",
      "integrity": "sha1-8u4fMiipDurRJF+asZIusucdM2s="
    },
    "acorn-globals": {
      "version": "4.3.3",
      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz",
@@ -1895,6 +1940,11 @@
          "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="
        }
      }
    },
    "agentframework": {
      "version": "0.9.22",
      "resolved": "https://registry.npmjs.org/agentframework/-/agentframework-0.9.22.tgz",
      "integrity": "sha512-LKQwcxVWbfJj+gtdHYeq+nqUIg3+NkYS7LCMZ3hMk1eZkFjJqG5RiPsXiYZV5vOQESUZwoY0e9k9Kz/GfhoVEw=="
    },
    "ajv": {
      "version": "6.10.2",
@@ -2021,6 +2071,19 @@
      "requires": {
        "micromatch": "3.1.10",
        "normalize-path": "2.1.1"
      }
    },
    "app-root-path": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz",
      "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y="
    },
    "append-transform": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
      "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
      "requires": {
        "default-require-extensions": "1.0.0"
      }
    },
    "aproba": {
@@ -2314,6 +2377,57 @@
        }
      }
    },
    "babel-core": {
      "version": "6.26.3",
      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
      "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.6.0",
        "debug": "2.6.9",
        "json5": "0.5.1",
        "lodash": "4.17.15",
        "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==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "json5": {
          "version": "0.5.1",
          "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        },
        "slash": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
        }
      }
    },
    "babel-eslint": {
      "version": "10.0.2",
      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz",
@@ -2346,6 +2460,47 @@
        "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==",
      "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.15",
        "source-map": "0.5.7",
        "trim-right": "1.0.1"
      },
      "dependencies": {
        "jsesc": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
          "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
        }
      }
    },
    "babel-helper-builder-react-jsx": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz",
      "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=",
      "requires": {
        "babel-runtime": "6.26.0",
        "babel-types": "6.26.0",
        "esutils": "2.0.3"
      }
    },
    "babel-helpers": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
      "requires": {
        "babel-runtime": "6.26.0",
        "babel-template": "6.26.0"
      }
    },
    "babel-jest": {
      "version": "24.9.0",
      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
@@ -2376,6 +2531,14 @@
          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
        }
      }
    },
    "babel-messages": {
      "version": "6.23.0",
      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
      "requires": {
        "babel-runtime": "6.26.0"
      }
    },
    "babel-plugin-dynamic-import-node": {
@@ -2449,6 +2612,11 @@
      "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.3.tgz",
      "integrity": "sha512-1XDRysF4894BUdMChT+2HHbtJYiO7zx5Be7U6bT8dISy7OdyETMGIAQBMPQCsY1YRf0xcubwnKKaDr5bk15JTA=="
    },
    "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="
    },
    "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",
@@ -2463,10 +2631,28 @@
        "babel-runtime": "6.26.0"
      }
    },
    "babel-plugin-transform-react-jsx": {
      "version": "6.24.1",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz",
      "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=",
      "requires": {
        "babel-helper-builder-react-jsx": "6.26.0",
        "babel-plugin-syntax-jsx": "6.18.0",
        "babel-runtime": "6.26.0"
      }
    },
    "babel-plugin-transform-react-remove-prop-types": {
      "version": "0.4.24",
      "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
      "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
    },
    "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=",
      "requires": {
        "babel-runtime": "6.26.0"
      }
    },
    "babel-preset-jest": {
      "version": "24.9.0",
@@ -2538,6 +2724,30 @@
        }
      }
    },
    "babel-register": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
      "requires": {
        "babel-core": "6.26.3",
        "babel-runtime": "6.26.0",
        "core-js": "2.6.9",
        "home-or-tmp": "2.0.0",
        "lodash": "4.17.15",
        "mkdirp": "0.5.1",
        "source-map-support": "0.4.18"
      },
      "dependencies": {
        "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==",
          "requires": {
            "source-map": "0.5.7"
          }
        }
      }
    },
    "babel-runtime": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
@@ -2551,6 +2761,72 @@
          "version": "0.11.1",
          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
          "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
        }
      }
    },
    "babel-template": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
      "requires": {
        "babel-runtime": "6.26.0",
        "babel-traverse": "6.26.0",
        "babel-types": "6.26.0",
        "babylon": "6.18.0",
        "lodash": "4.17.15"
      }
    },
    "babel-traverse": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
      "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.15"
      },
      "dependencies": {
        "debug": {
          "version": "2.6.9",
          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
          "requires": {
            "ms": "2.0.0"
          }
        },
        "globals": {
          "version": "9.18.0",
          "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
          "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
        },
        "ms": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "babel-types": {
      "version": "6.26.0",
      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
      "requires": {
        "babel-runtime": "6.26.0",
        "esutils": "2.0.3",
        "lodash": "4.17.15",
        "to-fast-properties": "1.0.3"
      },
      "dependencies": {
        "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="
        }
      }
    },
@@ -2973,6 +3249,11 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
    },
    "call-signature": {
      "version": "0.0.2",
      "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz",
      "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY="
    },
    "caller-callsite": {
      "version": "2.0.0",
@@ -3965,6 +4246,14 @@
        "ip-regex": "2.1.0"
      }
    },
    "default-require-extensions": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
      "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
      "requires": {
        "strip-bom": "2.0.0"
      }
    },
    "define-properties": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -4083,6 +4372,14 @@
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
    },
    "detect-indent": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
      "requires": {
        "repeating": "2.0.1"
      }
    },
    "detect-newline": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
@@ -4116,6 +4413,16 @@
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "diff": {
      "version": "3.5.0",
      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
    },
    "diff-match-patch": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz",
      "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg=="
    },
    "diff-sequences": {
      "version": "24.9.0",
@@ -4154,6 +4461,18 @@
          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
          "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
        }
      }
    },
    "dnd-core": {
      "version": "9.4.0",
      "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-9.4.0.tgz",
      "integrity": "sha512-Kg+8VwU8s7TgdR/BUYGUHrvFiS+5ePMZ0Q0XD7p+cFVJvgKqykBaeQDuaziuauFMPm8QxtnUy8Pncey9flXW3Q==",
      "requires": {
        "@types/asap": "2.0.0",
        "@types/invariant": "2.2.30",
        "asap": "2.0.6",
        "invariant": "2.2.4",
        "redux": "4.0.4"
      }
    },
    "dns-equal": {
@@ -4303,6 +4622,1043 @@
        }
      }
    },
    "dragact": {
      "version": "0.2.12",
      "resolved": "https://registry.npmjs.org/dragact/-/dragact-0.2.12.tgz",
      "integrity": "sha512-xJ6ep1vjA0diJdh2hKs+dIZ+ehRE+7t89Av68+P26i72vXRS/pPqWZp35I1SKFAVDCecqECKZgOn/Kuk2MUFqg==",
      "requires": {
        "@types/react": "16.9.2",
        "@types/react-dom": "16.9.2",
        "@types/reselect": "2.2.0",
        "agentframework": "0.9.22",
        "babel-jest": "22.4.4",
        "babel-plugin-transform-object-rest-spread": "6.26.0",
        "babel-plugin-transform-react-jsx": "6.24.1",
        "babel-plugin-transform-runtime": "6.23.0",
        "highlightjs": "9.12.0",
        "jest": "22.4.4",
        "power-assert": "1.6.1",
        "prop-types": "15.7.2",
        "react": "16.9.0",
        "react-dom": "16.9.0",
        "reselect": "3.0.1",
        "showdown": "1.9.0",
        "typescript-babel-jest": "1.0.6"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
        },
        "arr-diff": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
          "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="
        },
        "babel-jest": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.4.tgz",
          "integrity": "sha512-A9NB6/lZhYyypR9ATryOSDcqBaqNdzq4U+CN+/wcMsLcmKkPxQEoTKLajGfd3IkxNyVBT8NewUK2nWyGbSzHEQ==",
          "requires": {
            "babel-plugin-istanbul": "4.1.6",
            "babel-preset-jest": "22.4.4"
          }
        },
        "babel-plugin-istanbul": {
          "version": "4.1.6",
          "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz",
          "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==",
          "requires": {
            "babel-plugin-syntax-object-rest-spread": "6.13.0",
            "find-up": "2.1.0",
            "istanbul-lib-instrument": "1.10.2",
            "test-exclude": "4.2.3"
          }
        },
        "babel-plugin-jest-hoist": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.4.tgz",
          "integrity": "sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ=="
        },
        "babel-preset-jest": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.4.tgz",
          "integrity": "sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==",
          "requires": {
            "babel-plugin-jest-hoist": "22.4.4",
            "babel-plugin-syntax-object-rest-spread": "6.13.0"
          }
        },
        "braces": {
          "version": "1.8.5",
          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
          "requires": {
            "expand-range": "1.8.2",
            "preserve": "0.2.0",
            "repeat-element": "1.1.3"
          }
        },
        "camelcase": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
        },
        "capture-exit": {
          "version": "1.2.0",
          "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz",
          "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=",
          "requires": {
            "rsvp": "3.6.2"
          }
        },
        "ci-info": {
          "version": "1.6.0",
          "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
          "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="
        },
        "cliui": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
          "requires": {
            "string-width": "2.1.1",
            "strip-ansi": "4.0.0",
            "wrap-ansi": "2.1.0"
          }
        },
        "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=",
          "requires": {
            "lru-cache": "4.1.5",
            "shebang-command": "1.2.0",
            "which": "1.3.1"
          }
        },
        "debug": {
          "version": "3.2.6",
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
          "requires": {
            "ms": "2.1.2"
          }
        },
        "exec-sh": {
          "version": "0.2.2",
          "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz",
          "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==",
          "requires": {
            "merge": "1.2.1"
          }
        },
        "execa": {
          "version": "0.7.0",
          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
          "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": "0.1.5",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
          "requires": {
            "is-posix-bracket": "0.1.1"
          }
        },
        "expect": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz",
          "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==",
          "requires": {
            "ansi-styles": "3.2.1",
            "jest-diff": "22.4.3",
            "jest-get-type": "22.4.3",
            "jest-matcher-utils": "22.4.3",
            "jest-message-util": "22.4.3",
            "jest-regex-util": "22.4.3"
          }
        },
        "extglob": {
          "version": "0.3.2",
          "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
          "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        },
        "find-up": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
          "requires": {
            "locate-path": "2.0.0"
          }
        },
        "get-stream": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
        },
        "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==",
          "requires": {
            "pkg-dir": "2.0.0",
            "resolve-cwd": "2.0.0"
          }
        },
        "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==",
          "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=="
            }
          }
        },
        "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-ci": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
          "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
          "requires": {
            "ci-info": "1.6.0"
          }
        },
        "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==",
          "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=="
            }
          }
        },
        "is-descriptor": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
          "requires": {
            "is-accessor-descriptor": "1.0.0",
            "is-data-descriptor": "1.0.0",
            "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=="
            }
          }
        },
        "is-extglob": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
        },
        "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="
        },
        "is-generator-fn": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz",
          "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go="
        },
        "is-glob": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        },
        "istanbul-lib-coverage": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
          "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ=="
        },
        "istanbul-lib-instrument": {
          "version": "1.10.2",
          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
          "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
          "requires": {
            "babel-generator": "6.26.1",
            "babel-template": "6.26.0",
            "babel-traverse": "6.26.0",
            "babel-types": "6.26.0",
            "babylon": "6.18.0",
            "istanbul-lib-coverage": "1.2.1",
            "semver": "5.7.1"
          }
        },
        "istanbul-lib-source-maps": {
          "version": "1.2.6",
          "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
          "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
          "requires": {
            "debug": "3.2.6",
            "istanbul-lib-coverage": "1.2.1",
            "mkdirp": "0.5.1",
            "rimraf": "2.7.1",
            "source-map": "0.5.7"
          }
        },
        "jest": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.4.tgz",
          "integrity": "sha512-eBhhW8OS/UuX3HxgzNBSVEVhSuRDh39Z1kdYkQVWna+scpgsrD7vSeBI7tmEvsguPDMnfJodW28YBnhv/BzSew==",
          "requires": {
            "import-local": "1.0.0",
            "jest-cli": "22.4.4"
          },
          "dependencies": {
            "jest-cli": {
              "version": "22.4.4",
              "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.4.tgz",
              "integrity": "sha512-I9dsgkeyjVEEZj9wrGrqlH+8OlNob9Iptyl+6L5+ToOLJmHm4JwOPatin1b2Bzp5R5YRQJ+oiedx7o1H7wJzhA==",
              "requires": {
                "ansi-escapes": "3.2.0",
                "chalk": "2.4.2",
                "exit": "0.1.2",
                "glob": "7.1.4",
                "graceful-fs": "4.2.2",
                "import-local": "1.0.0",
                "is-ci": "1.2.1",
                "istanbul-api": "1.3.7",
                "istanbul-lib-coverage": "1.2.1",
                "istanbul-lib-instrument": "1.10.2",
                "istanbul-lib-source-maps": "1.2.6",
                "jest-changed-files": "22.4.3",
                "jest-config": "22.4.4",
                "jest-environment-jsdom": "22.4.3",
                "jest-get-type": "22.4.3",
                "jest-haste-map": "22.4.3",
                "jest-message-util": "22.4.3",
                "jest-regex-util": "22.4.3",
                "jest-resolve-dependencies": "22.4.3",
                "jest-runner": "22.4.4",
                "jest-runtime": "22.4.4",
                "jest-snapshot": "22.4.3",
                "jest-util": "22.4.3",
                "jest-validate": "22.4.4",
                "jest-worker": "22.4.3",
                "micromatch": "2.3.11",
                "node-notifier": "5.4.3",
                "realpath-native": "1.1.0",
                "rimraf": "2.7.1",
                "slash": "1.0.0",
                "string-length": "2.0.0",
                "strip-ansi": "4.0.0",
                "which": "1.3.1",
                "yargs": "10.1.2"
              }
            }
          }
        },
        "jest-changed-files": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz",
          "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==",
          "requires": {
            "throat": "4.1.0"
          }
        },
        "jest-config": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.4.tgz",
          "integrity": "sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==",
          "requires": {
            "chalk": "2.4.2",
            "glob": "7.1.4",
            "jest-environment-jsdom": "22.4.3",
            "jest-environment-node": "22.4.3",
            "jest-get-type": "22.4.3",
            "jest-jasmine2": "22.4.4",
            "jest-regex-util": "22.4.3",
            "jest-resolve": "22.4.3",
            "jest-util": "22.4.3",
            "jest-validate": "22.4.4",
            "pretty-format": "22.4.3"
          }
        },
        "jest-diff": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz",
          "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==",
          "requires": {
            "chalk": "2.4.2",
            "diff": "3.5.0",
            "jest-get-type": "22.4.3",
            "pretty-format": "22.4.3"
          }
        },
        "jest-docblock": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz",
          "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==",
          "requires": {
            "detect-newline": "2.1.0"
          }
        },
        "jest-environment-jsdom": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz",
          "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==",
          "requires": {
            "jest-mock": "22.4.3",
            "jest-util": "22.4.3",
            "jsdom": "11.12.0"
          }
        },
        "jest-environment-node": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz",
          "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==",
          "requires": {
            "jest-mock": "22.4.3",
            "jest-util": "22.4.3"
          }
        },
        "jest-get-type": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz",
          "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w=="
        },
        "jest-haste-map": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz",
          "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==",
          "requires": {
            "fb-watchman": "2.0.0",
            "graceful-fs": "4.2.2",
            "jest-docblock": "22.4.3",
            "jest-serializer": "22.4.3",
            "jest-worker": "22.4.3",
            "micromatch": "2.3.11",
            "sane": "2.5.2"
          }
        },
        "jest-jasmine2": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.4.tgz",
          "integrity": "sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==",
          "requires": {
            "chalk": "2.4.2",
            "co": "4.6.0",
            "expect": "22.4.3",
            "graceful-fs": "4.2.2",
            "is-generator-fn": "1.0.0",
            "jest-diff": "22.4.3",
            "jest-matcher-utils": "22.4.3",
            "jest-message-util": "22.4.3",
            "jest-snapshot": "22.4.3",
            "jest-util": "22.4.3",
            "source-map-support": "0.5.13"
          }
        },
        "jest-leak-detector": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz",
          "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==",
          "requires": {
            "pretty-format": "22.4.3"
          }
        },
        "jest-matcher-utils": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz",
          "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==",
          "requires": {
            "chalk": "2.4.2",
            "jest-get-type": "22.4.3",
            "pretty-format": "22.4.3"
          }
        },
        "jest-message-util": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz",
          "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==",
          "requires": {
            "@babel/code-frame": "7.5.5",
            "chalk": "2.4.2",
            "micromatch": "2.3.11",
            "slash": "1.0.0",
            "stack-utils": "1.0.2"
          }
        },
        "jest-mock": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz",
          "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q=="
        },
        "jest-regex-util": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz",
          "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg=="
        },
        "jest-resolve": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz",
          "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==",
          "requires": {
            "browser-resolve": "1.11.3",
            "chalk": "2.4.2"
          }
        },
        "jest-resolve-dependencies": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz",
          "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==",
          "requires": {
            "jest-regex-util": "22.4.3"
          }
        },
        "jest-runner": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.4.tgz",
          "integrity": "sha512-5S/OpB51igQW9xnkM5Tgd/7ZjiAuIoiJAVtvVTBcEBiXBIFzWM3BAMPBM19FX68gRV0KWyFuGKj0EY3M3aceeQ==",
          "requires": {
            "exit": "0.1.2",
            "jest-config": "22.4.4",
            "jest-docblock": "22.4.3",
            "jest-haste-map": "22.4.3",
            "jest-jasmine2": "22.4.4",
            "jest-leak-detector": "22.4.3",
            "jest-message-util": "22.4.3",
            "jest-runtime": "22.4.4",
            "jest-util": "22.4.3",
            "jest-worker": "22.4.3",
            "throat": "4.1.0"
          }
        },
        "jest-runtime": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.4.tgz",
          "integrity": "sha512-WRTj9m///npte1YjuphCYX7GRY/c2YvJImU9t7qOwFcqHr4YMzmX6evP/3Sehz5DKW2Vi8ONYPCFWe36JVXxfw==",
          "requires": {
            "babel-core": "6.26.3",
            "babel-jest": "22.4.4",
            "babel-plugin-istanbul": "4.1.6",
            "chalk": "2.4.2",
            "convert-source-map": "1.6.0",
            "exit": "0.1.2",
            "graceful-fs": "4.2.2",
            "jest-config": "22.4.4",
            "jest-haste-map": "22.4.3",
            "jest-regex-util": "22.4.3",
            "jest-resolve": "22.4.3",
            "jest-util": "22.4.3",
            "jest-validate": "22.4.4",
            "json-stable-stringify": "1.0.1",
            "micromatch": "2.3.11",
            "realpath-native": "1.1.0",
            "slash": "1.0.0",
            "strip-bom": "3.0.0",
            "write-file-atomic": "2.4.1",
            "yargs": "10.1.2"
          }
        },
        "jest-serializer": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz",
          "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw=="
        },
        "jest-snapshot": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz",
          "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==",
          "requires": {
            "chalk": "2.4.2",
            "jest-diff": "22.4.3",
            "jest-matcher-utils": "22.4.3",
            "mkdirp": "0.5.1",
            "natural-compare": "1.4.0",
            "pretty-format": "22.4.3"
          }
        },
        "jest-util": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz",
          "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==",
          "requires": {
            "callsites": "2.0.0",
            "chalk": "2.4.2",
            "graceful-fs": "4.2.2",
            "is-ci": "1.2.1",
            "jest-message-util": "22.4.3",
            "mkdirp": "0.5.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=="
            }
          }
        },
        "jest-validate": {
          "version": "22.4.4",
          "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.4.tgz",
          "integrity": "sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==",
          "requires": {
            "chalk": "2.4.2",
            "jest-config": "22.4.4",
            "jest-get-type": "22.4.3",
            "leven": "2.1.0",
            "pretty-format": "22.4.3"
          }
        },
        "jest-worker": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz",
          "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==",
          "requires": {
            "merge-stream": "1.0.1"
          }
        },
        "leven": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
          "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA="
        },
        "locate-path": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
          "requires": {
            "p-locate": "2.0.0",
            "path-exists": "3.0.0"
          }
        },
        "mem": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
          "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
          "requires": {
            "mimic-fn": "1.2.0"
          }
        },
        "merge-stream": {
          "version": "1.0.1",
          "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
          "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
          "requires": {
            "readable-stream": "2.3.6"
          }
        },
        "micromatch": {
          "version": "2.3.11",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
          "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"
          }
        },
        "os-locale": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
          "requires": {
            "execa": "0.7.0",
            "lcid": "1.0.0",
            "mem": "1.1.0"
          }
        },
        "p-limit": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
          "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=",
          "requires": {
            "p-limit": "1.3.0"
          }
        },
        "p-try": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
        },
        "path-exists": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
        },
        "pkg-dir": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
          "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
          "requires": {
            "find-up": "2.1.0"
          }
        },
        "pretty-format": {
          "version": "22.4.3",
          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz",
          "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==",
          "requires": {
            "ansi-regex": "3.0.0",
            "ansi-styles": "3.2.1"
          }
        },
        "rsvp": {
          "version": "3.6.2",
          "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz",
          "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw=="
        },
        "sane": {
          "version": "2.5.2",
          "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz",
          "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=",
          "requires": {
            "anymatch": "2.0.0",
            "capture-exit": "1.2.0",
            "exec-sh": "0.2.2",
            "fb-watchman": "2.0.0",
            "fsevents": "1.2.9",
            "micromatch": "3.1.10",
            "minimist": "1.2.0",
            "walker": "1.0.7",
            "watch": "0.18.0"
          },
          "dependencies": {
            "arr-diff": {
              "version": "4.0.0",
              "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
              "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
            },
            "array-unique": {
              "version": "0.3.2",
              "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
              "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
            },
            "braces": {
              "version": "2.3.2",
              "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
              "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
              "requires": {
                "arr-flatten": "1.1.0",
                "array-unique": "0.3.2",
                "extend-shallow": "2.0.1",
                "fill-range": "4.0.0",
                "isobject": "3.0.1",
                "repeat-element": "1.1.3",
                "snapdragon": "0.8.2",
                "snapdragon-node": "2.1.1",
                "split-string": "3.1.0",
                "to-regex": "3.0.2"
              },
              "dependencies": {
                "extend-shallow": {
                  "version": "2.0.1",
                  "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
                  "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
                  "requires": {
                    "is-extendable": "0.1.1"
                  }
                }
              }
            },
            "debug": {
              "version": "2.6.9",
              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
              "requires": {
                "ms": "2.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=",
              "requires": {
                "debug": "2.6.9",
                "define-property": "0.2.5",
                "extend-shallow": "2.0.1",
                "posix-character-classes": "0.1.1",
                "regex-not": "1.0.2",
                "snapdragon": "0.8.2",
                "to-regex": "3.0.2"
              },
              "dependencies": {
                "define-property": {
                  "version": "0.2.5",
                  "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
                  "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
                  "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=",
                  "requires": {
                    "is-extendable": "0.1.1"
                  }
                },
                "is-descriptor": {
                  "version": "0.1.6",
                  "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
                  "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
                  "requires": {
                    "is-accessor-descriptor": "0.1.6",
                    "is-data-descriptor": "0.1.4",
                    "kind-of": "5.1.0"
                  }
                },
                "kind-of": {
                  "version": "5.1.0",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
                  "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
                }
              }
            },
            "extglob": {
              "version": "2.0.4",
              "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
              "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
              "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=",
                  "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=",
                  "requires": {
                    "is-extendable": "0.1.1"
                  }
                }
              }
            },
            "is-accessor-descriptor": {
              "version": "0.1.6",
              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
              "requires": {
                "kind-of": "3.2.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "requires": {
                    "is-buffer": "1.1.6"
                  }
                }
              }
            },
            "is-data-descriptor": {
              "version": "0.1.4",
              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
              "requires": {
                "kind-of": "3.2.2"
              },
              "dependencies": {
                "kind-of": {
                  "version": "3.2.2",
                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
                  "requires": {
                    "is-buffer": "1.1.6"
                  }
                }
              }
            },
            "kind-of": {
              "version": "6.0.2",
              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
              "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
            },
            "micromatch": {
              "version": "3.1.10",
              "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
              "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
              "requires": {
                "arr-diff": "4.0.0",
                "array-unique": "0.3.2",
                "braces": "2.3.2",
                "define-property": "2.0.2",
                "extend-shallow": "3.0.2",
                "extglob": "2.0.4",
                "fragment-cache": "0.2.1",
                "kind-of": "6.0.2",
                "nanomatch": "1.2.13",
                "object.pick": "1.3.0",
                "regex-not": "1.0.2",
                "snapdragon": "0.8.2",
                "to-regex": "3.0.2"
              }
            },
            "ms": {
              "version": "2.0.0",
              "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
            }
          }
        },
        "semver": {
          "version": "5.7.1",
          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
        },
        "slash": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
          "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
        },
        "string-width": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
          "requires": {
            "is-fullwidth-code-point": "2.0.0",
            "strip-ansi": "4.0.0"
          }
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "requires": {
            "ansi-regex": "3.0.0"
          }
        },
        "strip-bom": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
        },
        "test-exclude": {
          "version": "4.2.3",
          "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz",
          "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==",
          "requires": {
            "arrify": "1.0.1",
            "micromatch": "2.3.11",
            "object-assign": "4.1.1",
            "read-pkg-up": "1.0.1",
            "require-main-filename": "1.0.1"
          }
        },
        "watch": {
          "version": "0.18.0",
          "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz",
          "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=",
          "requires": {
            "exec-sh": "0.2.2",
            "minimist": "1.2.0"
          }
        },
        "which-module": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
        },
        "yargs": {
          "version": "10.1.2",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
          "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
          "requires": {
            "cliui": "4.1.0",
            "decamelize": "1.2.0",
            "find-up": "2.1.0",
            "get-caller-file": "1.0.3",
            "os-locale": "2.1.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": "8.1.0"
          }
        },
        "yargs-parser": {
          "version": "8.1.0",
          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
          "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
          "requires": {
            "camelcase": "4.1.0"
          }
        }
      }
    },
    "duplexer": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
@@ -4318,6 +5674,11 @@
        "readable-stream": "2.3.6",
        "stream-shift": "1.0.0"
      }
    },
    "eastasianwidth": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
    },
    "ecc-jsbn": {
      "version": "0.1.2",
@@ -4361,6 +5722,24 @@
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
      "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
    },
    "empower": {
      "version": "1.3.1",
      "resolved": "https://registry.npmjs.org/empower/-/empower-1.3.1.tgz",
      "integrity": "sha512-uB6/ViBaawOO/uujFADTK3SqdYlxYNn+N4usK9MRKZ4Hbn/1QSy8k2PezxCA2/+JGbF8vd/eOfghZ90oOSDZCA==",
      "requires": {
        "core-js": "2.6.9",
        "empower-core": "1.2.0"
      }
    },
    "empower-core": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-1.2.0.tgz",
      "integrity": "sha512-g6+K6Geyc1o6FdXs9HwrXleCFan7d66G5xSCfSF7x1mJDCes6t0om9lFQG3zOrzh3Bkb/45N0cZ5Gqsf7YrzGQ==",
      "requires": {
        "call-signature": "0.0.2",
        "core-js": "2.6.9"
      }
    },
    "encodeurl": {
      "version": "1.0.2",
@@ -4973,6 +6352,14 @@
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
    },
    "espurify": {
      "version": "1.8.1",
      "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.8.1.tgz",
      "integrity": "sha512-ZDko6eY/o+D/gHCWyHTU85mKDgYcS4FJj7S+YD6WIInm7GQ6AnOjmcL4+buFV/JOztVLELi/7MmuGU5NHta0Mg==",
      "requires": {
        "core-js": "2.6.9"
      }
    },
    "esquery": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
@@ -5121,6 +6508,49 @@
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
        }
      }
    },
    "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=",
      "requires": {
        "fill-range": "2.2.4"
      },
      "dependencies": {
        "fill-range": {
          "version": "2.2.4",
          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
          "requires": {
            "is-number": "2.1.0",
            "isobject": "2.1.0",
            "randomatic": "3.1.1",
            "repeat-element": "1.1.3",
            "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=",
          "requires": {
            "kind-of": "3.2.2"
          }
        },
        "isarray": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
        },
        "isobject": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
          "requires": {
            "isarray": "1.0.0"
          }
        }
      }
    },
@@ -5421,6 +6851,20 @@
      "requires": {
        "loader-utils": "1.2.3",
        "schema-utils": "1.0.0"
      }
    },
    "filename-regex": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
    },
    "fileset": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz",
      "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=",
      "requires": {
        "glob": "7.1.4",
        "minimatch": "3.0.4"
      }
    },
    "filesize": {
@@ -6217,6 +7661,38 @@
        "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=",
      "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=",
          "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="
        },
        "is-glob": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        }
      }
    },
    "glob-parent": {
      "version": "5.0.0",
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz",
@@ -6472,6 +7948,11 @@
      "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
    },
    "highlightjs": {
      "version": "9.12.0",
      "resolved": "https://registry.npmjs.org/highlightjs/-/highlightjs-9.12.0.tgz",
      "integrity": "sha512-eAhWMtDZaOZIQdxIP4UEB1vNp/CVXQPdMSihTSuaExhFIRC0BVpXbtP3mTP1hDoGOyh7nbB3cuC3sOPhG5wGDA=="
    },
    "history": {
      "version": "4.9.0",
      "resolved": "https://registry.npmjs.org/history/-/history-4.9.0.tgz",
@@ -6501,6 +7982,15 @@
      "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==",
      "requires": {
        "react-is": "16.9.0"
      }
    },
    "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=",
      "requires": {
        "os-homedir": "1.0.2",
        "os-tmpdir": "1.0.2"
      }
    },
    "hosted-git-info": {
@@ -6765,6 +8255,14 @@
      "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
      "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
    },
    "immutability-helper": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.0.1.tgz",
      "integrity": "sha512-U92ROQQt7XkIwrdqCByUI118TQM1hXdKnRQpvKeA0HRyGSnJipu9IWHe4UD8zCN00O8UnQjQzPCgZ1CC3yBzHA==",
      "requires": {
        "invariant": "2.2.4"
      }
    },
    "immutable": {
      "version": "4.0.0-rc.12",
      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz",
@@ -6826,6 +8324,11 @@
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
    },
    "indexof": {
      "version": "0.0.1",
      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
    },
    "infer-owner": {
      "version": "1.0.4",
@@ -7051,6 +8554,19 @@
      "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
    },
    "is-dotfile": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
    },
    "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=",
      "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",
@@ -7131,6 +8647,16 @@
      "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="
    },
    "is-primitive": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
    },
    "is-promise": {
      "version": "2.1.0",
@@ -7235,10 +8761,122 @@
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
    },
    "istanbul-api": {
      "version": "1.3.7",
      "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
      "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==",
      "requires": {
        "async": "2.6.3",
        "fileset": "2.0.3",
        "istanbul-lib-coverage": "1.2.1",
        "istanbul-lib-hook": "1.2.2",
        "istanbul-lib-instrument": "1.10.2",
        "istanbul-lib-report": "1.1.5",
        "istanbul-lib-source-maps": "1.2.6",
        "istanbul-reports": "1.5.1",
        "js-yaml": "3.13.1",
        "mkdirp": "0.5.1",
        "once": "1.4.0"
      },
      "dependencies": {
        "async": {
          "version": "2.6.3",
          "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
          "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
          "requires": {
            "lodash": "4.17.15"
          }
        },
        "debug": {
          "version": "3.2.6",
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
          "requires": {
            "ms": "2.1.2"
          }
        },
        "has-flag": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
        },
        "istanbul-lib-coverage": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
          "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ=="
        },
        "istanbul-lib-instrument": {
          "version": "1.10.2",
          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
          "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
          "requires": {
            "babel-generator": "6.26.1",
            "babel-template": "6.26.0",
            "babel-traverse": "6.26.0",
            "babel-types": "6.26.0",
            "babylon": "6.18.0",
            "istanbul-lib-coverage": "1.2.1",
            "semver": "5.7.1"
          }
        },
        "istanbul-lib-report": {
          "version": "1.1.5",
          "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
          "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==",
          "requires": {
            "istanbul-lib-coverage": "1.2.1",
            "mkdirp": "0.5.1",
            "path-parse": "1.0.6",
            "supports-color": "3.2.3"
          }
        },
        "istanbul-lib-source-maps": {
          "version": "1.2.6",
          "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
          "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
          "requires": {
            "debug": "3.2.6",
            "istanbul-lib-coverage": "1.2.1",
            "mkdirp": "0.5.1",
            "rimraf": "2.7.1",
            "source-map": "0.5.7"
          }
        },
        "istanbul-reports": {
          "version": "1.5.1",
          "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
          "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==",
          "requires": {
            "handlebars": "4.2.0"
          }
        },
        "semver": {
          "version": "5.7.1",
          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
        },
        "supports-color": {
          "version": "3.2.3",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
          "requires": {
            "has-flag": "1.0.0"
          }
        }
      }
    },
    "istanbul-lib-coverage": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
      "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA=="
    },
    "istanbul-lib-hook": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
      "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==",
      "requires": {
        "append-transform": "0.4.0"
      }
    },
    "istanbul-lib-instrument": {
      "version": "3.3.0",
@@ -8574,6 +10212,11 @@
        "object-visit": "1.0.1"
      }
    },
    "math-random": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
    },
    "md5": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
@@ -8653,6 +10296,11 @@
        "redent": "1.0.0",
        "trim-newlines": "1.0.0"
      }
    },
    "merge": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
      "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ=="
    },
    "merge-deep": {
      "version": "3.0.2",
@@ -9367,6 +11015,15 @@
        "es-abstract": "1.14.1"
      }
    },
    "object.omit": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
      "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",
@@ -9630,6 +11287,32 @@
        "evp_bytestokey": "1.0.3",
        "pbkdf2": "3.0.17",
        "safe-buffer": "5.1.2"
      }
    },
    "parse-glob": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
      "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="
        },
        "is-glob": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        }
      }
    },
    "parse-json": {
@@ -10696,10 +12379,131 @@
        "uniq": "1.0.1"
      }
    },
    "power-assert": {
      "version": "1.6.1",
      "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-1.6.1.tgz",
      "integrity": "sha512-VWkkZV6Y+W8qLX/PtJu2Ur2jDPIs0a5vbP0TpKeybNcIXmT4vcKoVkyTp5lnQvTpY/DxacAZ4RZisHRHLJcAZQ==",
      "requires": {
        "define-properties": "1.1.3",
        "empower": "1.3.1",
        "power-assert-formatter": "1.4.1",
        "universal-deep-strict-equal": "1.2.2",
        "xtend": "4.0.2"
      }
    },
    "power-assert-context-formatter": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-context-formatter/-/power-assert-context-formatter-1.2.0.tgz",
      "integrity": "sha512-HLNEW8Bin+BFCpk/zbyKwkEu9W8/zThIStxGo7weYcFkKgMuGCHUJhvJeBGXDZf0Qm2xis4pbnnciGZiX0EpSg==",
      "requires": {
        "core-js": "2.6.9",
        "power-assert-context-traversal": "1.2.0"
      }
    },
    "power-assert-context-reducer-ast": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-context-reducer-ast/-/power-assert-context-reducer-ast-1.2.0.tgz",
      "integrity": "sha512-EgOxmZ/Lb7tw4EwSKX7ZnfC0P/qRZFEG28dx/690qvhmOJ6hgThYFm5TUWANDLK5NiNKlPBi5WekVGd2+5wPrw==",
      "requires": {
        "acorn": "5.7.3",
        "acorn-es7-plugin": "1.1.7",
        "core-js": "2.6.9",
        "espurify": "1.8.1",
        "estraverse": "4.3.0"
      },
      "dependencies": {
        "acorn": {
          "version": "5.7.3",
          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
          "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw=="
        }
      }
    },
    "power-assert-context-traversal": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-context-traversal/-/power-assert-context-traversal-1.2.0.tgz",
      "integrity": "sha512-NFoHU6g2umNajiP2l4qb0BRWD773Aw9uWdWYH9EQsVwIZnog5bd2YYLFCVvaxWpwNzWeEfZIon2xtyc63026pQ==",
      "requires": {
        "core-js": "2.6.9",
        "estraverse": "4.3.0"
      }
    },
    "power-assert-formatter": {
      "version": "1.4.1",
      "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-1.4.1.tgz",
      "integrity": "sha1-XcEl7VCj37HdomwZNH879Y7CiEo=",
      "requires": {
        "core-js": "2.6.9",
        "power-assert-context-formatter": "1.2.0",
        "power-assert-context-reducer-ast": "1.2.0",
        "power-assert-renderer-assertion": "1.2.0",
        "power-assert-renderer-comparison": "1.2.0",
        "power-assert-renderer-diagram": "1.2.0",
        "power-assert-renderer-file": "1.2.0"
      }
    },
    "power-assert-renderer-assertion": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-renderer-assertion/-/power-assert-renderer-assertion-1.2.0.tgz",
      "integrity": "sha512-3F7Q1ZLmV2ZCQv7aV7NJLNK9G7QsostrhOU7U0RhEQS/0vhEqrRg2jEJl1jtUL4ZyL2dXUlaaqrmPv5r9kRvIg==",
      "requires": {
        "power-assert-renderer-base": "1.1.1",
        "power-assert-util-string-width": "1.2.0"
      }
    },
    "power-assert-renderer-base": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/power-assert-renderer-base/-/power-assert-renderer-base-1.1.1.tgz",
      "integrity": "sha1-lqZQxv0F7hvB9mtUrWFELIs/Y+s="
    },
    "power-assert-renderer-comparison": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-renderer-comparison/-/power-assert-renderer-comparison-1.2.0.tgz",
      "integrity": "sha512-7c3RKPDBKK4E3JqdPtYRE9cM8AyX4LC4yfTvvTYyx8zSqmT5kJnXwzR0yWQLOavACllZfwrAGQzFiXPc5sWa+g==",
      "requires": {
        "core-js": "2.6.9",
        "diff-match-patch": "1.0.4",
        "power-assert-renderer-base": "1.1.1",
        "stringifier": "1.4.0",
        "type-name": "2.0.2"
      }
    },
    "power-assert-renderer-diagram": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-renderer-diagram/-/power-assert-renderer-diagram-1.2.0.tgz",
      "integrity": "sha512-JZ6PC+DJPQqfU6dwSmpcoD7gNnb/5U77bU5KgNwPPa+i1Pxiz6UuDeM3EUBlhZ1HvH9tMjI60anqVyi5l2oNdg==",
      "requires": {
        "core-js": "2.6.9",
        "power-assert-renderer-base": "1.1.1",
        "power-assert-util-string-width": "1.2.0",
        "stringifier": "1.4.0"
      }
    },
    "power-assert-renderer-file": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-renderer-file/-/power-assert-renderer-file-1.2.0.tgz",
      "integrity": "sha512-/oaVrRbeOtGoyyd7e4IdLP/jIIUFJdqJtsYzP9/88R39CMnfF/S/rUc8ZQalENfUfQ/wQHu+XZYRMaCEZmEesg==",
      "requires": {
        "power-assert-renderer-base": "1.1.1"
      }
    },
    "power-assert-util-string-width": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/power-assert-util-string-width/-/power-assert-util-string-width-1.2.0.tgz",
      "integrity": "sha512-lX90G0igAW0iyORTILZ/QjZWsa1MZ6VVY3L0K86e2eKun3S4LKPH4xZIl8fdeMYLfOjkaszbNSzf1uugLeAm2A==",
      "requires": {
        "eastasianwidth": "0.2.0"
      }
    },
    "prelude-ls": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
    },
    "preserve": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
    },
    "pretty-bytes": {
      "version": "5.3.0",
@@ -10888,6 +12692,28 @@
      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
      "requires": {
        "performance-now": "2.1.0"
      }
    },
    "randomatic": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
      "requires": {
        "is-number": "4.0.0",
        "kind-of": "6.0.2",
        "math-random": "1.0.4"
      },
      "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=="
        },
        "kind-of": {
          "version": "6.0.2",
          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
        }
      }
    },
    "randombytes": {
@@ -11623,6 +13449,26 @@
        }
      }
    },
    "react-dnd": {
      "version": "9.4.0",
      "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.4.0.tgz",
      "integrity": "sha512-jnLF8qKowCKTqSddfCiLx5+sb+HxO1qgdiAgbBeL8yuo5tRYNtKxZYn7+wVwNoyZuWEuM1Gw/Wsdhr+yb2RELQ==",
      "requires": {
        "@types/hoist-non-react-statics": "3.3.1",
        "@types/shallowequal": "1.1.1",
        "dnd-core": "9.4.0",
        "hoist-non-react-statics": "3.3.0",
        "shallowequal": "1.1.0"
      }
    },
    "react-dnd-html5-backend": {
      "version": "9.4.0",
      "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-9.4.0.tgz",
      "integrity": "sha512-gehPwLp505F6RoFkQiDX7Q4mbpbyfyT0TbIoZop/m4vkBw6yUE/QLrnxBQdNpDPSwL/9XkZxxd/PrbeMCQ+WrQ==",
      "requires": {
        "dnd-core": "9.4.0"
      }
    },
    "react-dom": {
      "version": "16.9.0",
      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz",
@@ -11841,6 +13687,14 @@
        "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==",
      "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",
@@ -12027,6 +13881,11 @@
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
    },
    "reselect": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz",
      "integrity": "sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc="
    },
    "resize-observer-polyfill": {
      "version": "1.5.1",
@@ -12600,6 +14459,180 @@
      "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
      "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww=="
    },
    "showdown": {
      "version": "1.9.0",
      "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.0.tgz",
      "integrity": "sha512-x7xDCRIaOlicbC57nMhGfKamu+ghwsdVkHMttyn+DelwzuHOx4OHCVL/UW/2QOLH7BxfCcCCVVUix3boKXJKXQ==",
      "requires": {
        "yargs": "10.1.2"
      },
      "dependencies": {
        "ansi-regex": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
        },
        "camelcase": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
          "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0="
        },
        "cliui": {
          "version": "4.1.0",
          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
          "requires": {
            "string-width": "2.1.1",
            "strip-ansi": "4.0.0",
            "wrap-ansi": "2.1.0"
          }
        },
        "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=",
          "requires": {
            "lru-cache": "4.1.5",
            "shebang-command": "1.2.0",
            "which": "1.3.1"
          }
        },
        "execa": {
          "version": "0.7.0",
          "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
          "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
          "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"
          }
        },
        "find-up": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
          "requires": {
            "locate-path": "2.0.0"
          }
        },
        "get-stream": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
          "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
        },
        "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="
        },
        "locate-path": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
          "requires": {
            "p-locate": "2.0.0",
            "path-exists": "3.0.0"
          }
        },
        "mem": {
          "version": "1.1.0",
          "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
          "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
          "requires": {
            "mimic-fn": "1.2.0"
          }
        },
        "os-locale": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
          "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
          "requires": {
            "execa": "0.7.0",
            "lcid": "1.0.0",
            "mem": "1.1.0"
          }
        },
        "p-limit": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
          "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=",
          "requires": {
            "p-limit": "1.3.0"
          }
        },
        "p-try": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
        },
        "path-exists": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
        },
        "string-width": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
          "requires": {
            "is-fullwidth-code-point": "2.0.0",
            "strip-ansi": "4.0.0"
          }
        },
        "strip-ansi": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
          "requires": {
            "ansi-regex": "3.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="
        },
        "yargs": {
          "version": "10.1.2",
          "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
          "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
          "requires": {
            "cliui": "4.1.0",
            "decamelize": "1.2.0",
            "find-up": "2.1.0",
            "get-caller-file": "1.0.3",
            "os-locale": "2.1.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": "8.1.0"
          }
        },
        "yargs-parser": {
          "version": "8.1.0",
          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
          "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
          "requires": {
            "camelcase": "4.1.0"
          }
        }
      }
    },
    "signal-exit": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -13086,6 +15119,16 @@
        "safe-buffer": "5.1.2"
      }
    },
    "stringifier": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-1.4.0.tgz",
      "integrity": "sha512-cNsMOqqrcbLcHTXEVmkw9y0fwDwkdgtZwlfyolzpQDoAE1xdNGhQhxBUfiDvvZIKl1hnUEgMv66nHwtMz3OjPw==",
      "requires": {
        "core-js": "2.6.9",
        "traverse": "0.6.6",
        "type-name": "2.0.2"
      }
    },
    "stringify-object": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
@@ -13536,6 +15579,11 @@
        "punycode": "2.1.1"
      }
    },
    "traverse": {
      "version": "0.6.6",
      "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
      "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc="
    },
    "trim-newlines": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -13612,10 +15660,217 @@
        "mime-types": "2.1.24"
      }
    },
    "type-name": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz",
      "integrity": "sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q="
    },
    "typedarray": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
    },
    "typescript": {
      "version": "2.9.2",
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
      "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w=="
    },
    "typescript-babel-jest": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/typescript-babel-jest/-/typescript-babel-jest-1.0.6.tgz",
      "integrity": "sha512-S+b3V+WsTAXlfdeh9JFIMrfMZCCP++T6ThzPIrtuujunsRZYXpZzXR5/SIV4euBKLrreMbK+Zw9JPx9dZIuKZQ==",
      "requires": {
        "app-root-path": "2.0.1",
        "babel-jest": "20.0.3",
        "typescript": "2.9.2"
      },
      "dependencies": {
        "arr-diff": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
          "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
          "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="
        },
        "babel-jest": {
          "version": "20.0.3",
          "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz",
          "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=",
          "requires": {
            "babel-core": "6.26.3",
            "babel-plugin-istanbul": "4.1.6",
            "babel-preset-jest": "20.0.3"
          }
        },
        "babel-plugin-istanbul": {
          "version": "4.1.6",
          "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz",
          "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==",
          "requires": {
            "babel-plugin-syntax-object-rest-spread": "6.13.0",
            "find-up": "2.1.0",
            "istanbul-lib-instrument": "1.10.2",
            "test-exclude": "4.2.3"
          }
        },
        "babel-plugin-jest-hoist": {
          "version": "20.0.3",
          "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz",
          "integrity": "sha1-r+3IU70/jcNUjqZx++adA8wsF2c="
        },
        "babel-preset-jest": {
          "version": "20.0.3",
          "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz",
          "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=",
          "requires": {
            "babel-plugin-jest-hoist": "20.0.3"
          }
        },
        "braces": {
          "version": "1.8.5",
          "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
          "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
          "requires": {
            "expand-range": "1.8.2",
            "preserve": "0.2.0",
            "repeat-element": "1.1.3"
          }
        },
        "expand-brackets": {
          "version": "0.1.5",
          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
          "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
          "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=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        },
        "find-up": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
          "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
          "requires": {
            "locate-path": "2.0.0"
          }
        },
        "is-extglob": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
          "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
        },
        "is-glob": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
          "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
          "requires": {
            "is-extglob": "1.0.0"
          }
        },
        "istanbul-lib-coverage": {
          "version": "1.2.1",
          "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
          "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ=="
        },
        "istanbul-lib-instrument": {
          "version": "1.10.2",
          "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
          "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
          "requires": {
            "babel-generator": "6.26.1",
            "babel-template": "6.26.0",
            "babel-traverse": "6.26.0",
            "babel-types": "6.26.0",
            "babylon": "6.18.0",
            "istanbul-lib-coverage": "1.2.1",
            "semver": "5.7.1"
          }
        },
        "locate-path": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
          "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
          "requires": {
            "p-locate": "2.0.0",
            "path-exists": "3.0.0"
          }
        },
        "micromatch": {
          "version": "2.3.11",
          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
          "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
          "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"
          }
        },
        "p-limit": {
          "version": "1.3.0",
          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
          "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
          "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=",
          "requires": {
            "p-limit": "1.3.0"
          }
        },
        "p-try": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
          "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
        },
        "path-exists": {
          "version": "3.0.0",
          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
        },
        "semver": {
          "version": "5.7.1",
          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
        },
        "test-exclude": {
          "version": "4.2.3",
          "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz",
          "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==",
          "requires": {
            "arrify": "1.0.1",
            "micromatch": "2.3.11",
            "object-assign": "4.1.1",
            "read-pkg-up": "1.0.1",
            "require-main-filename": "1.0.1"
          }
        }
      }
    },
    "ua-parser-js": {
      "version": "0.7.20",
@@ -13704,6 +15959,23 @@
        "imurmurhash": "0.1.4"
      }
    },
    "universal-deep-strict-equal": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/universal-deep-strict-equal/-/universal-deep-strict-equal-1.2.2.tgz",
      "integrity": "sha1-DaSsL3PP95JMgfpN4BjKViyisKc=",
      "requires": {
        "array-filter": "1.0.0",
        "indexof": "0.0.1",
        "object-keys": "1.1.1"
      },
      "dependencies": {
        "array-filter": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
          "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM="
        }
      }
    },
    "universalify": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
package.json
@@ -20,6 +20,7 @@
    "css-loader": "2.1.1",
    "dotenv": "6.2.0",
    "dotenv-expand": "4.2.0",
    "dragact": "^0.2.12",
    "eslint": "^6.1.0",
    "eslint-config-react-app": "^5.0.1",
    "eslint-loader": "2.2.1",
@@ -33,6 +34,7 @@
    "html-webpack-plugin": "4.0.0-beta.5",
    "http-proxy-middleware": "^0.20.0",
    "identity-obj-proxy": "3.0.0",
    "immutability-helper": "^3.0.1",
    "immutable": "^4.0.0-rc.12",
    "is-wsl": "^1.1.0",
    "jest": "24.8.0",
@@ -54,6 +56,8 @@
    "react": "^16.9.0",
    "react-app-polyfill": "^1.0.2",
    "react-dev-utils": "^9.0.3",
    "react-dnd": "^9.4.0",
    "react-dnd-html5-backend": "^9.4.0",
    "react-dom": "^16.9.0",
    "react-redux": "^7.1.1",
    "react-router-dom": "^5.0.1",
@@ -144,7 +148,15 @@
    "presets": [
      "react-app"
    ],
    "plugins": [["import", { "libraryName": "antd", "style": "css" }]]
    "plugins": [
      [
        "import",
        {
          "libraryName": "antd",
          "style": "css"
        }
      ]
    ]
  },
  "homepage": "."
}
src/components/dragelement/card.jsx
New file
@@ -0,0 +1,44 @@
import React from 'react'
import { useDrag, useDrop } from 'react-dnd'
import { Icon } from 'antd'
import ItemTypes from './itemtypes'
import './index.scss'
const Card = ({ id, text, moveCard, findCard, closeCard, editCard }) => {
  const originalIndex = findCard(id).index
  const [{ isDragging }, drag] = useDrag({
    item: { type: ItemTypes.CARD, id, originalIndex },
    collect: monitor => ({
      isDragging: monitor.isDragging(),
    }),
  })
  const [, drop] = useDrop({
    accept: ItemTypes.CARD,
    canDrop: () => false,
    hover({ id: draggedId }) {
      if (draggedId !== id) {
        const { index: overIndex } = findCard(id)
        moveCard(draggedId, overIndex)
      }
    },
  })
  const opacity = isDragging ? 0 : 1
  const close = () => {
    closeCard(id)
  }
  const edit = () => {
    editCard(id)
  }
  return (
    <div className="card" style={{ opacity }}>
      <div ref={node => drag(drop(node))}>
        {text}
      </div>
      <Icon className="close" type="close" onClick={close} />
      <Icon className="edit" type="edit" onClick={edit} />
    </div>
  )
}
export default Card
src/components/dragelement/index.jsx
New file
@@ -0,0 +1,79 @@
import React, { useState } from 'react'
import { useDrop } from 'react-dnd'
import { Icon, Button } from 'antd'
import update from 'immutability-helper'
import Card from './card'
import ItemTypes from './itemtypes'
import './index.scss'
const Container = ({dict, list, handlePreviewList, handleMenu, handleButton }) => {
  const [cards, setCards] = useState(list)
  const moveCard = (id, atIndex) => {
    const { card, index } = findCard(id)
    const _cards = update(cards, { $splice: [[index, 1], [atIndex, 0, card]] })
    setCards(_cards)
    handlePreviewList(_cards)
  }
  const findCard = id => {
    const card = cards.filter(c => `${c.id}` === id)[0]
    return {
      card,
      index: cards.indexOf(card),
    }
  }
  const closeCard = id => {
    const { card, index } = findCard(id)
    handleMenu({
      card,
      index,
      type: 'close'
    })
  }
  const editCard = id => {
    const { card, index } = findCard(id)
    handleMenu({
      card,
      index,
      type: 'edit'
    })
  }
  const add = () => {
    handleButton('add')
  }
  const confirm = () => {
    handleButton('confirm')
  }
  const cancel = () => {
    handleButton('cancel')
  }
  const [, drop] = useDrop({ accept: ItemTypes.CARD })
  return (
    <>
      <div ref={drop} className="dragdashboard">
        {cards.map(card => (
          <Card
            key={card.id}
            id={`${card.id}`}
            text={card.text}
            moveCard={moveCard}
            closeCard={closeCard}
            editCard={editCard}
            findCard={findCard}
          />
        ))}
        <div className="card-add" onClick={add}>
          <Icon type="plus" />
        </div>
        <Button type="primary" onClick={confirm}>{dict['header.confirm']}</Button>
        <Button onClick={cancel}>{dict['header.return']}</Button>
      </div>
    </>
  )
}
export default Container
src/components/dragelement/index.scss
New file
@@ -0,0 +1,56 @@
.dragdashboard {
  width: calc(100vw - 400px);
  float: left;
  background: #001529;
  .card-add {
    border: 1px dashed gray;
    padding: 2px;
    margin-top: 10px;
    margin-left: 10px;
    width: 50px;
    float: left;
    text-align: center;
    cursor: pointer;
  }
  button {
    margin-top: 10px;
    margin-left: 10px;
    padding: 0 10px;
    height: 26px;
  }
}
.card {
  position: relative;
  border: 1px dashed gray;
  padding-right: 15px;
  margin-top: 7px;
  margin-right: 10px;
  float: left;
  div {
    padding: 5px;
    cursor: move;
    min-width: 43px;
    max-width: 70px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .close {
    position: absolute;
    right: 0;
    top: 0;
    cursor: pointer;
    :hover {
      color: #ffffff;
    }
  }
  .edit {
    position: absolute;
    right: 0;
    bottom: 0;
    cursor: pointer;
    :hover {
      color: #ffffff;
    }
  }
}
src/components/dragelement/itemtypes.js
New file
@@ -0,0 +1,3 @@
export default {
  CARD: 'card',
}
src/components/header/index.jsx
@@ -3,10 +3,14 @@
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import {Dropdown, Menu, Icon, Modal, message, Form } from 'antd'
import {Dropdown, Menu, Icon, Modal, message, Form, notification } from 'antd'
import { DndProvider } from 'react-dnd'
import HTML5Backend from 'react-dnd-html5-backend'
import md5 from 'md5'
import {toggleCollapse, modifyMainMenu, resetState, resetDebug} from '@/store/action'
import SimpleForm from '@/components/simpleform'
import {toggleCollapse, modifyMainMenu, resetState, resetDebug, resetEditState} from '@/store/action'
import Resetpwd from '@/components/resetpwd'
import DragElement from '@/components/dragelement'
import Api from '@/api'
import zhCN from '@/locales/zh-CN/header.js'
import enUS from '@/locales/en-US/header.js'
@@ -16,6 +20,8 @@
import './index.scss'
const { confirm } = Modal
const { SubMenu } = Menu
let previewList = null
class Header extends Component {
  static propTpyes = {
@@ -26,8 +32,11 @@
    ])
  }
  state = {
    menulist: null,
    visible: false,
    menulist: null, // 一级菜单
    visible: false, // 修改密码模态框
    addMvisible: false, // 添加菜单模态框
    editMenu: null, // 编辑菜单
    editMvisible: false, // 编辑菜单模态框
    dict: (!localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS,
    confirmLoading: false,
    userName: localStorage.getItem('username')
@@ -142,10 +151,165 @@
        this.props.modifyMainMenu(result.data[0])
      }
      previewList = result.data.map((item, index) => {
        item.id = index
        item.text = item.MenuName
        return item
      })
      this.setState({
        menulist: result.data
        menulist: previewList
      })
    }
  }
  handlePreviewList = (List) => {
    // 菜单顺序改变时,保存中间状态
    previewList = List
  }
  handleButton = (type) => {
    // 菜单编辑:添加,确定,取消
    if (type === 'add') {
      this.setState({
        addMvisible: true
      })
    } else if (type === 'confirm' && !is(fromJS(previewList), fromJS(this.state.menulist))) {
      Api.logoutsystem().then(res => {
        if (res.status) {
          this.loadmenu()
        } else {
          message.warning(res.message)
        }
      })
    } else {
      previewList = this.state.menulist
      this.props.resetEditState(false)
    }
  }
  handleMenu = (Menu) => {
    // 菜单编辑:修改、删除
    const _this = this
    const menu = fromJS(Menu)
    const card = menu.get('card')
    if (!is(fromJS(previewList), fromJS(this.state.menulist))) {
      notification.warning({
        top: 92,
        message: this.state.dict['header.menu.presave'],
        duration: 10
      })
    } else if (menu.get('type') === 'close') {
      confirm({
        title: this.state.dict['header.menu.close'].replace('@M', card.get('MenuName')),
        content: '',
        okText: this.state.dict['header.confirm'],
        cancelText: this.state.dict['header.cancel'],
        onOk() {
          return Api.logoutsystem().then(res => {
            if (res.status) {
              _this.loadmenu()
            } else {
              message.warning(res.message)
            }
          })
        },
        onCancel() {}
      })
    } else if (menu.get('type') === 'edit') {
      this.setState({
        editMvisible: true,
        editMenu: [
          {
            type: 'text',
            key: 'menuID',
            label: this.state.dict['header.menu.menuID'],
            initVal: card.get('MenuID'),
            required: true,
            readonly: true
          },
          {
            type: 'text',
            key: 'menuName',
            label: this.state.dict['header.menu.menuName'],
            initVal: card.get('MenuName'),
            required: true,
            readonly: false
          }
        ]
      })
    }
  }
  changeEditState = (state) => {
    // 修改编辑菜单类型
    this.props.resetEditState(state)
  }
  addMemuSubmit = () => {
    // 新建菜单:提交
    this.addMenuFormRef.handleConfirm().then(res => {
      this.setState({
        confirmLoading: true
      })
      Api.logoutsystem().then(res => {
        if (res.status) {
          this.setState({
            confirmLoading: false,
            addMvisible: false
          })
          this.addMenuFormRef.handleReset()
          this.loadmenu()
        } else {
          this.setState({
            confirmLoading: false
          })
          message.warning(res.message)
        }
      })
    }, () => {})
  }
  addMemuCancel = () => {
    // 新建菜单:取消
    this.setState({
      confirmLoading: false,
      addMvisible: false
    })
    this.addMenuFormRef.handleReset()
  }
  editMemuSubmit = () => {
    // 编辑菜单:提交
    this.editMenuFormRef.handleConfirm().then(res => {
      this.setState({
        confirmLoading: true
      })
      Api.logoutsystem().then(res => {
        if (res.status) {
          this.setState({
            confirmLoading: false,
            editMvisible: false,
            editMenu: null
          })
          this.loadmenu()
        } else {
          this.setState({
            confirmLoading: false
          })
          message.warning(res.message)
        }
      })
    }, () => {})
  }
  editMemuCancel = () => {
    // 编辑菜单:取消
    this.setState({
      confirmLoading: false,
      editMvisible: false
    })
    this.editMenuFormRef.handleReset()
  }
  
  UNSAFE_componentWillMount () {
@@ -159,7 +323,12 @@
  render () {
    const menu = (
      <Menu className="header-dropdown">
      <Menu overlayclassname="header-dropdown">
        {this.props.debug && <SubMenu title="编辑">
          <Menu.Item onClick={() => {this.changeEditState('level1')}}>一级菜单</Menu.Item>
          <Menu.Item>二级菜单</Menu.Item>
          <Menu.Item>三级菜单</Menu.Item>
        </SubMenu>}
        <Menu.Item key="1" onClick={this.changePassword}>{this.state.dict['header.password']}</Menu.Item>
        <Menu.Item key="2" onClick={this.logout}>{this.state.dict['header.logout']}</Menu.Item>
      </Menu>
@@ -171,7 +340,7 @@
        <div className={this.props.collapse ? "collapse header-collapse" : "header-collapse"} onClick={this.handleCollapse}>
          <Icon type={this.props.collapse ? 'menu-unfold' : 'menu-fold'} />
        </div>
        {this.state.menulist && <ul className="header-menu">{
        {this.props.editState !== 'level1' && this.state.menulist && <ul className="header-menu">{
          this.state.menulist.map(item => {
            return (
              <li key={item.MenuID} onClick={() => {this.changeMenu(item)}} className={this.props.selectmenu.MenuID === item.MenuID ? 'active' : ''}>
@@ -180,14 +349,24 @@
            )
          })
        }</ul>}
        {this.props.editState === 'level1' && this.state.menulist && <DndProvider className="header-drag-menu" backend={HTML5Backend}>
          <DragElement
            dict={this.state.dict}
            list={this.state.menulist}
            handlePreviewList={this.handlePreviewList}
            handleMenu={this.handleMenu}
            handleButton={this.handleButton}
          />
        </DndProvider>}
        <Dropdown className="header-setting" overlay={menu}>
          <div>
            <img src={avatar} alt=""/>
            <span>
              {this.state.userName} <Icon type="down" />
              <span className="username">{this.state.userName}</span> <Icon type="down" />
            </span>
          </div>
        </Dropdown>
        {/* 修改密码 */}
        <Modal
          title={this.state.dict['header.password']}
          okText={this.state.dict['header.confirm']}
@@ -199,6 +378,57 @@
        >
          <Resetpwd dict={this.state.dict} wrappedComponentRef={(inst) => this.formRef = inst} resetPwdSubmit={this.resetPwdSubmit}/>
        </Modal>
        {/* 新建菜单模态框 */}
        <Modal
          title={this.state.dict['header.menu.addtitle']}
          okText={this.state.dict['header.confirm']}
          cancelText={this.state.dict['header.cancel']}
          visible={this.state.addMvisible}
          onOk={this.addMemuSubmit}
          confirmLoading={this.state.confirmLoading}
          onCancel={this.addMemuCancel}
        >
          <SimpleForm
            dict={this.state.dict}
            formlist={[
              {
                type: 'text',
                key: 'menuID',
                label: this.state.dict['header.menu.menuID'],
                initVal: '',
                required: true,
                readonly: false
              },
              {
                type: 'text',
                key: 'menuName',
                label: this.state.dict['header.menu.menuName'],
                initVal: '',
                required: true,
                readonly: false
              }
            ]}
            cols={1}
            wrappedComponentRef={(inst) => this.addMenuFormRef = inst}
          />
        </Modal>
        {/* 编辑菜单模态框 */}
        <Modal
          title={this.state.dict['header.menu.edittitle']}
          okText={this.state.dict['header.confirm']}
          cancelText={this.state.dict['header.cancel']}
          visible={this.state.editMvisible}
          onOk={this.editMemuSubmit}
          confirmLoading={this.state.confirmLoading}
          onCancel={this.editMemuCancel}
        >
          <SimpleForm
            dict={this.state.dict}
            formlist={this.state.editMenu || []}
            cols={1}
            wrappedComponentRef={(inst) => this.editMenuFormRef = inst}
          />
        </Modal>
      </header>
    )
  }
@@ -207,7 +437,9 @@
const mapStateToProps = (state) => {
  return {
    collapse: state.collapse,
    selectmenu: state.selectedMainMenu
    selectmenu: state.selectedMainMenu,
    debug: state.debug,
    editState: state.editState
  }
}
@@ -216,7 +448,8 @@
    toggleCollapse: (collapse) => dispatch(toggleCollapse(collapse)),
    modifyMainMenu: (selectmenu) => dispatch(modifyMainMenu(selectmenu)),
    resetState: () => dispatch(resetState()),
    resetDebug: () => dispatch(resetDebug())
    resetDebug: () => dispatch(resetDebug()),
    resetEditState: (state) => dispatch(resetEditState(state))
  }
}
src/components/header/index.scss
@@ -75,8 +75,19 @@
    span {
      color: #ffffff;
      font-size: 1.3rem;
      .username {
        display: inline-block;
        height: 30px;
        max-width: 95px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
      }
    }
  }
  .header-drag-menu {
    float: left;
  }
}
.header-dropdown {
  li {
src/components/mutilform/index.jsx
@@ -54,7 +54,7 @@
                rules: [
                  {
                    required: _required,
                    message: this.props.dict['main.form.required.input'] + item.Label + '!'
                    message: this.props.dict['form.required.input'] + item.Label + '!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
@@ -80,7 +80,7 @@
                rules: [
                  {
                    required: _required,
                    message: this.props.dict['main.form.required.input'] + item.Label + '!'
                    message: this.props.dict['form.required.input'] + item.Label + '!'
                  }
                ]
              })(model)}
@@ -96,7 +96,7 @@
                rules: [
                  {
                    required: _required,
                    message: this.props.dict['main.form.required.select'] + item.Label + '!'
                    message: this.props.dict['form.required.select'] + item.Label + '!'
                  }
                ]
              })(
@@ -123,7 +123,7 @@
                rules: [
                  {
                    required: _required,
                    message: this.props.dict['main.form.required.select'] + item.Label + '!'
                    message: this.props.dict['form.required.select'] + item.Label + '!'
                  }
                ]
              })(
@@ -142,7 +142,7 @@
                rules: [
                  {
                    required: _required,
                    message: this.props.dict['main.form.required.select'] + item.Label + '!'
                    message: this.props.dict['form.required.select'] + item.Label + '!'
                  }
                ]
              })(
src/components/simpleform/index.jsx
New file
@@ -0,0 +1,198 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, InputNumber, Select, DatePicker } from 'antd'
import moment from 'moment'
import './index.scss'
const dateFormat = 'YYYY-MM-DD'
const timeFormat = 'YYYY-MM-DD HH:mm:ss'
class MainSearch extends Component {
  static propTpyes = {
    formlist: PropTypes.array, // 搜索条件列表
    dict: PropTypes.object, // 字典项
    cols: PropTypes.number
  }
  state = {
    formats: null, // 事件校验规则
    datatype: null
  }
  UNSAFE_componentWillMount () {
    let formats = {}
    let datatype = {}
    this.props.formlist.forEach(item => {
      if (item.InputType === 'date') {
        formats[item.FieldName] = dateFormat
      } else if (item.InputType === 'datetime') {
        formats[item.FieldName] = timeFormat
      }
      datatype[item.FieldName] = item.InputType
    })
    this.setState({
      formats: formats,
      datatype: datatype
    })
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
    this.props.formlist.forEach((item, index) => {
      if (item.type === 'text') { // 文本搜索
        fields.push(
          <Col span={24 / this.props.cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal || '',
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.input'] + item.label + '!'
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'spinner') { // 数字
        let min = item.hasOwnProperty('validate') && item.validate.hasOwnProperty('min') ? item.validate.min : -Infinity
        let max = item.hasOwnProperty('validate') && item.validate.hasOwnProperty('max') ? item.validate.max : Infinity
        let model = <InputNumber initialValue={item.initVal || 0} disabled={item.readonly} min={min} max={max} />
        fields.push(
          <Col span={24 / this.props.cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal || 0,
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.input'] + item.label + '!'
                  }
                ]
              })(model)}
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'select') { // 下拉搜索
        fields.push(
          <Col span={24 / this.props.cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal || '',
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.select'] + item.label + '!'
                  }
                ]
              })(
                <Select
                  showSearch
                  filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
                  getPopupContainer={() => document.getElementById('form-box')}
                >
                  {item.options.map(option =>
                    <Select.Option id={option.id} title={option.text} key={option.id} value={option.id}>{option.text}</Select.Option>
                  )}
                </Select>
              )}
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'date') { // 时间搜索
        fields.push(
          <Col span={24 / this.props.cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal ? moment(item.initVal, dateFormat) : null,
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.select'] + item.label + '!'
                  }
                ]
              })(
                <DatePicker getCalendarContainer={() => document.getElementById('form-box')} format={dateFormat} />
              )}
            </Form.Item>
          </Col>
        )
      } else if (item.type === 'datetime') {
        fields.push(
          <Col span={24 / this.props.cols} key={index}>
            <Form.Item label={item.label}>
              {getFieldDecorator(item.key, {
                initialValue: item.initVal ? moment(item.initVal, timeFormat) : null,
                rules: [
                  {
                    required: !!item.required,
                    message: this.props.dict['form.required.select'] + item.label + '!'
                  }
                ]
              })(
                <DatePicker showTime format={timeFormat} />
              )}
            </Form.Item>
          </Col>
        )
      }
    })
    return fields
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      this.props.form.validateFieldsAndScroll((err, values) => {
        if (!err) {
          let formdata = {}
          Object.keys(values).forEach(key => {
            if (values[key] && typeof(values[key]) === 'object') {
              formdata[key] = moment(values[key]).format(this.state.formats[key])
            } else if (values[key] || values[key] === 0) {
              if (this.state.datatype[key] === 'spinner') {
                formdata[key] = parseFloat(values[key])
              } else {
                formdata[key] = values[key].replace(/\t|\v|\n|\r/g,'')
              }
            } else {
              formdata[key] = ''
            }
          })
          resolve(formdata)
        } else {
          reject(err)
        }
      })
    })
  }
  handleReset = () => {
    // 重置
    this.props.form.resetFields()
  }
  render() {
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 }
      }
    }
    return (
      <Form {...formItemLayout} className="ant-advanced-search-form" id="form-box">
        <Row gutter={24}>{this.getFields()}</Row>
      </Form>
    )
  }
}
export default Form.create()(MainSearch)
src/components/simpleform/index.scss
New file
@@ -0,0 +1,20 @@
.ant-advanced-search-form.main-search {
  padding: 0px 24px 20px;
  border-bottom: 1px solid #d9d9d9;
  .ant-form-item {
    display: flex;
    margin-bottom: 10px;
  }
  .ant-form-item-control-wrapper {
    flex: 1;
  }
  .ant-form-item-label {
    width: 100px;
  }
}
.ant-advanced-search-form {
  position: relative;
}
.ant-advanced-search-form .ant-input-number {
  width: 100%;
}
src/components/tabview/index.jsx
@@ -100,7 +100,7 @@
    oInput.select()
    document.execCommand('Copy')
    oInput.className = 'oInput'
    oInput.style.display='none'
    oInput.style.display = 'none'
    message.success(this.state.dict['main.copy.success'])
  }
src/locales/en-US/header.js
@@ -1,6 +1,7 @@
export default {
  'header.confirm': 'Ok',
  'header.cancel': 'Cancel',
  'header.return': 'Back',
  'header.logout': 'Logout',
  'header.logout.hint': 'Are you sure you want to log out?',
  'header.password': 'Change the password',
@@ -13,5 +14,12 @@
  'header.password.minlen': 'The minimum password length is 6 digits!',
  'header.password.maxlen': 'The maximum password length is 12 bits!',
  'header.password.diff': 'Two passwords that you enter is inconsistent!',
  'header.password.resetsuccess': 'Password modified successfully!'
  'header.password.resetsuccess': 'Password modified successfully!',
  'header.menu.close': 'Are you sure to delete the menu <<@M>> ?',
  'header.menu.presave': 'Menu order has been adjusted, Please save!',
  'header.menu.addtitle': 'The new menu',
  'header.menu.edittitle': 'The edit menu',
  'header.menu.menuID': 'Menu ID',
  'header.menu.menuName': 'Menu Name',
  'form.required.input': 'Please enter the '
}
src/locales/en-US/main.js
@@ -14,6 +14,6 @@
  'main.action.primarykey.required': 'Primary key not set!',
  'main.action.primarykey.repetition': 'There are multiple primary keys!',
  'main.action.primarykey.repetitionbid': 'There are multiple BID!',
  'main.form.required.input': 'Please input ',
  'main.form.required.select': 'Please select '
  'form.required.input': 'Please input ',
  'form.required.select': 'Please select '
}
src/locales/zh-CN/header.js
@@ -1,17 +1,26 @@
export default {
  'header.confirm': '确定',
  'header.cancel': '取消',
  'header.return': '返回',
  'header.logout': '退出',
  'header.logout.hint': '您确定要退出吗?',
  'header.password': '修改密码',
  'header.password.origin': '原密码',
  'header.password.origin.required': '请输入原密码!',
  'header.password.origin.required': '请输入原密码!',
  'header.password.new': '新密码',
  'header.password.new.required': '请输入新密码!',
  'header.password.new.required': '请输入新密码!',
  'header.password.confirm': '确认密码',
  'header.password.confirm.required': '请确认密码!',
  'header.password.minlen': '最小密码长度为6位!',
  'header.password.maxlen': '最大密码长度为12位!',
  'header.password.diff': '两次输入密码不一致!',
  'header.password.resetsuccess': '密码修改成功!'
  'header.password.confirm.required': '请确认密码!',
  'header.password.minlen': '最小密码长度为6位!',
  'header.password.maxlen': '最大密码长度为12位!',
  'header.password.diff': '两次输入密码不一致!',
  'header.password.resetsuccess': '密码修改成功!',
  'header.menu.close': '确定删除《@M》菜单吗?',
  'header.menu.presave': '菜单顺序已调整,请保存!',
  'header.menu.addtitle': '新建菜单',
  'header.menu.edittitle': '编辑菜单',
  'header.menu.menuID': '菜单ID',
  'header.menu.menuName': '菜单名称',
  'form.required.input': '请输入'
}
src/locales/zh-CN/main.js
@@ -14,6 +14,6 @@
  'main.action.primarykey.required': '未设置主键!',
  'main.action.primarykey.repetition': '存在多个主键!',
  'main.action.primarykey.repetitionbid': '存在多个BID!',
  'main.form.required.input': '请输入',
  'main.form.required.select': '请选择'
  'form.required.input': '请输入',
  'form.required.select': '请选择'
}
src/store/action-type.js
@@ -17,4 +17,7 @@
export const RESET_DEBUG = 'RESET_DEBUG'
// 刷新tab页面
export const REFRESH_TABVIEW = 'REFRESH_TABVIEW'
export const REFRESH_TABVIEW = 'REFRESH_TABVIEW'
// 重置编辑状态
export const RESET_EDITSTATE = 'RESET_EDITSTATE'
src/store/action.js
@@ -52,4 +52,12 @@
    type: user.REFRESH_TABVIEW,
    refreshTab
  }
}
// 重置编辑状态
export const resetEditState = (editState) => {
  return {
    type: user.RESET_EDITSTATE,
    editState
  }
}
src/store/reducer.js
@@ -5,7 +5,8 @@
  tabviews: [], // 导航栏
  collapse: false, // 是否收起侧边栏导航
  isiframe: false, // 是否为iframe窗口
  debug: false, // 知否可以复制菜单参数
  debug: false, // 知否可以复制菜单参数, 是否可进入编辑模式
  editState: false, // 是否为编辑状态,值为false、level1、level2、level3。。。
  refreshTab: null // 刷新tabview页面信息
}
@@ -52,6 +53,11 @@
        ...state,
        refreshTab: action.refreshTab
      }
    case Type.RESET_EDITSTATE:
      return {
        ...state,
        editState: action.editState
      }
    default:
      return state
  }
src/tabviews/commontable/index.jsx
@@ -3,9 +3,9 @@
import { is, fromJS } from 'immutable'
import { BackTop } from 'antd'
import Api from '@/api'
import MainSearch from '@/components/mainSearch'
import MainAction from '@/components/mainAction'
import MainTable from '@/components/mainTable'
import MainSearch from './modules/mainSearch'
import MainAction from './modules/mainAction'
import MainTable from './modules/mainTable'
import Loading from '@/components/loading'
import zhCN from '@/locales/zh-CN/main.js'
import enUS from '@/locales/en-US/main.js'
src/tabviews/commontable/modules/mainAction/index.jsx
src/tabviews/commontable/modules/mainAction/index.scss
src/tabviews/commontable/modules/mainSearch/index.jsx
src/tabviews/commontable/modules/mainSearch/index.scss
src/tabviews/commontable/modules/mainTable/index.jsx
src/tabviews/commontable/modules/mainTable/index.scss
src/tabviews/datamanage/modules/search/index.jsx
@@ -175,7 +175,7 @@
        valid = false
        notification.warning({
          top: 92,
          message: this.props.dict['main.form.required.input'] + item.label
          message: this.props.dict['form.required.input'] + item.label
        })
      }
    })