refs #13535 Merge branch '13535-tree-component' into 13610-projects-hierarchy
authorDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 12 Jun 2018 19:38:39 +0000 (21:38 +0200)
committerDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 12 Jun 2018 19:38:39 +0000 (21:38 +0200)
# Conflicts:
# package.json
# src/components/tree/tree.tsx
# src/index.tsx
# src/models/project.ts
# src/store/project-action.ts
# src/store/project-reducer.ts
# src/views/workbench/workbench.test.tsx
# src/views/workbench/workbench.tsx
# tslint.json
# yarn.lock

Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos@contractors.roche.com>

1  2 
package.json
src/index.tsx
src/models/project.ts
src/store/project/project-action.ts
src/store/project/project-reducer.ts
src/views/workbench/workbench.test.tsx
src/views/workbench/workbench.tsx
yarn.lock

diff --combined package.json
index ac890d8d89460f5e42f70ab33b4f43c8f67c67da,e4ba28ac3a31c69ae993720f6692a0e506d0779b..399750a3d77c8ca005d95bf8c8e1f02a2fe063d3
@@@ -3,19 -3,18 +3,20 @@@
    "version": "0.1.0",
    "private": true,
    "dependencies": {
 -    "@material-ui/core": "1.0.0",
 +    "@material-ui/core": "1.2.0",
 +    "@material-ui/icons": "^1.1.0",
+     "lodash": "4.17.10",
 -    "react": "16.3.2",
 -    "react-dom": "16.3.2",
 +    "axios": "0.18.0",
 +    "react": "16.4.0",
 +    "react-dom": "16.4.0",
      "react-redux": "5.0.7",
      "react-router": "4.2.0",
      "react-router-dom": "4.2.2",
      "react-router-redux": "5.0.0-alpha.9",
      "react-scripts-ts": "2.16.0",
      "redux": "4.0.0",
 -    "redux-devtools": "3.4.1",
 -    "typesafe-actions": "2.0.3"
 +    "redux-thunk": "2.3.0",
 +    "unionize": "2.1.2"
    },
    "scripts": {
      "start": "react-scripts-ts start",
      "lint": "tslint src/** -t verbose"
    },
    "devDependencies": {
 -    "@types/jest": "22.2.3",
 -    "@types/lodash": "4.14.109",
 -    "@types/node": "10.1.2",
 -    "@types/react": "16.3.14",
+     "@types/enzyme": "^3.1.10",
+     "@types/enzyme-adapter-react-16": "^1.0.2",
 +    "@types/jest": "23.0.0",
 +    "@types/node": "10.3.0",
 +    "@types/react": "16.3.16",
      "@types/react-dom": "16.0.5",
 -    "@types/react-redux": "6.0.0",
 -    "@types/react-router": "4.0.25",
 -    "@types/react-router-dom": "4.2.6",
 -    "@types/react-router-redux": "5.0.14",
 +    "@types/react-redux": "6.0.1",
 +    "@types/react-router": "4.0.26",
 +    "@types/react-router-dom": "4.2.7",
 +    "@types/react-router-redux": "5.0.15",
      "@types/redux-devtools": "3.0.44",
 -    "typescript": "2.8.3"
+     "enzyme": "^3.3.0",
+     "enzyme-adapter-react-16": "^1.1.1",
 +    "jest-localstorage-mock": "2.2.0",
 +    "redux-devtools": "3.4.1",
 +    "typescript": "2.9.1"
    },
    "moduleNameMapper": {
      "^~/(.*)$": "<rootDir>/src/$1"
diff --combined src/index.tsx
index 0cb67f1d82771a985d0b0637078c7d8dbb62463d,9cc33feb8eba3de42328434b80fea6253dd14814..173296817b317294d0fe75f8907c0468dd388835
@@@ -8,40 -8,65 +8,59 @@@ import { Provider } from "react-redux"
  import Workbench from './views/workbench/workbench';
  import ProjectList from './components/project-list/project-list';
  import './index.css';
 -import { Route, Router } from "react-router";
 +import { Route } from "react-router";
  import createBrowserHistory from "history/createBrowserHistory";
  import configureStore from "./store/store";
  import { ConnectedRouter } from "react-router-redux";
 +import ApiToken from "./components/api-token/api-token";
 +import authActions from "./store/auth/auth-action";
 +import { projectService } from "./services/services";
+ import { TreeItem } from "./components/tree/tree";
+ import { Project } from "./models/project";
  
 -const sampleProjects = [
 -    [
 -        'Project 1', [
 -            ['Project 1.1', [['Project 1.1.1'], ['Project 1.1.2']]],
 -            ['Project 1.2', [['Project 1.2.1'], ['Project 1.2.2'], ['Project 1.2.3']]]
 -        ]
 -    ],
 -    [
 -        'Project 2'
 -    ],
 -    [
 -        'Project 3', [['Project 3.1'], ['Project 3.2']]
 -    ]
 -];
 -
 -
+ function buildProjectTree(tree: any[], level = 0): Array<TreeItem<Project>> {
+     const projects = tree.map((t, idx) => ({
+         id: `l${level}i${idx}${t[0]}`,
+         open: false,
+         active: false,
+         data: {
+             name: t[0],
+             icon: level === 0 ? <i className="fas fa-th"/> : <i className="fas fa-folder"/>,
+             createdAt: '2018-05-05',
+         },
+         items: t.length > 1 ? buildProjectTree(t[1], level + 1) : []
+     }));
+     return projects;
+ }
 -
 -
  const history = createBrowserHistory();
+ const projects = buildProjectTree(sampleProjects);
  const store = configureStore({
 -    projects,
 +    projects: [
 +    ],
      router: {
          location: null
 +    },
 +    auth: {
 +        user: undefined
      }
  }, history);
  
 +store.dispatch(authActions.INIT());
 +store.dispatch<any>(projectService.getProjectList());
 +
++
  const App = () =>
      <Provider store={store}>
          <ConnectedRouter history={history}>
              <div>
 -                <Route path="/" component={Workbench} />
 +                <Route path="/" component={Workbench}/>
 +                <Route path="/token" component={ApiToken}/>
              </div>
          </ConnectedRouter>
      </Provider>;
  
  ReactDOM.render(
 -    <App />,
 +    <App/>,
      document.getElementById('root') as HTMLElement
  );
diff --combined src/models/project.ts
index 83862c94001a575f55136faa8b1d93653a44f415,d730bcdfd8c02ce676f368044dbf876367593a9c..f4faf7d64e14acddce651b3bc64b71a2d47ba78c
@@@ -5,8 -5,5 +5,9 @@@
  export interface Project {
      name: string;
      createdAt: string;
-     href: string
 +    modifiedAt: string;
 +    uuid: string;
 +    ownerUuid: string;
++    href: string;
+     icon?: any;
  }
index c88edb60df8d0c764563ee48c027289859214567,0000000000000000000000000000000000000000..2101619515a0c197855425667b28910581165df7
mode 100644,000000..100644
--- /dev/null
@@@ -1,19 -1,0 +1,20 @@@
-     PROJECTS_SUCCESS: ofType<Project[]>()
 +// Copyright (C) The Arvados Authors. All rights reserved.
 +//
 +// SPDX-License-Identifier: AGPL-3.0
 +
 +import { Project } from "../../models/project";
 +import { default as unionize, ofType, UnionOf } from "unionize";
 +
 +const actions = unionize({
 +    CREATE_PROJECT: ofType<Project>(),
 +    REMOVE_PROJECT: ofType<string>(),
 +    PROJECTS_REQUEST: {},
++    PROJECTS_SUCCESS: ofType<Project[]>(),
++    TOGGLE_PROJECT_TREE_ITEM: ofType<string>()
 +}, {
 +    tag: 'type',
 +    value: 'payload'
 +});
 +
 +export type ProjectAction = UnionOf<typeof actions>;
 +export default actions;
index 477cb1e4688e309e243d78cece928313f6215146,0000000000000000000000000000000000000000..458177c0431c9d240ec0b08664014615ea095b36
mode 100644,000000..100644
--- /dev/null
@@@ -1,22 -1,0 +1,57 @@@
- export type ProjectState = Project[];
 +// Copyright (C) The Arvados Authors. All rights reserved.
 +//
 +// SPDX-License-Identifier: AGPL-3.0
 +
 +import { Project } from "../../models/project";
 +import actions, { ProjectAction } from "./project-action";
++import { TreeItem } from "../../components/tree/tree";
++import * as _ from "lodash";
 +
++export type ProjectState = Array<TreeItem<Project>>;
++
++function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
++    let item;
++    for (const t of tree) {
++        item = t.id === itemId
++            ? t
++            : findTreeItem(t.items ? t.items : [], itemId);
++        if (item) {
++            break;
++        }
++    }
++    return item;
++}
++
++function resetTreeActivity<T>(tree: Array<TreeItem<T>>): boolean | undefined {
++    let item;
++    for (const leaf of tree) {
++        item = leaf.active === true
++            ? leaf.active = false
++            : resetTreeActivity(leaf.items ? leaf.items : []);
++    }
++    return item;
++}
 +
 +const projectsReducer = (state: ProjectState = [], action: ProjectAction) => {
 +    return actions.match(action, {
 +        CREATE_PROJECT: project => [...state, project],
 +        REMOVE_PROJECT: () => state,
 +        PROJECTS_REQUEST: () => state,
 +        PROJECTS_SUCCESS: projects => {
 +            return projects;
 +        },
++        TOGGLE_PROJECT_TREE_ITEM: itemId => {
++            const tree = _.cloneDeep(state);
++            resetTreeActivity(tree);
++            const item = findTreeItem(tree, itemId);
++            if (item) {
++                item.open = !item.open;
++                item.active = true;
++            }
++            return tree;
++        },
 +        default: () => state
 +    });
 +};
 +
 +export default projectsReducer;
index fc89609acc43b45767fcebb0cec2f0518953423f,b1657bc35f6de244ffc71db154bf467a1d9d6d54..7b9b74d095c65a8a1ad760a2c4c87f360cb13836
@@@ -8,10 -8,19 +8,19 @@@ import Workbench from '../../views/work
  import { Provider } from "react-redux";
  import configureStore from "../../store/store";
  import createBrowserHistory from "history/createBrowserHistory";
+ import { ConnectedRouter } from "react-router-redux";
+ const history = createBrowserHistory();
  
  it('renders without crashing', () => {
      const div = document.createElement('div');
 -    const store = configureStore({ projects: [], router: { location: null } }, createBrowserHistory());
 +    const store = configureStore({ projects: [], router: { location: null }, auth: {} }, createBrowserHistory());
-     ReactDOM.render(<Provider store={store}><Workbench/></Provider>, div);
+     ReactDOM.render(
+         <Provider store={store}>
+             <ConnectedRouter history={history}>
+                 <Workbench/>
+             </ConnectedRouter>
+         </Provider>,
+     div);
      ReactDOM.unmountComponentAtNode(div);
  });
index 8c3145b823e1950a58aa2bca49129ab23c0e8023,6f39ac78e05c3752dee124e6447f98490eedc4d5..7cccfe3034698057db006cde792dc0e4d201a915
@@@ -9,22 -9,15 +9,25 @@@ import Drawer from '@material-ui/core/D
  import AppBar from '@material-ui/core/AppBar';
  import Toolbar from '@material-ui/core/Toolbar';
  import Typography from '@material-ui/core/Typography';
 -import { connect } from "react-redux";
 -import { RootState } from "../../store/root-reducer";
 +import { connect, DispatchProp } from "react-redux";
 +import Tree from "../../components/tree/tree";
 +import { Project } from "../../models/project";
  import ProjectList from "../../components/project-list/project-list";
  import { Route, Switch } from "react-router";
  import { Link } from "react-router-dom";
 +import Button from "@material-ui/core/Button/Button";
 +import authActions from "../../store/auth/auth-action";
 +import IconButton from "@material-ui/core/IconButton/IconButton";
 +import Menu from "@material-ui/core/Menu/Menu";
 +import MenuItem from "@material-ui/core/MenuItem/MenuItem";
 +import { AccountCircle } from "@material-ui/icons";
 +import { User } from "../../models/user";
 +import Grid from "@material-ui/core/Grid/Grid";
 +import { RootState } from "../../store/store";
  
+ import { actions as projectActions } from "../../store/project-action";
+ import ProjectTree, { WorkbenchProps } from '../../components/project-tree/project-tree';
  const drawerWidth = 240;
  
  type CssRules = 'root' | 'appBar' | 'drawerPaper' | 'content' | 'toolbar';
@@@ -36,8 -29,8 +39,8 @@@ const styles: StyleRulesCallback<CssRul
          overflow: 'hidden',
          position: 'relative',
          display: 'flex',
 -        width: '100%',
 -        height: '100%'
 +        width: '100vw',
 +        height: '100vh'
      },
      appBar: {
          zIndex: theme.zIndex.drawer + 1,
          flexGrow: 1,
          backgroundColor: theme.palette.background.default,
          padding: theme.spacing.unit * 3,
 +        height: '100%',
          minWidth: 0,
      },
      toolbar: theme.mixins.toolbar
  });
  
 -class Workbench extends React.Component<WorkbenchProps & WithStyles<CssRules>> {
 +interface WorkbenchDataProps {
 +    projects: Project[];
 +    user?: User;
 +}
 +
 +interface WorkbenchActionProps {
 +}
 +
 +type WorkbenchProps = WorkbenchDataProps & WorkbenchActionProps & DispatchProp & WithStyles<CssRules>;
 +
 +interface WorkbenchState {
 +    anchorEl: any;
 +}
 +
 +class Workbench extends React.Component<WorkbenchProps, WorkbenchState> {
 +    constructor(props: WorkbenchProps) {
 +        super(props);
 +        this.state = {
 +            anchorEl: null
 +        }
 +    }
 +
 +    login = () => {
 +        this.props.dispatch(authActions.LOGIN());
 +    };
 +
 +    logout = () => {
 +        this.handleClose();
 +        this.props.dispatch(authActions.LOGOUT());
 +    };
 +
 +    handleOpenMenu = (event: React.MouseEvent<any>) => {
 +        this.setState({
 +            anchorEl: event.currentTarget
 +        });
 +    };
 +
 +    handleClose = () => {
 +        this.setState({
 +            anchorEl: null
 +        });
 +    };
 +
      render() {
 -        const { classes } = this.props;
 +        const {classes, user} = this.props;
          return (
              <div className={classes.root}>
                  <AppBar position="absolute" className={classes.appBar}>
                      <Toolbar>
 -                        <Typography variant="title" color="inherit" noWrap>
 -                            Arvados<br />Workbench 2
 +                        <Typography variant="title" color="inherit" noWrap style={{flexGrow: 1}}>
 +                            <span>Arvados</span><br/><span style={{fontSize: 12}}>Workbench 2</span>
                          </Typography>
 +                        {user ?
 +                            <Grid container style={{width: 'auto'}}>
 +                                <Grid container style={{width: 'auto'}} alignItems='center'>
 +                                    <Typography variant="title" color="inherit" noWrap>
 +                                        {user.firstName} {user.lastName}
 +                                    </Typography>
 +                                </Grid>
 +                                <Grid item>
 +                                    <IconButton
 +                                          aria-owns={this.state.anchorEl ? 'menu-appbar' : undefined}
 +                                          aria-haspopup="true"
 +                                          onClick={this.handleOpenMenu}
 +                                          color="inherit">
 +                                      <AccountCircle/>
 +                                    </IconButton>
 +                                </Grid>
 +                                <Menu
 +                                  id="menu-appbar"
 +                                  anchorEl={this.state.anchorEl}
 +                                  anchorOrigin={{
 +                                    vertical: 'top',
 +                                    horizontal: 'right',
 +                                  }}
 +                                  transformOrigin={{
 +                                    vertical: 'top',
 +                                    horizontal: 'right',
 +                                  }}
 +                                  open={!!this.state.anchorEl}
 +                                  onClose={this.handleClose}>
 +                                  <MenuItem onClick={this.logout}>Logout</MenuItem>
 +                                  <MenuItem onClick={this.handleClose}>My account</MenuItem>
 +                                </Menu>
 +                            </Grid>
 +                            :
 +                            <Button color="inherit" onClick={this.login}>Login</Button>
 +                        }
                      </Toolbar>
                  </AppBar>
 +                {user &&
                  <Drawer
                      variant="permanent"
                      classes={{
                          paper: classes.drawerPaper,
                      }}>
 -                    <div className={classes.toolbar} />
 -                    <ProjectTree
 +                    <div className={classes.toolbar}/>
-                     <Tree items={this.props.projects} render={(p: Project) =>
-                         <Link to={`/project/${p.name}`}>{p.name}</Link>
-                     }/>
++                          <ProjectTree
+                         projects={this.props.projects}
 -                        toggleProjectTreeItem={this.props.toggleProjectTreeItem} />
 -                </Drawer>
++                        toggleProjectTreeItem={this.props.toggleProjectTreeItem}/>
 +                </Drawer>}
                  <main className={classes.content}>
 -                    <div className={classes.toolbar} />
 +                    <div className={classes.toolbar}/>
                      <Switch>
 -                        <Route exact path="/">
 -                            <Typography noWrap>Hello new workbench!</Typography>
 -                        </Route>
 -                        <Route path="/project/:name" component={ProjectList} />
 +                        <Route path="/project/:name" component={ProjectList}/>
                      </Switch>
                  </main>
              </div>
      }
  }
  
 -export default connect(
 +export default connect<WorkbenchDataProps>(
      (state: RootState) => ({
 -        projects: state.projects
 -    }), {
 +        projects: state.projects,
 +        user: state.auth.user
-     })
++    }){
+         toggleProjectTreeItem: (id: string) => projectActions.toggleProjectTreeItem(id)
+     }
  )(
      withStyles(styles)(Workbench)
  );
diff --combined yarn.lock
index 7b9820bb5807c253e3aa0f5c2c5539f9d0053d6d,eadc3467022385e2b4cc66f4fab138d1f56c8d40..f3950fae03611dd1acd889ff4423ffb71c7c9dd0
+++ b/yarn.lock
@@@ -3,37 -3,35 +3,37 @@@
  
  
  "@babel/code-frame@^7.0.0-beta.35":
 -  version "7.0.0-beta.47"
 -  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27"
 +  version "7.0.0-beta.49"
 +  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz#becd805482734440c9d137e46d77340e64d7f51b"
    dependencies:
 -    "@babel/highlight" "7.0.0-beta.47"
 +    "@babel/highlight" "7.0.0-beta.49"
  
 -"@babel/highlight@7.0.0-beta.47":
 -  version "7.0.0-beta.47"
 -  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494"
 +"@babel/highlight@7.0.0-beta.49":
 +  version "7.0.0-beta.49"
 +  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.49.tgz#96bdc6b43e13482012ba6691b1018492d39622cc"
    dependencies:
      chalk "^2.0.0"
      esutils "^2.0.2"
      js-tokens "^3.0.0"
  
  "@babel/runtime@^7.0.0-beta.42":
 -  version "7.0.0-beta.47"
 -  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.47.tgz#273f5e71629e80f6cbcd7507503848615e59f7e0"
 +  version "7.0.0-beta.49"
 +  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.49.tgz#03b3bf07eb982072c8e851dd2ddd5110282e61bf"
    dependencies:
 -    core-js "^2.5.3"
 +    core-js "^2.5.6"
      regenerator-runtime "^0.11.1"
  
 -"@material-ui/core@1.0.0":
 -  version "1.0.0"
 -  resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.0.0.tgz#857b871038bb300f2d25594ce0cd250be944e71b"
 +"@material-ui/core@1.2.0":
 +  version "1.2.0"
 +  resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-1.2.0.tgz#ec372fd44f949faa604c4ccd4b7ee0bc5e08ac8c"
    dependencies:
      "@babel/runtime" "^7.0.0-beta.42"
      "@types/jss" "^9.5.3"
      "@types/react-transition-group" "^2.0.8"
      brcast "^3.0.1"
      classnames "^2.2.5"
 +    csstype "^2.5.2"
 +    debounce "^1.1.0"
      deepmerge "^2.0.1"
      dom-helpers "^3.2.1"
      hoist-non-react-statics "^2.5.0"
      jss-props-sort "^6.0.0"
      jss-vendor-prefixer "^7.0.0"
      keycode "^2.1.9"
 -    lodash "^4.2.0"
      normalize-scroll-left "^0.1.2"
      prop-types "^15.6.0"
 -    react-event-listener "^0.5.1"
 +    react-event-listener "^0.6.0"
      react-jss "^8.1.0"
      react-popper "^0.10.0"
 -    react-scrollbar-size "^2.0.2"
      react-transition-group "^2.2.1"
      recompose "^0.26.0 || ^0.27.0"
      scroll "^2.0.3"
 -    warning "^3.0.0"
 +    warning "^4.0.1"
 +
 +"@material-ui/icons@^1.1.0":
 +  version "1.1.0"
 +  resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-1.1.0.tgz#4d025df7b0ba6ace8d6710079ed76013a4d26595"
 +  dependencies:
 +    recompose "^0.26.0 || ^0.27.0"
  
+ "@types/cheerio@*":
+   version "0.22.7"
+   resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.7.tgz#4a92eafedfb2b9f4437d3a4410006d81114c66ce"
+ "@types/enzyme-adapter-react-16@^1.0.2":
+   version "1.0.2"
+   resolved "https://registry.yarnpkg.com/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz#15ae37c64d6221a6f4b3a4aacc357cf773859de4"
+   dependencies:
+     "@types/enzyme" "*"
+ "@types/enzyme@*", "@types/enzyme@^3.1.10":
+   version "3.1.10"
+   resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.10.tgz#28108a9864e65699751469551a803a35d2e26160"
+   dependencies:
+     "@types/cheerio" "*"
+     "@types/react" "*"
  "@types/history@*":
    version "4.6.2"
    resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0"
  
 -"@types/jest@22.2.3":
 -  version "22.2.3"
 -  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.2.3.tgz#0157c0316dc3722c43a7b71de3fdf3acbccef10d"
 +"@types/jest@23.0.0":
 +  version "23.0.0"
 +  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.0.0.tgz#760cac74f00bb9c3075587716d2b3b4435663bc0"
  
  "@types/jss@^9.5.3":
    version "9.5.3"
      csstype "^2.0.0"
      indefinite-observable "^1.0.1"
  
 -"@types/node@*", "@types/node@10.1.2":
 -  version "10.1.2"
 -  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
+ "@types/lodash@4.14.109":
+   version "4.14.109"
+   resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.109.tgz#b1c4442239730bf35cabaf493c772b18c045886d"
 +"@types/node@*", "@types/node@10.3.0":
 +  version "10.3.0"
 +  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.0.tgz#078516315a84d56216b5d4fed8f75d59d3b16cac"
  
  "@types/react-dom@16.0.5":
    version "16.0.5"
      "@types/node" "*"
      "@types/react" "*"
  
 -"@types/react-redux@6.0.0":
 -  version "6.0.0"
 -  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.0.tgz#31711592b13ed6d6d2fd4506e5447b00e1f0b484"
 +"@types/react-redux@6.0.1":
 +  version "6.0.1"
 +  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-6.0.1.tgz#bb8f6cc19d00a999f9d932ab796212ad3921994b"
    dependencies:
      "@types/react" "*"
      redux "^4.0.0"
  
 -"@types/react-router-dom@4.2.6":
 -  version "4.2.6"
 -  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.6.tgz#9f7eb3c0e6661a9607d878ff8675cc4ea95cd276"
 +"@types/react-router-dom@4.2.7":
 +  version "4.2.7"
 +  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.7.tgz#9d36bfe175f916dd8d7b6b0237feed6cce376b4c"
    dependencies:
      "@types/history" "*"
      "@types/react" "*"
      "@types/react-router" "*"
  
 -"@types/react-router-redux@5.0.14":
 -  version "5.0.14"
 -  resolved "https://registry.yarnpkg.com/@types/react-router-redux/-/react-router-redux-5.0.14.tgz#4f140248f65c74217e296854b1abe8c55e99764c"
 +"@types/react-router-redux@5.0.15":
 +  version "5.0.15"
 +  resolved "https://registry.yarnpkg.com/@types/react-router-redux/-/react-router-redux-5.0.15.tgz#aebc593bd3426adb6ae2eba6ac8c919ee232ce7b"
    dependencies:
      "@types/history" "*"
      "@types/react" "*"
      "@types/react-router" "*"
 -    redux "^3.7.2"
 +    redux ">= 3.7.2"
  
 -"@types/react-router@*", "@types/react-router@4.0.25":
 -  version "4.0.25"
 -  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.25.tgz#1e25490780b80e0d8f96bf649379cca8638c1e5a"
 +"@types/react-router@*", "@types/react-router@4.0.26":
 +  version "4.0.26"
 +  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.26.tgz#4489c873642baa633014294a6d0a290001ba9860"
    dependencies:
      "@types/history" "*"
      "@types/react" "*"
  
  "@types/react-transition-group@^2.0.8":
 -  version "2.0.9"
 -  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.0.9.tgz#ed6a71fb711e524345844defec2a861c1a222a03"
 +  version "2.0.11"
 +  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.0.11.tgz#feb274676a39383fffaa0dff710958d2251abefb"
    dependencies:
      "@types/react" "*"
  
 -"@types/react@*", "@types/react@16.3.14":
 -  version "16.3.14"
 -  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.14.tgz#f90ac6834de172e13ecca430dcb6814744225d36"
 +"@types/react@*", "@types/react@16.3.16":
 +  version "16.3.16"
 +  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.16.tgz#78fc44a90b45701f50c8a7008f733680ba51fc86"
    dependencies:
      csstype "^2.2.0"
  
@@@ -169,8 -184,8 +190,8 @@@ acorn@^4.0.3
    resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
  
  acorn@^5.0.0, acorn@^5.3.0:
 -  version "5.5.3"
 -  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
 +  version "5.6.1"
 +  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.6.1.tgz#c9e50c3e3717cf897f1b071ceadbb543bbc0a8d4"
  
  address@1.0.3, address@^1.0.1:
    version "1.0.3"
@@@ -275,8 -290,8 +296,8 @@@ aproba@^1.0.3, aproba@^1.1.1
    resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
  
  are-we-there-yet@~1.1.2:
 -  version "1.1.4"
 -  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
 +  version "1.1.5"
 +  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
    dependencies:
      delegates "^1.0.0"
      readable-stream "^2.0.6"
@@@ -452,13 -467,6 +473,13 @@@ aws4@^1.6.0
    version "1.7.0"
    resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
  
 +axios@0.18.0:
 +  version "0.18.0"
 +  resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
 +  dependencies:
 +    follow-redirects "^1.3.0"
 +    is-buffer "^1.1.5"
 +
  babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
    version "6.26.0"
    resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@@ -1299,8 -1307,8 +1320,8 @@@ bser@^2.0.0
      node-int64 "^0.4.0"
  
  buffer-from@^1.0.0:
 -  version "1.0.0"
 -  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
 +  version "1.1.0"
 +  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
  
  buffer-indexof@^1.0.0:
    version "1.1.1"
@@@ -1406,12 -1414,12 +1427,12 @@@ caniuse-api@^1.5.2
      lodash.uniq "^4.5.0"
  
  caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
 -  version "1.0.30000844"
 -  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000844.tgz#bca5798cda2b6931d68100c2d69e55fb338cbb41"
 +  version "1.0.30000848"
 +  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000848.tgz#e149c981c72aa20439e3bc12c7cf8b3f7e1237c6"
  
  caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000792:
 -  version "1.0.30000844"
 -  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000844.tgz#de7c84cde0582143cf4f5abdf1b98e5a0539ad4a"
 +  version "1.0.30000848"
 +  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000848.tgz#ec9c0a72ec8f9ef812e4f4b8628625af9c85ade0"
  
  capture-exit@^1.2.0:
    version "1.2.0"
@@@ -1464,6 -1472,17 +1485,17 @@@ chardet@^0.4.0
    version "0.4.2"
    resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
  
+ cheerio@^1.0.0-rc.2:
+   version "1.0.0-rc.2"
+   resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
+   dependencies:
+     css-select "~1.2.0"
+     dom-serializer "~0.1.0"
+     entities "~1.1.1"
+     htmlparser2 "^3.9.1"
+     lodash "^4.15.0"
+     parse5 "^3.0.1"
  chokidar@^1.6.0, chokidar@^1.7.0:
    version "1.7.0"
    resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
@@@ -1632,6 -1651,10 +1664,10 @@@ colormin@^1.0.5
      css-color-names "0.0.4"
      has "^1.0.1"
  
+ colors@0.5.x:
+   version "0.5.1"
+   resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774"
  colors@~1.1.2:
    version "1.1.2"
    resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
@@@ -1761,9 -1784,9 +1797,9 @@@ core-js@^1.0.0
    version "1.2.7"
    resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
  
 -core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.3:
 -  version "2.5.6"
 -  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d"
 +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.6:
 +  version "2.5.7"
 +  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
  
  core-util-is@1.0.2, core-util-is@~1.0.0:
    version "1.0.2"
@@@ -1882,7 -1905,7 +1918,7 @@@ css-loader@0.28.7
      postcss-value-parser "^3.3.0"
      source-list-map "^2.0.0"
  
- css-select@^1.1.0:
+ css-select@^1.1.0, css-select@~1.2.0:
    version "1.2.0"
    resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
    dependencies:
@@@ -1961,15 -1984,15 +1997,15 @@@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0"
    version "0.3.2"
    resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
  
 -"cssstyle@>= 0.2.37 < 0.3.0":
 -  version "0.2.37"
 -  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
 +"cssstyle@>= 0.3.1 < 0.4.0":
 +  version "0.3.1"
 +  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf"
    dependencies:
      cssom "0.3.x"
  
 -csstype@^2.0.0, csstype@^2.2.0:
 -  version "2.5.2"
 -  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.2.tgz#4534308476ceede8fbe148b9b99f9baf1c80fa06"
 +csstype@^2.0.0, csstype@^2.2.0, csstype@^2.5.2:
 +  version "2.5.3"
 +  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.3.tgz#2504152e6e1cc59b32098b7f5d6a63f16294c1f7"
  
  currently-unhandled@^0.4.1:
    version "0.4.1"
@@@ -2005,10 -2028,6 +2041,10 @@@ date-now@^0.1.4
    version "0.1.4"
    resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
  
 +debounce@^1.1.0:
 +  version "1.1.0"
 +  resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408"
 +
  debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9:
    version "2.6.9"
    resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@@ -2033,17 -2052,17 +2069,17 @@@ deep-equal@^1.0.1
    version "1.0.1"
    resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
  
 -deep-extend@^0.5.1:
 -  version "0.5.1"
 -  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
 +deep-extend@^0.6.0:
 +  version "0.6.0"
 +  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
  
  deep-is@~0.1.3:
    version "0.1.3"
    resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
  
  deepmerge@^2.0.1:
 -  version "2.1.0"
 -  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.0.tgz#511a54fff405fc346f0240bb270a3e9533a31102"
 +  version "2.1.1"
 +  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
  
  default-require-extensions@^1.0.0:
    version "1.0.0"
@@@ -2168,6 -2187,10 +2204,10 @@@ diffie-hellman@^5.0.0
      miller-rabin "^4.0.0"
      randombytes "^2.0.0"
  
+ discontinuous-range@1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
  dns-equal@^1.0.0:
    version "1.0.0"
    resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@@@ -2195,7 -2218,7 +2235,7 @@@ dom-helpers@^3.2.1, dom-helpers@^3.3.1
    version "3.3.1"
    resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
  
- dom-serializer@0:
+ dom-serializer@0, dom-serializer@~0.1.0:
    version "0.1.0"
    resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
    dependencies:
@@@ -2216,7 -2239,7 +2256,7 @@@ domain-browser@^1.1.1
    version "1.2.0"
    resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
  
- domelementtype@1:
+ domelementtype@1, domelementtype@^1.3.0:
    version "1.3.0"
    resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
  
@@@ -2236,6 -2259,12 +2276,12 @@@ domhandler@2.1
    dependencies:
      domelementtype "1"
  
+ domhandler@^2.3.0:
+   version "2.4.2"
+   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+   dependencies:
+     domelementtype "1"
  domutils@1.1:
    version "1.1.6"
    resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
@@@ -2249,6 -2278,13 +2295,13 @@@ domutils@1.5.1
      dom-serializer "0"
      domelementtype "1"
  
+ domutils@^1.5.1:
+   version "1.7.0"
+   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+   dependencies:
+     dom-serializer "0"
+     domelementtype "1"
  dot-prop@^4.1.0:
    version "4.2.0"
    resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
@@@ -2291,8 -2327,8 +2344,8 @@@ ee-first@1.1.1
    resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
  
  electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
 -  version "1.3.47"
 -  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz#764e887ca9104d01a0ac8eabee7dfc0e2ce14104"
 +  version "1.3.48"
 +  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz#d3b0d8593814044e092ece2108fc3ac9aea4b900"
  
  elliptic@^6.0.0:
    version "6.4.0"
@@@ -2335,10 -2371,51 +2388,51 @@@ enhanced-resolve@^3.0.0, enhanced-resol
      object-assign "^4.0.1"
      tapable "^0.2.7"
  
- entities@~1.1.1:
+ entities@^1.1.1, entities@~1.1.1:
    version "1.1.1"
    resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
  
+ enzyme-adapter-react-16@^1.1.1:
+   version "1.1.1"
+   resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.1.1.tgz#a8f4278b47e082fbca14f5bfb1ee50ee650717b4"
+   dependencies:
+     enzyme-adapter-utils "^1.3.0"
+     lodash "^4.17.4"
+     object.assign "^4.0.4"
+     object.values "^1.0.4"
+     prop-types "^15.6.0"
+     react-reconciler "^0.7.0"
+     react-test-renderer "^16.0.0-0"
+ enzyme-adapter-utils@^1.3.0:
+   version "1.3.0"
+   resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.3.0.tgz#d6c85756826c257a8544d362cc7a67e97ea698c7"
+   dependencies:
+     lodash "^4.17.4"
+     object.assign "^4.0.4"
+     prop-types "^15.6.0"
+ enzyme@^3.3.0:
+   version "3.3.0"
+   resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.3.0.tgz#0971abd167f2d4bf3f5bd508229e1c4b6dc50479"
+   dependencies:
+     cheerio "^1.0.0-rc.2"
+     function.prototype.name "^1.0.3"
+     has "^1.0.1"
+     is-boolean-object "^1.0.0"
+     is-callable "^1.1.3"
+     is-number-object "^1.0.3"
+     is-string "^1.0.4"
+     is-subset "^0.1.1"
+     lodash "^4.17.4"
+     object-inspect "^1.5.0"
+     object-is "^1.0.1"
+     object.assign "^4.1.0"
+     object.entries "^1.0.4"
+     object.values "^1.0.4"
+     raf "^3.4.0"
+     rst-selector-parser "^2.2.3"
  errno@^0.1.3, errno@~0.1.7:
    version "0.1.7"
    resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@@@ -2352,6 -2429,16 +2446,6 @@@ error-ex@^1.2.0
      is-arrayish "^0.2.1"
  
  es-abstract@^1.5.1, es-abstract@^1.7.0:
 -  version "1.11.0"
 -  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681"
 -  dependencies:
 -    es-to-primitive "^1.1.1"
 -    function-bind "^1.1.1"
 -    has "^1.0.1"
 -    is-callable "^1.1.3"
 -    is-regex "^1.0.4"
 -
 -es-abstract@^1.6.1:
    version "1.12.0"
    resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
    dependencies:
@@@ -2370,8 -2457,8 +2464,8 @@@ es-to-primitive@^1.1.1
      is-symbol "^1.0.1"
  
  es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
 -  version "0.10.42"
 -  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.42.tgz#8c07dd33af04d5dcd1310b5cef13bea63a89ba8d"
 +  version "0.10.45"
 +  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
    dependencies:
      es6-iterator "~2.0.3"
      es6-symbol "~3.1.1"
@@@ -2815,7 -2902,7 +2909,7 @@@ flush-write-stream@^1.0.0
      inherits "^2.0.1"
      readable-stream "^2.0.4"
  
 -follow-redirects@^1.0.0:
 +follow-redirects@^1.0.0, follow-redirects@^1.3.0:
    version "1.5.0"
    resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.0.tgz#234f49cf770b7f35b40e790f636ceba0c3a0ab77"
    dependencies:
@@@ -2933,10 -3020,18 +3027,18 @@@ fsevents@^1.0.0, fsevents@^1.1.2, fseve
      nan "^2.9.2"
      node-pre-gyp "^0.10.0"
  
 -function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1:
 +function-bind@^1.1.1:
    version "1.1.1"
    resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
  
+ function.prototype.name@^1.0.3:
+   version "1.1.0"
+   resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.0.tgz#8bd763cc0af860a859cc5d49384d74b932cd2327"
+   dependencies:
+     define-properties "^1.1.2"
+     function-bind "^1.1.1"
+     is-callable "^1.1.3"
  gauge@~2.7.3:
    version "2.7.4"
    resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@@ -3138,6 -3233,10 +3240,10 @@@ has-flag@^3.0.0
    version "3.0.0"
    resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
  
+ has-symbols@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
  has-unicode@^2.0.0:
    version "2.0.1"
    resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@@@ -3170,10 -3269,10 +3276,10 @@@ has-values@^1.0.0
      kind-of "^4.0.0"
  
  has@^1.0.1:
 -  version "1.0.1"
 -  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
 +  version "1.0.3"
 +  resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
    dependencies:
 -    function-bind "^1.0.2"
 +    function-bind "^1.1.1"
  
  hash-base@^3.0.0:
    version "3.0.4"
@@@ -3278,6 -3377,17 +3384,17 @@@ html-webpack-plugin@2.29.0
      pretty-error "^2.0.2"
      toposort "^1.0.0"
  
+ htmlparser2@^3.9.1:
+   version "3.9.2"
+   resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+   dependencies:
+     domelementtype "^1.3.0"
+     domhandler "^2.3.0"
+     domutils "^1.5.1"
+     entities "^1.1.1"
+     inherits "^2.0.1"
+     readable-stream "^2.0.2"
  htmlparser2@~3.3.0:
    version "3.3.0"
    resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
@@@ -3310,8 -3420,8 +3427,8 @@@ http-errors@~1.6.2
      statuses ">= 1.4.0 < 2"
  
  http-parser-js@>=0.4.0:
 -  version "0.4.12"
 -  resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.12.tgz#b9cfbf4a2cf26f0fc34b10ca1489a27771e3474f"
 +  version "0.4.13"
 +  resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"
  
  http-proxy-middleware@~0.17.4:
    version "0.17.4"
@@@ -3514,6 -3624,10 +3631,10 @@@ is-binary-path@^1.0.0
    dependencies:
      binary-extensions "^1.0.0"
  
+ is-boolean-object@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93"
  is-buffer@^1.1.5:
    version "1.1.6"
    resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@@ -3655,6 -3769,10 +3776,10 @@@ is-npm@^1.0.0
    version "1.0.0"
    resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
  
+ is-number-object@^1.0.3:
+   version "1.0.3"
+   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.3.tgz#f265ab89a9f445034ef6aff15a8f00b00f551799"
  is-number@^2.1.0:
    version "2.1.0"
    resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@@ -3741,6 -3859,14 +3866,14 @@@ is-stream@^1.0.0, is-stream@^1.0.1, is-
    version "1.1.0"
    resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
  
+ is-string@^1.0.4:
+   version "1.0.4"
+   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64"
+ is-subset@^0.1.1:
+   version "0.1.1"
+   resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
  is-svg@^2.0.0:
    version "2.1.0"
    resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
@@@ -3859,8 -3985,8 +3992,8 @@@ istanbul-lib-source-maps@^1.2.1
      source-map "^0.5.3"
  
  istanbul-lib-source-maps@^1.2.4:
 -  version "1.2.4"
 -  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7"
 +  version "1.2.5"
 +  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1"
    dependencies:
      debug "^3.1.0"
      istanbul-lib-coverage "^1.2.0"
@@@ -4003,10 -4129,6 +4136,10 @@@ jest-leak-detector@^22.4.0
    dependencies:
      pretty-format "^22.4.3"
  
 +jest-localstorage-mock@2.2.0:
 +  version "2.2.0"
 +  resolved "https://registry.yarnpkg.com/jest-localstorage-mock/-/jest-localstorage-mock-2.2.0.tgz#ce9a9de01dfdde2ad8aa08adf73acc7e5cc394cf"
 +
  jest-matcher-utils@^22.4.0, jest-matcher-utils@^22.4.3:
    version "22.4.3"
    resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz#4632fe428ebc73ebc194d3c7b65d37b161f710ff"
@@@ -4146,8 -4268,8 +4279,8 @@@ js-tokens@^3.0.0, js-tokens@^3.0.2
    resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
  
  js-yaml@^3.4.3, js-yaml@^3.7.0:
 -  version "3.11.0"
 -  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
 +  version "3.12.0"
 +  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
    dependencies:
      argparse "^1.0.7"
      esprima "^4.0.0"
@@@ -4164,21 -4286,21 +4297,21 @@@ jsbn@~0.1.0
    resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
  
  jsdom@^11.5.1:
 -  version "11.10.0"
 -  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.10.0.tgz#a42cd54e88895dc765f03f15b807a474962ac3b5"
 +  version "11.11.0"
 +  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e"
    dependencies:
      abab "^1.0.4"
      acorn "^5.3.0"
      acorn-globals "^4.1.0"
      array-equal "^1.0.0"
      cssom ">= 0.3.2 < 0.4.0"
 -    cssstyle ">= 0.2.37 < 0.3.0"
 +    cssstyle ">= 0.3.1 < 0.4.0"
      data-urls "^1.0.0"
      domexception "^1.0.0"
      escodegen "^1.9.0"
      html-encoding-sniffer "^1.0.2"
      left-pad "^1.2.0"
 -    nwmatcher "^1.4.3"
 +    nwsapi "^2.0.0"
      parse5 "4.0.0"
      pn "^1.1.0"
      request "^2.83.0"
      webidl-conversions "^4.0.2"
      whatwg-encoding "^1.0.3"
      whatwg-mimetype "^2.1.0"
 -    whatwg-url "^6.4.0"
 +    whatwg-url "^6.4.1"
      ws "^4.0.0"
      xml-name-validator "^3.0.0"
  
@@@ -4331,8 -4453,8 +4464,8 @@@ jss-vendor-prefixer@^7.0.0
      css-vendor "^0.3.8"
  
  jss@^9.3.3, jss@^9.7.0:
 -  version "9.8.1"
 -  resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.1.tgz#e2ff250777ad657430e6edc47a63516541b888fa"
 +  version "9.8.2"
 +  resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.2.tgz#09cabdfba831545bf094e399cfa45a1743daf4a6"
    dependencies:
      is-in-browser "^1.1.3"
      symbol-observable "^1.1.0"
@@@ -4470,6 -4592,10 +4603,10 @@@ lodash.endswith@^4.2.1
    version "4.2.1"
    resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09"
  
+ lodash.flattendeep@^4.4.0:
+   version "4.4.0"
+   resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
  lodash.isfunction@^3.0.8:
    version "3.0.9"
    resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051"
@@@ -4507,7 -4633,7 +4644,7 @@@ lodash.uniq@^4.5.0
    version "4.5.0"
    resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
  
"lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
lodash@4.17.10, "lodash@>=3.5 <5", lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
    version "4.17.10"
    resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
  
@@@ -4547,6 -4673,10 +4684,6 @@@ lru-cache@^4.0.1, lru-cache@^4.1.1
      pseudomap "^1.0.2"
      yallist "^2.1.2"
  
 -macaddress@^0.2.8:
 -  version "0.2.8"
 -  resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
 -
  make-dir@^1.0.0:
    version "1.3.0"
    resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@@ -4681,11 -4811,7 +4818,11 @@@ miller-rabin@^4.0.0
      bn.js "^4.0.0"
      brorand "^1.0.1"
  
 -"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0:
 +"mime-db@>= 1.33.0 < 2":
 +  version "1.34.0"
 +  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.34.0.tgz#452d0ecff5c30346a6dc1e64b1eaee0d3719ff9a"
 +
 +mime-db@~1.33.0:
    version "1.33.0"
    resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
  
@@@ -4745,11 -4871,11 +4882,11 @@@ minimist@~0.0.1
    version "0.0.10"
    resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
  
 -minipass@^2.2.1, minipass@^2.2.4:
 -  version "2.3.1"
 -  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.1.tgz#4e872b959131a672837ab3cb554962bc84b1537d"
 +minipass@^2.2.1, minipass@^2.3.3:
 +  version "2.3.3"
 +  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
    dependencies:
 -    safe-buffer "^5.1.1"
 +    safe-buffer "^5.1.2"
      yallist "^3.0.0"
  
  minizlib@^1.1.0:
@@@ -4841,6 -4967,15 +4978,15 @@@ natural-compare@^1.4.0
    version "1.4.0"
    resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
  
+ nearley@^2.7.10:
+   version "2.13.0"
+   resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.13.0.tgz#6e7b0f4e68bfc3e74c99eaef2eda39e513143439"
+   dependencies:
+     nomnom "~1.6.2"
+     railroad-diagrams "^1.0.0"
+     randexp "0.4.6"
+     semver "^5.4.1"
  needle@^2.2.0:
    version "2.2.1"
    resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
@@@ -4934,6 -5069,13 +5080,13 @@@ node-pre-gyp@^0.10.0
      semver "^5.3.0"
      tar "^4"
  
+ nomnom@~1.6.2:
+   version "1.6.2"
+   resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.6.2.tgz#84a66a260174408fc5b77a18f888eccc44fb6971"
+   dependencies:
+     colors "0.5.x"
+     underscore "~1.4.4"
  nopt@^4.0.1:
    version "4.0.1"
    resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
@@@ -5013,9 -5155,9 +5166,9 @@@ number-is-nan@^1.0.0
    version "1.0.1"
    resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
  
 -nwmatcher@^1.4.3:
 -  version "1.4.4"
 -  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
 +nwsapi@^2.0.0:
 +  version "2.0.1"
 +  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.1.tgz#a50d59a2dcb14b6931401171713ced2d0eb3468f"
  
  oauth-sign@~0.8.2:
    version "0.8.2"
@@@ -5033,7 -5175,15 +5186,15 @@@ object-copy@^0.1.0
      define-property "^0.2.5"
      kind-of "^3.0.3"
  
- object-keys@^1.0.8:
+ object-inspect@^1.5.0:
+   version "1.6.0"
+   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b"
+ object-is@^1.0.1:
+   version "1.0.1"
+   resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
+ object-keys@^1.0.11, object-keys@^1.0.8:
    version "1.0.11"
    resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
  
@@@ -5043,6 -5193,24 +5204,24 @@@ object-visit@^1.0.0
    dependencies:
      isobject "^3.0.0"
  
+ object.assign@^4.0.4, object.assign@^4.1.0:
+   version "4.1.0"
+   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+   dependencies:
+     define-properties "^1.1.2"
+     function-bind "^1.1.1"
+     has-symbols "^1.0.0"
+     object-keys "^1.0.11"
+ object.entries@^1.0.4:
+   version "1.0.4"
+   resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
+   dependencies:
+     define-properties "^1.1.2"
+     es-abstract "^1.6.1"
+     function-bind "^1.1.0"
+     has "^1.0.1"
  object.getownpropertydescriptors@^2.0.3:
    version "2.0.3"
    resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
@@@ -5063,6 -5231,15 +5242,15 @@@ object.pick@^1.3.0
    dependencies:
      isobject "^3.0.1"
  
+ object.values@^1.0.4:
+   version "1.0.4"
+   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+   dependencies:
+     define-properties "^1.1.2"
+     es-abstract "^1.6.1"
+     function-bind "^1.1.0"
+     has "^1.0.1"
  obuf@^1.0.0, obuf@^1.1.1:
    version "1.1.2"
    resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
@@@ -5242,6 -5419,12 +5430,12 @@@ parse5@4.0.0
    version "4.0.0"
    resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
  
+ parse5@^3.0.1:
+   version "3.0.3"
+   resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+   dependencies:
+     "@types/node" "*"
  parseurl@~1.3.2:
    version "1.3.2"
    resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
@@@ -5421,10 -5604,11 +5615,10 @@@ postcss-discard-unused@^2.2.1
      uniqs "^2.0.0"
  
  postcss-filter-plugins@^2.0.0:
 -  version "2.0.2"
 -  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
 +  version "2.0.3"
 +  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
    dependencies:
      postcss "^5.0.4"
 -    uniqid "^4.0.0"
  
  postcss-flexbugs-fixes@3.2.0:
    version "3.2.0"
@@@ -5768,8 -5952,8 +5962,8 @@@ punycode@^1.2.4, punycode@^1.4.1
    resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
  
  punycode@^2.1.0:
 -  version "2.1.0"
 -  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
 +  version "2.1.1"
 +  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
  
  q@^1.1.2:
    version "1.5.1"
@@@ -5802,7 -5986,7 +5996,7 @@@ querystringify@^2.0.0
    version "2.0.0"
    resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755"
  
- raf@3.4.0:
+ raf@3.4.0, raf@^3.4.0:
    version "3.4.0"
    resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
    dependencies:
@@@ -5814,6 -5998,17 +6008,17 @@@ rafl@~1.2.1
    dependencies:
      global "~4.3.0"
  
+ railroad-diagrams@^1.0.0:
+   version "1.0.0"
+   resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
+ randexp@0.4.6:
+   version "0.4.6"
+   resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
+   dependencies:
+     discontinuous-range "1.0.0"
+     ret "~0.1.10"
  randomatic@^3.0.0:
    version "3.0.0"
    resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
@@@ -5849,10 -6044,10 +6054,10 @@@ raw-body@2.3.2
      unpipe "1.0.0"
  
  rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
 -  version "1.2.7"
 -  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297"
 +  version "1.2.8"
 +  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
    dependencies:
 -    deep-extend "^0.5.1"
 +    deep-extend "^0.6.0"
      ini "~1.3.0"
      minimist "^1.2.0"
      strip-json-comments "~2.0.1"
@@@ -5880,9 -6075,9 +6085,9 @@@ react-dev-utils@^5.0.1
      strip-ansi "3.0.1"
      text-table "0.2.0"
  
 -react-dom@16.3.2:
 -  version "16.3.2"
 -  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.3.2.tgz#cb90f107e09536d683d84ed5d4888e9640e0e4df"
 +react-dom@16.4.0:
 +  version "16.4.0"
 +  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.0.tgz#099f067dd5827ce36a29eaf9a6cdc7cbf6216b1e"
    dependencies:
      fbjs "^0.8.16"
      loose-envify "^1.1.0"
@@@ -5893,14 -6088,19 +6098,18 @@@ react-error-overlay@^4.0.0
    version "4.0.0"
    resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.0.tgz#d198408a85b4070937a98667f500c832f86bd5d4"
  
 -react-event-listener@^0.5.1:
 -  version "0.5.6"
 -  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.5.6.tgz#f9349fda4b7735fc6886ca403bdcfd6057e89ceb"
 +react-event-listener@^0.6.0:
 +  version "0.6.0"
 +  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.0.tgz#f8cf2821f5ca1844e0df1dac1c7b9a3ecb686fd7"
    dependencies:
      "@babel/runtime" "^7.0.0-beta.42"
 -    fbjs "^0.8.16"
      prop-types "^15.6.0"
      warning "^3.0.0"
  
+ react-is@^16.4.0:
+   version "16.4.0"
+   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.0.tgz#cc9fdc855ac34d2e7d9d2eb7059bbc240d35ffcf"
  react-jss@^8.1.0:
    version "8.4.0"
    resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.4.0.tgz#7cb43d85dea56afafc8f0fd072ae27fcc0518950"
@@@ -5922,6 -6122,15 +6131,15 @@@ react-popper@^0.10.0
      popper.js "^1.14.1"
      prop-types "^15.6.1"
  
+ react-reconciler@^0.7.0:
+   version "0.7.0"
+   resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.7.0.tgz#9614894103e5f138deeeb5eabaf3ee80eb1d026d"
+   dependencies:
+     fbjs "^0.8.16"
+     loose-envify "^1.1.0"
+     object-assign "^4.1.1"
+     prop-types "^15.6.0"
  react-redux@5.0.7:
    version "5.0.7"
    resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8"
@@@ -6008,6 -6217,24 +6226,24 @@@ react-scripts-ts@2.16.0
    optionalDependencies:
      fsevents "^1.1.3"
  
+ react-scrollbar-size@^2.0.2:
+   version "2.1.0"
+   resolved "https://registry.yarnpkg.com/react-scrollbar-size/-/react-scrollbar-size-2.1.0.tgz#105e797135cab92b1f9e16f00071db7f29f80754"
+   dependencies:
+     babel-runtime "^6.26.0"
+     prop-types "^15.6.0"
+     react-event-listener "^0.5.1"
+     stifle "^1.0.2"
+ react-test-renderer@^16.0.0-0:
+   version "16.4.0"
+   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.0.tgz#0dbe0e24263e94e1830c7afb1f403707fad313a3"
+   dependencies:
+     fbjs "^0.8.16"
+     object-assign "^4.1.1"
+     prop-types "^15.6.0"
+     react-is "^16.4.0"
  react-transition-group@^2.2.1:
    version "2.3.1"
    resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.3.1.tgz#31d611b33e143a5e0f2d94c348e026a0f3b474b6"
      loose-envify "^1.3.1"
      prop-types "^15.6.1"
  
 -react@16.3.2:
 -  version "16.3.2"
 -  resolved "https://registry.yarnpkg.com/react/-/react-16.3.2.tgz#fdc8420398533a1e58872f59091b272ce2f91ea9"
 +react@16.4.0:
 +  version "16.4.0"
 +  resolved "https://registry.yarnpkg.com/react/-/react-16.4.0.tgz#402c2db83335336fba1962c08b98c6272617d585"
    dependencies:
      fbjs "^0.8.16"
      loose-envify "^1.1.0"
@@@ -6144,18 -6371,14 +6380,18 @@@ redux-devtools@3.4.1
      prop-types "^15.5.7"
      redux-devtools-instrument "^1.0.1"
  
 -redux@4.0.0, redux@^4.0.0:
 +redux-thunk@2.3.0:
 +  version "2.3.0"
 +  resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
 +
 +redux@4.0.0, "redux@>= 3.7.2", redux@^4.0.0:
    version "4.0.0"
    resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03"
    dependencies:
      loose-envify "^1.1.0"
      symbol-observable "^1.2.0"
  
 -redux@^3.6.0, redux@^3.7.2:
 +redux@^3.6.0:
    version "3.7.2"
    resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
    dependencies:
@@@ -6390,6 -6613,13 +6626,13 @@@ ripemd160@^2.0.0, ripemd160@^2.0.1
      hash-base "^3.0.0"
      inherits "^2.0.1"
  
+ rst-selector-parser@^2.2.3:
+   version "2.2.3"
+   resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
+   dependencies:
+     lodash.flattendeep "^4.4.0"
+     nearley "^2.7.10"
  rsvp@^3.3.3:
    version "3.6.2"
    resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
@@@ -6817,6 -7047,10 +7060,6 @@@ stealthy-require@^1.1.0
    version "1.1.1"
    resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
  
 -stifle@^1.0.2:
 -  version "1.0.4"
 -  resolved "https://registry.yarnpkg.com/stifle/-/stifle-1.0.4.tgz#8b3bcdf52419b0a9c79e35adadce50123c1d8e99"
 -
  stream-browserify@^2.0.1:
    version "2.0.1"
    resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
@@@ -6832,8 -7066,8 +7075,8 @@@ stream-each@^1.1.0
      stream-shift "^1.0.0"
  
  stream-http@^2.7.2:
 -  version "2.8.2"
 -  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.2.tgz#4126e8c6b107004465918aa2fc35549e77402c87"
 +  version "2.8.3"
 +  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
    dependencies:
      builtin-status-codes "^3.0.0"
      inherits "^2.0.1"
@@@ -6864,7 -7098,7 +7107,7 @@@ string-width@^1.0.1, string-width@^1.0.
      is-fullwidth-code-point "^1.0.0"
      strip-ansi "^3.0.0"
  
 -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
 +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
    version "2.1.1"
    resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
    dependencies:
@@@ -7011,12 -7245,12 +7254,12 @@@ tapable@^0.2.7
    resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
  
  tar@^4:
 -  version "4.4.2"
 -  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.2.tgz#60685211ba46b38847b1ae7ee1a24d744a2cd462"
 +  version "4.4.4"
 +  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
    dependencies:
      chownr "^1.0.1"
      fs-minipass "^1.2.5"
 -    minipass "^2.2.4"
 +    minipass "^2.3.3"
      minizlib "^1.1.0"
      mkdirp "^0.5.0"
      safe-buffer "^5.1.2"
@@@ -7189,8 -7423,8 +7432,8 @@@ tsconfig-paths@^3.1.1
      strip-json-comments "^2.0.1"
  
  tslib@^1.8.0, tslib@^1.8.1:
 -  version "1.9.1"
 -  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7"
 +  version "1.9.2"
 +  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.2.tgz#8be0cc9a1f6dc7727c38deb16c2ebd1a2892988e"
  
  tslint-config-prettier@^1.10.0:
    version "1.13.0"
@@@ -7256,9 -7490,13 +7499,9 @@@ typedarray@^0.0.6
    version "0.0.6"
    resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
  
 -typesafe-actions@2.0.3:
 -  version "2.0.3"
 -  resolved "https://registry.yarnpkg.com/typesafe-actions/-/typesafe-actions-2.0.3.tgz#5451a4f8bf0d1e79f7d12af7582cc5f12d490708"
 -
 -typescript@2.8.3:
 -  version "2.8.3"
 -  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
 +typescript@2.9.1:
 +  version "2.9.1"
 +  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.1.tgz#fdb19d2c67a15d11995fd15640e373e09ab09961"
  
  ua-parser-js@^0.7.9:
    version "0.7.18"
@@@ -7271,9 -7509,9 +7514,9 @@@ uglify-es@^3.3.4
      commander "~2.13.0"
      source-map "~0.6.1"
  
 -uglify-js@3.3.x, uglify-js@^3.0.13:
 -  version "3.3.26"
 -  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.26.tgz#858b74e5e7262e876c834b907a5fa57d4fa0d525"
 +uglify-js@3.3.x:
 +  version "3.3.28"
 +  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.28.tgz#0efb9a13850e11303361c1051f64d2ec68d9be06"
    dependencies:
      commander "~2.15.0"
      source-map "~0.6.1"
@@@ -7287,13 -7525,6 +7530,13 @@@ uglify-js@^2.6, uglify-js@^2.8.29
    optionalDependencies:
      uglify-to-browserify "~1.0.0"
  
 +uglify-js@^3.0.13:
 +  version "3.4.0"
 +  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.0.tgz#796762282b5b5f0eafe7d5c8c708d1d7bd5ba11d"
 +  dependencies:
 +    commander "~2.15.0"
 +    source-map "~0.6.1"
 +
  uglify-to-browserify@~1.0.0:
    version "1.0.2"
    resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
@@@ -7319,6 -7550,10 +7562,10 @@@ uglifyjs-webpack-plugin@^1.1.8
      webpack-sources "^1.1.0"
      worker-farm "^1.5.2"
  
+ underscore@~1.4.4:
+   version "1.4.4"
+   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604"
  union-value@^1.0.0:
    version "1.0.0"
    resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
      is-extendable "^0.1.1"
      set-value "^0.4.3"
  
 +unionize@2.1.2:
 +  version "2.1.2"
 +  resolved "https://registry.yarnpkg.com/unionize/-/unionize-2.1.2.tgz#2513b148de515bec93f045d1685bd88eab62b608"
 +
  uniq@^1.0.1:
    version "1.0.1"
    resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
  
 -uniqid@^4.0.0:
 -  version "4.1.1"
 -  resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
 -  dependencies:
 -    macaddress "^0.2.8"
 -
  uniqs@^2.0.0:
    version "2.0.0"
    resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
@@@ -7401,8 -7638,8 +7648,8 @@@ upper-case@^1.1.1
    resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
  
  uri-js@^4.2.1:
 -  version "4.2.1"
 -  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.1.tgz#4595a80a51f356164e22970df64c7abd6ade9850"
 +  version "4.2.2"
 +  resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
    dependencies:
      punycode "^2.1.0"
  
@@@ -7459,18 -7696,12 +7706,18 @@@ util.promisify@^1.0.0
      define-properties "^1.1.2"
      object.getownpropertydescriptors "^2.0.3"
  
 -util@0.10.3, util@^0.10.3:
 +util@0.10.3:
    version "0.10.3"
    resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
    dependencies:
      inherits "2.0.1"
  
 +util@^0.10.3:
 +  version "0.10.4"
 +  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
 +  dependencies:
 +    inherits "2.0.3"
 +
  utila@~0.3:
    version "0.3.3"
    resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
@@@ -7542,12 -7773,6 +7789,12 @@@ warning@^3.0.0
    dependencies:
      loose-envify "^1.0.0"
  
 +warning@^4.0.1:
 +  version "4.0.1"
 +  resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.1.tgz#66ce376b7fbfe8a887c22bdf0e7349d73d397745"
 +  dependencies:
 +    loose-envify "^1.0.0"
 +
  watch@~0.18.0:
    version "0.18.0"
    resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
@@@ -7685,7 -7910,7 +7932,7 @@@ whatwg-mimetype@^2.0.0, whatwg-mimetype
    version "2.1.0"
    resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4"
  
 -whatwg-url@^6.4.0:
 +whatwg-url@^6.4.0, whatwg-url@^6.4.1:
    version "6.4.1"
    resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.1.tgz#fdb94b440fd4ad836202c16e9737d511f012fd67"
    dependencies:
@@@ -7706,16 -7931,16 +7953,16 @@@ which-module@^2.0.0
    resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
  
  which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0:
 -  version "1.3.0"
 -  resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
 +  version "1.3.1"
 +  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
    dependencies:
      isexe "^2.0.0"
  
  wide-align@^1.1.0:
 -  version "1.1.2"
 -  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
 +  version "1.1.3"
 +  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
    dependencies:
 -    string-width "^1.0.2"
 +    string-width "^1.0.2 || 2"
  
  widest-line@^2.0.0:
    version "2.0.0"