[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    [\n      \"env\",\n      {\n        \"targets\": {\n          \"node\": \"current\"\n        },\n        \"useBuiltIns\": true,\n        \"exclude\": [\n          \"babel-plugin-transform-regenerator\",\n          \"transform-async-to-generator\"\n        ]\n      }\n    ]\n  ],\n  \"plugins\": [\n    \"babel-plugin-transform-class-properties\",\n    [\"styled-components\", { \"ssr\": true }],\n    \"transform-flow-strip-types\",\n    \"transform-object-rest-spread\",\n    \"babel-plugin-transform-react-jsx\",\n    \"syntax-dynamic-import\",\n    \"syntax-async-generators\",\n    \"transform-async-generator-functions\",\n    \"react-loadable/babel\",\n    \"babel-plugin-inline-import-graphql-ast\"\n  ]\n}\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "# CircleCI configuration for Spectrum\nversion: 2.1\n\n# Aliases\naliases:\n  # Cache Management\n  - &restore-yarn-cache\n    keys:\n      - v1-yarn-{{ arch }}-{{ checksum \"package.json\" }}\n      - v1-yarn-{{ arch }}-\n\n  - &save-yarn-cache\n    paths:\n      - node_modules\n      - ~/.cache/yarn\n    key: v1-yarn-{{ arch }}-{{ checksum \"package.json\" }}\n\n  - &yarn |\n    yarn\n\n  - &install-rethinkdb\n    name: Install RethinkDB 2.3.5\n    command: |\n      echo \"deb http://download.rethinkdb.com/apt jessie main\" | sudo tee /etc/apt/sources.list.d/rethinkdb.list\n      wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -\n      sudo apt-get update\n      sudo apt-get install rethinkdb=2.3.5~0jessie\n\n  - &start-rethinkdb\n    name: Start RethinkDB\n    command: rethinkdb --bind all\n    background: true\n\n  - &setup-and-build-web\n    name: Setup and build web\n    command: |\n      cp now-secrets.example.json now-secrets.json\n      yarn run build:web\n\n  - &build-api\n    name: Build API\n    command: yarn run build:api\n\n  - &start-api\n    name: Start the API in the background\n    command: yarn run start:api:test\n    background: true\n\n  - &start-web\n    name: Start web client in the background\n    command: yarn run dev:web\n    background: true\n\ndefaults: &defaults\n  working_directory: ~/spectrum\n\njs_defaults: &js_defaults\n  <<: *defaults\n  docker:\n    - image: circleci/node:8\n\njobs:\n  # Set up environment and install required dependencies\n  checkout_environment:\n    <<: *js_defaults\n    steps:\n      - checkout\n\n      - restore_cache: *restore-yarn-cache\n      - run: *yarn\n      - save_cache: *save-yarn-cache\n\n      - persist_to_workspace:\n          root: .\n          paths: .\n\n  build_web:\n    <<: *js_defaults\n    steps:\n      - attach_workspace:\n          at: ~/spectrum\n      - run: *setup-and-build-web\n      - run: *build-api\n      - persist_to_workspace:\n          root: .\n          paths:\n            - build-api\n            - build\n\n  test_unit:\n    <<: *defaults\n    docker:\n      - image: circleci/node:8\n      - image: redis:3.2.7\n      - image: rethinkdb:2.3.5\n    environment:\n      TERM: xterm\n    steps:\n      - attach_workspace:\n          at: ~/spectrum\n      - run: yarn run db:migrate\n      - run: yarn run db:seed\n      - run:\n          name: Run Unit Tests\n          command: yarn run test:ci\n\n  # Start db and servers, then run e2e and unit tests\n  test_integration:\n    <<: *defaults\n    docker:\n      - image: circleci/node:8-browsers\n      - image: redis:3.2.7\n      - image: cypress/base:6\n      - image: rethinkdb:2.3.5\n    parameters:\n      parallelism:\n        type: integer\n        default: 1\n        description: Number of boxes to use to run this job\n    parallelism: <<parameters.parallelism>>\n    environment:\n      TERM: xterm\n    steps:\n      - attach_workspace:\n          at: ~/spectrum\n      - run: yarn run db:migrate\n      - run: yarn run db:seed\n      - run: *start-api\n      - run: *start-web\n      # Wait for the API and webserver to start\n      - run: ./node_modules/.bin/wait-on http://localhost:3000 http://localhost:3001\n      - run:\n          name: Install Cypress\n          command: yarn run cypress:install\n      - run:\n          name: Run E2E Tests\n          command: |\n            if [ $CYPRESS_RECORD_KEY ]; then \n              yarn run test:e2e -- --record --parallel\n            else\n              yarn run test:e2e\n            fi\n\n  # This runs after the above and is only here to hack around missing support for varying jobs based on external vs internal PRs\n  # See https://github.com/withspectrum/spectrum/pull/4820\n  test_e2e:\n    docker:\n      - image: cypress/base:10\n    steps:\n      - run: echo \"pass\"\n\n  # Run eslint, flow etc.\n  test_static_js:\n    <<: *js_defaults\n    steps:\n      - attach_workspace:\n          at: ~/spectrum\n      - run:\n          name: Run Flow\n          command: yarn run flow\n      - run:\n          name: Run ESLint\n          command: yarn run lint\n\nworkflows:\n  test:\n    jobs:\n      - checkout_environment\n      - test_unit:\n          requires:\n            - checkout_environment\n      - test_static_js:\n          requires:\n            - checkout_environment\n      - build_web:\n          requires:\n            - checkout_environment\n      # Run pull requests from internal contributors in parallel\n      - test_integration:\n          name: test_e2e_internal\n          requires:\n            - build_web\n          parallelism: 8\n          filters:\n            branches:\n              ignore: /pull.*/\n      # Run pull requests from external contributors on one machine\n      - test_integration:\n          name: test_e2e_external\n          requires:\n            - build_web\n          parallelism: 1\n          filters:\n            branches:\n              only: /pull.*/\n      # If either of the test_e2e_* jobs pass, this one passes so we can mark it as required on GitHub\n      - test_e2e:\n          requires:\n            - test_e2e_internal\n            - test_e2e_external\n"
  },
  {
    "path": ".dockerignore",
    "content": ".git\n*docker-compose*\n*Dockerfile*\nnode_modules\n"
  },
  {
    "path": ".eslintignore",
    "content": "# Note: This is a copy of the .gitignore,\n# with flow-typed added\nflow-typed\nnode_modules\n.sass-cache\nnpm-debug.log\nbuild\n.DS_Store\nsrc/config/FirebaseConfig.js\nrethinkdb_data\ndebug\nnow-secrets.json\nbuild-iris\nbuild-api\nbuild-hyperion\npackage-lock.json\n.vscode\ndump.rdb\n*.swp\nqueries-by-response-size.js\nqueries-by-time.js\ntest-extend.js\nstats.json\niris/.env\napi/.env\ntest-results.json\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  extends: ['eslint:recommended', 'plugin:react/recommended'],\n  parser: 'babel-eslint',\n  env: {\n    es6: true,\n    node: true,\n  },\n  parserOptions: {\n    ecmaVersion: 6,\n    sourceType: 'module',\n    ecmaFeatures: {\n      jsx: true,\n    },\n  },\n  plugins: ['eslint-plugin-flowtype'],\n  rules: {\n    'no-undef': 0,\n    'no-console': ['warn', { allow: ['warn', 'error'] }],\n    'no-unused-vars': 1,\n    'no-empty': 0,\n    'no-useless-escape': 1,\n    'no-fallthrough': 1,\n    'no-extra-boolean-cast': 1,\n    'react/prop-types': 0,\n    'react/no-deprecated': 0,\n    'react/display-name': 0,\n    'react/no-find-dom-node': 1,\n    'react/no-unescaped-entities': 'warn',\n    'react/no-string-refs': 'warn',\n    'react/jsx-no-target-blank': 'warn',\n    'react/no-children-prop': 0,\n  },\n};\n"
  },
  {
    "path": ".flowconfig",
    "content": "[ignore]\n.*/build.*\n.*/*.test.js\n.*/node_modules/cypress\n.*/node_modules/draft-js\n.*/node_modules/graphql\n.*/node_modules/protobufjs-no-cli\n.*/node_modules/reqwest\n.*/node_modules/react-apollo\n.*/node_modules/dataloader\n<PROJECT_ROOT>/node_modules/*\n<PROJECT_ROOT>/email-template-scripts/*\n\n[options]\nsuppress_comment=.*\\\\$FlowFixMe\nsuppress_comment=.*\\\\$FlowIssue\nesproposal.class_instance_fields=enable\nmodule.system.node.resolve_dirname=node_modules\nmodule.system.node.resolve_dirname=.\nmodule.file_ext=.js\nmodule.file_ext=.jsx\nmodule.file_ext=.json\n\n[lints]\nuntyped-type-import=error\nuntyped-import=warn\nunclear-type=warn\nunsafe-getters-setters=error\n\n[version]\n0.66.0"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!--\nFILL OUT THE FORM BELOW OR THE ISSUE WILL BE AUTO-CLOSED\n\n**Issue Type (check one)**\n\n- [ ] Bug Report\n- [ ] Feature Idea\n- [ ] Technical Discussion\n- [ ] Question (these will be auto-closed, please ask them on Spectrum instead https://spectrum.chat/spectrum/open)\n\n**Description (type any text below)** -->\n\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- FILL OUT THE BELOW FORM OR YOUR PR WILL BE AUTOMATICALLY CLOSED -->\n\n**Status**\n\n- [ ] WIP\n- [ ] Ready for review\n- [ ] Needs testing\n\n**Deploy after merge (delete what needn't be deployed)**\n\n- api\n- hyperion (frontend)\n\n**Run database migrations (delete if no migration was added)**\nYES\n\n## **Release notes for users (delete if codebase-only change)**\n\n**Related issues (delete if you don't know of any)**\nCloses #\n\n<!-- If there are UI changes please share mobile-responsive and desktop screenshots or recordings. -->\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n.sass-cache\nnpm-debug.log\nbuild\n.DS_Store\nsrc/config/FirebaseConfig.js\nnpm-debug.log\nyarn-error.log\nrethinkdb_data\ndebug\nnow-secrets.json\nbuild-iris\nbuild-api\nbuild-hyperion\nbuild-electron\npackage-lock.json\n.vscode\ndump.rdb\n*.swp\nqueries-by-response-size.js\nqueries-by-time.js\ntest-extend.js\nstats.json\niris/.env\napi/.env\ntest-results.json\npublic/uploads\ncypress/screenshots/\ncypress/videos/\ncacert\n.env\n.env.*\n"
  },
  {
    "path": ".npmignore",
    "content": "# This is used by now when deploying hyperion, replacing .gitignore\n# NOTE(@mxstbr): The important change is that `cacert` is NOT ignored!\nnode_modules\n.sass-cache\nnpm-debug.log\nbuild\n.DS_Store\nsrc/config/FirebaseConfig.js\nnpm-debug.log\nyarn-error.log\nrethinkdb_data\ndebug\nnow-secrets.json\nbuild-iris\nbuild-api\nbuild-hyperion\nbuild-electron\npackage-lock.json\n.vscode\ndump.rdb\n*.swp\nqueries-by-response-size.js\nqueries-by-time.js\ntest-extend.js\nstats.json\niris/.env\napi/.env\ntest-results.json\npublic/uploads\ncypress/screenshots/\ncypress/videos/\n\n# This is hyperion-now-specific, do not copy to .gitignore\ndocs\ncypress\nadmin\n.circleci\n.github\n\n"
  },
  {
    "path": ".prettierignore",
    "content": "flow-typed\npackage.json"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"es5\"\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright 2018 Space Program Inc.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n\n[![Spectrum](./public/img/media.png)](https://spectrum.chat)\n\n### Simple, powerful online communities.\n\n</div>\n\nThis is the main monorepo codebase of [Spectrum](https://spectrum.chat). Every single line of code that's not packaged into a reusable library is in this repository.\n\n## What is Spectrum?\n\n### Vision\n\nIt is difficult to grow, manage and measure the impact of online communities. Community owners need modern, chat-based communities but are running into scaling issues when their community grows beyond a few hundred members. It becomes hard to keep track of who's who, know what conversations are happening, and ensure that the community is staying healthy and productive.\n\n**Spectrum aims to be the best platform to build any kind of community online by combining the best of forums and real-time chat apps.** With best-in-class moderation tooling, a single platform for all your communities, threaded conversations by default, community health monitoring, and much more to come we think that we will be able to help more people start and grow the best online communities.\n\n> \"[Spectrum] will take the place that Reddit used to have a long time ago for communities (especially tech) to freely share ideas and interact. Except realtime and trolling-free.\"\n>\n> \\- [Guillermo Rauch (@rauchg)](https://twitter.com/rauchg/status/930946768841228288)\n\n### Status\n\nSpectrum has been in full-time development since March 2017 and is [part of GitHub since November 2018](https://spectrum.chat/spectrum/general/spectrum-is-joining-github~1d3eb8ee-4c99-46c0-8daf-ca35a96be6ce). See our current priorities and what we are working on in the [main project board](https://github.com/withspectrum/spectrum/projects/23).\n\n<div align=\"center\">\n  <img height=\"50px\" src=\"public/img/cluster-1.svg\" />\n</div>\n\n## Docs\n\n- [Contributing](#contributing)\n  - [Ground Rules](#ground-rules)\n  - [Codebase](#codebase)\n    - [Technologies](#technologies)\n    - [Folder Structure](#folder-structure)\n    - [Code Style](#code-style)\n  - [First time setup](#first-time-setup)\n  - [Running the app locally](#running-the-app-locally)\n  - [Roadmap](https://github.com/withspectrum/spectrum/projects/19)\n- [Technical](docs/)\n  - [Testing](docs/testing/intro.md)\n  - [Background Jobs](docs/workers/background-jobs.md)\n  - [Deployment](docs/deployments.md)\n  - [API](docs/backend/api/)\n    - [Fragments](docs/backend/api/fragments.md)\n    - [Pagination](docs/backend/api/pagination.md)\n    - [Testing](docs/backend/api/testing.md)\n    - [Tips and Tricks](docs/backend/api/tips-and-tricks.md)\n\n## Contributing\n\n**We heartily welcome any and all contributions that match our engineering standards!**\n\nThat being said, this codebase isn't your typical open source project because it's not a library or package with a limited scope—it's our entire product.\n\n### Ground Rules\n\n#### Contributions and discussion guidelines\n\nAll conversations and communities on Spectrum agree to GitHub's [Community Guidelines](https://help.github.com/en/github/site-policy/github-community-guidelines) and [Acceptable Use Policies](https://help.github.com/en/github/site-policy/github-acceptable-use-policies). This code of conduct also applies to all conversations that happen within our contributor community here on GitHub. We expect discussions in issues and pull requests to stay positive, productive, and respectful. Remember: there are real people on the other side of that screen!\n\n#### Reporting a bug or discussing a feature idea\n\nIf you found a technical bug on Spectrum or have ideas for features we should implement, the issue tracker is the best place to share your ideas. Make sure to follow the issue template and you should be golden! ([click here to open a new issue](https://github.com/withspectrum/spectrum/issues/new))\n\n#### Fixing a bug or implementing a new feature\n\nIf you find a bug on Spectrum and open a PR that fixes it we'll review it as soon as possible to ensure it matches our engineering standards.\n\nIf you want to implement a new feature, open an issue first to discuss what it'd look like and to ensure it fits in our roadmap and plans for the app (see [the main project board](https://github.com/withspectrum/spectrum/projects/23) for planned and currently ongoing work).\n\nIf you want to contribute but are unsure to start, we have [a \"good first issue\" label](https://github.com/withspectrum/spectrum/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) which is applied to newcomer-friendly issues. Take a look at [the full list of good first issues](https://github.com/withspectrum/spectrum/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) and pick something you like! There is also [an \"open\" channel in the Spectrum community on Spectrum](https://spectrum.chat/spectrum/open) (how meta), if you run into troubles while trying to contribute that is the best place to talk to us.\n\nWant to fix a bug or implement an agreed-upon feature? Great, jump to the [local setup instructions](#first-time-setup)!\n\n<div align=\"center\">\n  <img height=\"70px\" src=\"public/img/cluster-2.svg\" />\n</div>\n\n### Codebase\n\n#### Technologies\n\nWith the ground rules out of the way, let's talk about the coarse architecture of this mono repo:\n\n- **Full-stack JavaScript**: We use Node.js to power our servers, and React to power our frontend apps. Almost all of the code you'll touch in this codebase will be JavaScript.\n  Here is a list of all the big technologies we use:\n\n- **RethinkDB**: Data storage\n- **Redis**: Background jobs and caching\n- **GraphQL**: API, powered by the entire Apollo toolchain\n- **Flowtype**: Type-safe JavaScript\n- **PassportJS**: Authentication\n- **React**: Frontend React app\n\n#### Folder structure\n\n```sh\nspectrum/\n├── api        # API server\n├── docs\n├── hyperion   # Rendering server\n├── public     # Public files used on the frontend\n├── shared     # Shared JavaScript code\n├── src        # Frontend SPA\n```\n\n<details>\n  <summary>Click to learn about the worker naming scheme</summary>\n\n#### Naming Scheme\n\nAs you can see we follow a loose naming scheme based on ancient Greek, Roman, and philosophical figures that are somewhat related to what our servers do:\n\n- Hyperion: (/haɪˈpɪəriən/) is one of the twelve Titan children of Gaia and Uranus.\n\n</details>\n\n#### Code Style\n\nWe run Prettier on-commit, which means you can write code in whatever style you want and it will be automatically formatted according to the common style when you run `git commit`. We also have ESLint set up, although we've disabled all stylistic rules since Prettier takes care of those.\n\n##### Rules\n\n- **All new `.js` files must be flow typed**: Since we only introduced Flowtype after we finished building the first version of Spectrum, we enforce in CI that all new files added to the codebase are typed. (if you've never used Flowtype before that's totally fine, just write your code in plain JS and let us know in the PR body, we can take care of it for you)\n- **No `console.log`s in any file**: We use the `debug` module across the codebase to log debugging information in development only. Never commit a file that contains a `console.log` as CI will fail your build. The only exceptions are errors, which you can log, but you have to use `console.error` to be explicit about it\n\n<div align=\"center\">\n  <img height=\"70px\" src=\"public/img/cluster-3.svg\" />\n</div>\n\n### First time setup\n\nThe first step to running Spectrum locally is downloading the code by cloning the repository:\n\n```sh\ngit clone git@github.com:withspectrum/spectrum.git\n```\n\nIf you get `Permission denied` error using `ssh` refer [here](https://help.github.com/articles/error-permission-denied-publickey/)\nor use `https` link as a fallback.\n\n```sh\ngit clone https://github.com/withspectrum/spectrum.git\n```\n\n#### Installation\n\nSpectrum has four big installation steps:\n\n1. **Install RethinkDB**: See [the RethinkDB documentation](https://rethinkdb.com/docs/install/) for instructions on installing it with your OS.\n2. **Install Redis**: See [the Redis documentation](https://redis.io/download) for instructions on installing it with your OS.\n3. **Install yarn**: We use [yarn](https://yarnpkg.com) to handle our JavaScript dependencies. (plain `npm` doesn't work due to our monorepo setup) See [the yarn documentation](https://yarnpkg.com/en/docs/install) for instructions on installing it.\n4. **Install the dependencies**: Because it's pretty tedious to install the dependencies for each worker individually we've created a script that goes through and runs `yarn install` for every worker for you: (this takes a couple minutes, so dive into the [technical docs](./docs) in the meantime)\n\n```sh\nnode shared/install-dependencies.js\n```\n\nYou've now finished installing everything! Let's migrate the database and you'll be ready to go :100:\n\n#### Migrating the database\n\nWhen you first download the code and want to run it locally you have to migrate the database and seed it with test data. First, start rethinkdb in its own terminal tab:\n\n```sh\nrethinkdb\n```\n\nThen, in a new tab, run these commands:\n\n```sh\nyarn run db:migrate\nyarn run db:seed\n# ⚠️ To empty the database (e.g. if there's faulty data) run yarn run db:drop\n```\n\nThere's a shortcut for dropping, migrating and seeding the database too:\n\n```sh\nyarn run db:reset\n```\n\nThe `testing` database used in end to end tests is managed separately. It is built, migrated, and seeded when you run:\n\n```sh\nyarn run start:api:test\n```\n\nTo drop the `testing` database, go to http://localhost:8080/#tables while `rethinkdb` is running, and click Delete Database on the appropriate database.\n\n#### Getting the secrets\n\nWhile the app will run without any secrets set up, you won't be able to sign in locally. To get that set up, copy the provided example secrets file to the real location:\n\n```\ncp now-secrets.example.json now-secrets.json\n```\n\n> Note: If you're an employee at Spectrum we've got a more complete list of secrets that also lets you upload images etc. in 1Password, search for \"now-secrets.json\" to find it.\n\nNow you're ready to run the app locally and sign into your local instance!\n\n### Running the app locally\n\n#### Background services\n\nWhenever you want to run Spectrum locally you have to have RethinkDB and Redis running in the background. First start rethinkdb like we did to migrate the database:\n\n```sh\nrethinkdb\n```\n\nThen (without closing the rethinkdb tab!) open another tab and start Redis:\n\n```sh\nredis-server\n```\n\n#### Start the servers\n\nDepending on what you're trying to work on you'll need to start different servers. Generally, all servers run in development mode by doing `yarn run dev:<workername>`, e.g. `yarn run dev:hermes` to start the email worker.\n\nNo matter what you're trying to do though, you'll want to have the API running, so start that in a background tab:\n\n```\nyarn run dev:api\n```\n\n#### Develop the web UI\n\nTo develop the frontend and web UI run\n\n```\nyarn run dev:web\n```\n\n<br />\t\n<div align=\"center\">\t\n  <img height=\"200px\" src=\"public/img/connect.svg\" />\t\n</div>\n\n## GitHub\n\nSpectrum is now part of GitHub. For code of conduct, please see [GitHub's Community Guidelines](https://help.github.com/en/github/site-policy/github-community-guidelines) and [Acceptable Use Policies](https://help.github.com/en/github/site-policy/github-acceptable-use-policies).\n\n## License\n\nBSD 3-Clause, see the [LICENSE](./LICENSE) file.\n"
  },
  {
    "path": "api/apollo-server.js",
    "content": "// @flow\nconst debug = require('debug')('api:graphql');\nimport { ApolloServer } from 'apollo-server-express';\nimport responseCachePlugin from 'apollo-server-plugin-response-cache';\nimport depthLimit from 'graphql-depth-limit';\nimport costAnalysis from 'graphql-cost-analysis';\nimport { RedisCache } from 'apollo-server-cache-redis';\nimport createLoaders from './loaders';\nimport createErrorFormatter from './utils/create-graphql-error-formatter';\nimport schema from './schema';\nimport { statsd } from 'shared/statsd';\nimport { getUserIdFromReq } from './utils/session-store';\nimport UserError from './utils/UserError';\nimport type { DBUser } from 'shared/types';\nimport { getUserById } from '../shared/db/queries/user';\n\n// NOTE(@mxstbr): Evil hack to make graphql-cost-analysis work with Apollo Server v2\n// @see pa-bru/graphql-cost-analysis#12\n// @author @arianon\nclass ProtectedApolloServer extends ApolloServer {\n  async createGraphQLServerOptions(\n    req: express$Request,\n    res: express$Response\n  ): Promise<*> {\n    const options = await super.createGraphQLServerOptions(req, res);\n\n    return {\n      ...options,\n      validationRules: [\n        ...options.validationRules,\n        costAnalysis({\n          maximumCost: 750,\n          defaultCost: 1,\n          variables: req.body.variables,\n          createError: (max, actual) => {\n            const err = new UserError(\n              `GraphQL query exceeds maximum complexity, please remove some nesting or fields and try again. (max: ${max}, actual: ${actual})`\n            );\n            return err;\n          },\n        }),\n      ],\n    };\n  }\n}\n\nlet connections = 0;\n\nsetInterval(() => {\n  statsd.gauge('websocket.connections.count', connections);\n}, 5000);\n\nconst server = new ProtectedApolloServer({\n  schema,\n  formatError: createErrorFormatter(),\n  // For subscriptions, this gets passed \"connection\", for everything else \"req\" and \"res\"\n  context: ({ req, res, connection, ...rest }, ...other) => {\n    if (connection) {\n      return {\n        ...(connection.context || {}),\n      };\n    }\n\n    // Add GraphQL operation information to the statsd tags\n    req.statsdTags = {\n      graphqlOperationName: req.body.operationName || 'unknown_operation',\n    };\n    debug(req.body.operationName || 'unknown_operation');\n    const loaders = createLoaders();\n    let currentUser = req.user && !req.user.bannedAt ? req.user : null;\n\n    return {\n      loaders,\n      updateCookieUserData: (data: DBUser) =>\n        new Promise((res, rej) =>\n          req.login(data, err => (err ? rej(err) : res()))\n        ),\n      req,\n      user: currentUser,\n    };\n  },\n  subscriptions: {\n    path: '/websocket',\n    onConnect: (connectionParams, rawSocket) => {\n      connections++;\n      return getUserIdFromReq(rawSocket.upgradeReq)\n        .then(id => (id ? getUserById(id) : null))\n        .then(user => {\n          return {\n            user: user || null,\n            loaders: createLoaders({ cache: false }),\n          };\n        })\n        .catch(err => {\n          console.error(err);\n          return {\n            loaders: createLoaders({ cache: false }),\n          };\n        });\n    },\n  },\n  playground: process.env.NODE_ENV !== 'production' && {\n    settings: {\n      'editor.theme': 'light',\n    },\n    tabs: [\n      {\n        endpoint: 'http://localhost:3001/api',\n        query: `{\n  user(username: \"mxstbr\") {\n    id\n    username\n  }\n}`,\n      },\n    ],\n  },\n  introspection: process.env.NODE_ENV !== 'production',\n  maxFileSize: 25 * 1024 * 1024, // 25MB\n  engine: false,\n  tracing: false,\n  validationRules: [depthLimit(10)],\n  cacheControl: {\n    calculateHttpHeaders: false,\n    // Cache everything for at least a minute since we only cache public responses\n    defaultMaxAge: 60,\n  },\n  plugins: [\n    responseCachePlugin({\n      sessionId: ({ context }) => (context.user ? context.user.id : null),\n      // Only cache public responses\n      shouldReadFromCache: ({ context }) => !context.user,\n      shouldWriteToCache: ({ context }) => !context.user,\n    }),\n  ],\n});\n\nexport default server;\n"
  },
  {
    "path": "api/authentication.js",
    "content": "// @flow\nrequire('now-env');\nconst passport = require('passport');\nconst { Strategy: TwitterStrategy } = require('passport-twitter');\nconst { Strategy: FacebookStrategy } = require('passport-facebook');\nconst { Strategy: GoogleStrategy } = require('passport-google-oauth2');\nconst { Strategy: GitHubStrategy } = require('passport-github2');\nconst {\n  getUserById,\n  createOrFindUser,\n  saveUserProvider,\n  getUserByIndex,\n} = require('shared/db/queries/user');\n\nconst IS_PROD = !process.env.FORCE_DEV && process.env.NODE_ENV === 'production';\n\nconst TWITTER_OAUTH_CLIENT_SECRET = IS_PROD\n  ? process.env.TWITTER_OAUTH_CLIENT_SECRET\n  : process.env.TWITTER_OAUTH_CLIENT_SECRET_DEVELOPMENT;\n\nconst FACEBOOK_OAUTH_CLIENT_ID = IS_PROD\n  ? process.env.FACEBOOK_OAUTH_CLIENT_ID\n  : process.env.FACEBOOK_OAUTH_CLIENT_SECRET_DEVELOPMENT;\n\nconst FACEBOOK_OAUTH_CLIENT_SECRET = IS_PROD\n  ? process.env.FACEBOOK_OAUTH_CLIENT_SECRET\n  : process.env.FACEBOOK_OAUTH_CLIENT_SECRET_DEVELOPMENT;\n\nconst GOOGLE_OAUTH_CLIENT_SECRET = IS_PROD\n  ? process.env.GOOGLE_OAUTH_CLIENT_SECRET\n  : process.env.GOOGLE_OAUTH_CLIENT_SECRET_DEVELOPMENT;\n\nconst GITHUB_OAUTH_CLIENT_SECRET = IS_PROD\n  ? process.env.GITHUB_OAUTH_CLIENT_SECRET\n  : process.env.GITHUB_OAUTH_CLIENT_SECRET_DEVELOPMENT;\n\nconst TWITTER_OAUTH_CLIENT_ID = IS_PROD\n  ? 'vxmsICGyIIoT5NEYi1I8baPrf'\n  : 'Qk7BWFe44JKswEw2sNaDAA4x7';\n\nconst GOOGLE_OAUTH_CLIENT_ID = IS_PROD\n  ? '923611718470-chv7p9ep65m3fqqjr154r1p3a5j6oidc.apps.googleusercontent.com'\n  : '923611718470-hjribk5128dr3s26cbp5cbdecigrsjsp.apps.googleusercontent.com';\n\nconst GITHUB_OAUTH_CLIENT_ID = IS_PROD\n  ? '208a2e8684d88883eded'\n  : 'ed3e924f4a599313c83b';\n\nconst CALLBACK_BASE = IS_PROD\n  ? 'https://spectrum.chat'\n  : 'http://localhost:3001';\n\nconst isSerializedJSON = (str: string) =>\n  str[0] === '{' && str[str.length - 1] === '}';\n\nconst init = () => {\n  // Setup use serialization\n  passport.serializeUser((user, done) => {\n    done(null, typeof user === 'string' ? user : JSON.stringify(user));\n  });\n\n  // NOTE(@mxstbr): `data` used to be just the userID, but is now the full user data\n  // to avoid having to go to the db on every single request. We have to handle both\n  // cases here, as more and more users use Spectrum again we go to the db less and less\n  passport.deserializeUser((data, done) => {\n    // Fast path: we got the full user data in the cookie\n    if (isSerializedJSON(data)) {\n      let user;\n      // Ignore errors if our isSerializedJSON heuristic is wrong and `data` isn't serialized JSON\n      try {\n        user = JSON.parse(data);\n      } catch (err) {}\n\n      if (user && user.id && user.createdAt) {\n        return done(null, user);\n      }\n    }\n\n    // Slow path: data is just the userID (legacy), so we have to go to the db to get the full data\n    return getUserById(data)\n      .then(user => {\n        done(null, user);\n      })\n      .catch(err => {\n        done(err);\n      });\n  });\n\n  // Set up Twitter login\n  passport.use(\n    new TwitterStrategy(\n      {\n        consumerKey: TWITTER_OAUTH_CLIENT_ID,\n        consumerSecret: TWITTER_OAUTH_CLIENT_SECRET,\n        callbackURL: `${CALLBACK_BASE}/auth/twitter/callback`,\n        includeEmail: true,\n      },\n      (token, tokenSecret, profile, done) => {\n        const name =\n          profile.displayName ||\n          profile._json.name ||\n          profile._json.screen_name ||\n          profile.username ||\n          '';\n\n        const user = {\n          providerId: profile.id,\n          fbProviderId: null,\n          googleProviderId: null,\n          githubProviderId: null,\n          username: null,\n          name: name,\n          email:\n            (profile.emails &&\n              profile.emails.length > 0 &&\n              profile.emails[0].value) ||\n            null,\n          profilePhoto:\n            (profile.photos &&\n              profile.photos.length > 0 &&\n              profile.photos[0].value) ||\n            null,\n          coverPhoto: profile._json.profile_background_image_url_https\n            ? profile._json.profile_background_image_url_https\n            : null,\n          description:\n            profile._json.description && profile._json.description.length > 0\n              ? profile._json.description\n              : '',\n          website:\n            profile._json.entities.url &&\n            profile._json.entities.url.urls &&\n            profile._json.entities.url.urls.length > 0\n              ? profile._json.entities.url.urls[0].expanded_url\n              : '',\n        };\n\n        return createOrFindUser(user, 'providerId')\n          .then(user => {\n            done(null, user);\n            return user;\n          })\n          .catch(err => {\n            return done(null, err, {\n              message: 'Please sign in with GitHub to create a new account.',\n            });\n          });\n      }\n    )\n  );\n\n  // Set up Facebook login\n  passport.use(\n    new FacebookStrategy(\n      {\n        clientID: FACEBOOK_OAUTH_CLIENT_ID,\n        clientSecret: FACEBOOK_OAUTH_CLIENT_SECRET,\n        callbackURL: `${CALLBACK_BASE}/auth/facebook/callback`,\n        profileFields: [\n          'id',\n          'displayName',\n          'email',\n          'photos',\n          'about',\n          'cover',\n          'first_name',\n          'last_name',\n          'website',\n        ],\n      },\n      (token, tokenSecret, profile, done) => {\n        const user = {\n          providerId: null,\n          fbProviderId: profile.id,\n          googleProviderId: null,\n          githubProviderId: null,\n          username: null,\n          name: profile.displayName,\n          firstName:\n            profile.name && profile.name.givenName\n              ? profile.name.givenName\n              : '',\n          lastName:\n            profile.name && profile.name.familyName\n              ? profile.name.familyName\n              : '',\n          description: profile.about ? profile.about : '',\n          website: profile.website ? profile.website : '',\n          email:\n            profile.emails &&\n            profile.emails.length > 0 &&\n            profile.emails[0].value !== undefined\n              ? profile.emails[0].value\n              : null,\n          profilePhoto:\n            profile.photos &&\n            profile.photos.length > 0 &&\n            profile.photos[0].value !== undefined\n              ? profile.photos[0].value\n              : null,\n          coverPhoto: profile._json.cover ? profile._json.cover.source : '',\n        };\n\n        return createOrFindUser(user, 'fbProviderId')\n          .then(user => {\n            done(null, user);\n            return user;\n          })\n          .catch(err => {\n            return done(null, err, {\n              message: 'Please sign in with GitHub to create a new account.',\n            });\n          });\n      }\n    )\n  );\n\n  // Set up Google login\n  passport.use(\n    new GoogleStrategy(\n      {\n        clientID: GOOGLE_OAUTH_CLIENT_ID,\n        clientSecret: GOOGLE_OAUTH_CLIENT_SECRET,\n        callbackURL: `${CALLBACK_BASE}/auth/google/callback`,\n      },\n      (token, tokenSecret, profile, done) => {\n        const name =\n          profile.displayName || profile.name\n            ? `${profile.name.givenName} ${profile.name.familyName}`\n            : '';\n        const user = {\n          providerId: null,\n          fbProviderId: null,\n          googleProviderId: profile.id,\n          githubProviderId: null,\n          username: null,\n          name: name,\n          firstName:\n            profile.name && profile.name.givenName\n              ? profile.name.givenName\n              : '',\n          lastName:\n            profile.name && profile.name.familyName\n              ? profile.name.familyName\n              : '',\n          description: profile.tagline ? profile.tagline : '',\n          email:\n            (profile.emails &&\n              profile.emails.length > 0 &&\n              profile.emails[0].value) ||\n            null,\n          profilePhoto:\n            (profile.photos &&\n              profile.photos.length > 0 &&\n              profile.photos[0].value) ||\n            null,\n          coverPhoto:\n            profile._json.cover &&\n            profile._json.cover.coverPhoto &&\n            profile._json.cover.coverPhoto.url\n              ? profile._json.cover.coverPhoto.url\n              : '',\n          website:\n            profile._json.urls && profile._json.urls.length > 0\n              ? profile._json.urls[0].value\n              : '',\n        };\n\n        return createOrFindUser(user, 'googleProviderId')\n          .then(user => {\n            done(null, user);\n            return user;\n          })\n          .catch(err => {\n            return done(null, err, {\n              message: 'Please sign in with GitHub to create a new account.',\n            });\n          });\n      }\n    )\n  );\n\n  // Set up GitHub login\n  passport.use(\n    new GitHubStrategy(\n      {\n        clientID: GITHUB_OAUTH_CLIENT_ID,\n        clientSecret: GITHUB_OAUTH_CLIENT_SECRET,\n        callbackURL: `${CALLBACK_BASE}/auth/github/callback`,\n        scope: ['user'],\n        passReqToCallback: true,\n      },\n      async (req, token, tokenSecret, profile, done) => {\n        const name =\n          profile.displayName || profile.username || profile._json.name || '';\n\n        const splitProfileUrl = profile.profileUrl.split('/');\n        const fallbackUsername = splitProfileUrl[splitProfileUrl.length - 1];\n        const githubUsername =\n          profile.username || profile._json.login || fallbackUsername;\n\n        const existingUserWithProviderId = await getUserByIndex(\n          'githubProviderId',\n          profile.id\n        );\n\n        if (req.user) {\n          // if a user exists in the request body, it means the user is already\n          // authed and is trying to connect a github account. Before we do so\n          // we need to make sure that:\n          // 1. The user doesn't have an existing githubProviderId on their user\n          // 2. The providerId returned from GitHub isnt' being used by another user\n\n          // 1\n          if (req.user.githubProviderId) {\n            /*\n              Update the cached content of the github profile that we store\n              in redis for the graphql resolver. This allows us to put a button\n              on the client for a user to re-connect a github profile from\n              the web app which will update the cache with any changed usernames\n            */\n            if (\n              !req.user.githubUsername ||\n              req.user.githubUsername !== githubUsername\n            ) {\n              return saveUserProvider(\n                req.user.id,\n                'githubProviderId',\n                profile.id,\n                { githubUsername: githubUsername }\n              )\n                .then(user => {\n                  done(null, user);\n                  return user;\n                })\n                .catch(err => {\n                  done(err);\n                  return null;\n                });\n            }\n\n            return done(null, req.user);\n          }\n\n          // 2\n          // if no user exists with this provider id, it's safe to save on the req.user's object\n          if (!existingUserWithProviderId) {\n            return saveUserProvider(\n              req.user.id,\n              'githubProviderId',\n              profile.id,\n              { githubUsername: githubUsername }\n            )\n              .then(user => {\n                done(null, user);\n                return user;\n              })\n              .catch(err => {\n                done(err);\n                return null;\n              });\n          }\n\n          // if a user exists with this provider id, don't do anything and return\n          if (existingUserWithProviderId) {\n            return done(null, req.user, {\n              message:\n                'Your GitHub account is already linked to another Spectrum profile.',\n            });\n          }\n        }\n\n        const user = {\n          providerId: null,\n          fbProviderId: null,\n          googleProviderId: null,\n          githubProviderId: profile.id,\n          githubUsername: githubUsername,\n          username: null,\n          name: name,\n          description: profile._json.bio,\n          website: profile._json.blog,\n          email:\n            (profile.emails &&\n              profile.emails.length > 0 &&\n              profile.emails[0].value) ||\n            null,\n          profilePhoto:\n            (profile._json.avatar_url && profile._json.avatar_url) || null,\n        };\n\n        return createOrFindUser(user, 'githubProviderId')\n          .then(user => {\n            done(null, user);\n            return user;\n          })\n          .catch(err => {\n            done(err);\n            return null;\n          });\n      }\n    )\n  );\n};\n\nmodule.exports = {\n  init,\n};\n"
  },
  {
    "path": "api/index.js",
    "content": "// @flow\n/**\n * The entry point for the server, this is where everything starts\n */\nconst compression = require('compression');\nconst debug = require('debug')('api');\ndebug('Server starting...');\ndebug('logging with debug enabled!');\nimport { createServer } from 'http';\nimport express from 'express';\nimport Raven from 'shared/raven';\nimport toobusy from 'shared/middlewares/toobusy';\nimport addSecurityMiddleware from 'shared/middlewares/security';\nimport csrf from 'shared/middlewares/csrf';\nimport statsd from 'shared/middlewares/statsd';\nimport { init as initPassport } from './authentication.js';\nimport apolloServer from './apollo-server';\nimport { corsOptions } from 'shared/middlewares/cors';\nimport errorHandler from 'shared/middlewares/error-handler';\nimport middlewares from './routes/middlewares';\nimport authRoutes from './routes/auth';\nimport apiRoutes from './routes/api';\nimport type { DBUser } from 'shared/types';\nimport type { Loader } from './loaders/types';\n\nexport type GraphQLContext = {\n  user: DBUser,\n  updateCookieUserData: (data: DBUser) => Promise<void>,\n  loaders: {\n    [key: string]: Loader,\n  },\n};\n\nconst PORT = process.env.PORT ? parseInt(process.env.PORT, 10) : 3001;\n\ninitPassport();\n\nconst app = express();\n\n// Instantiate the statsd middleware as soon as possible to get accurate time tracking\napp.use(statsd);\n\n// Trust the now proxy\napp.set('trust proxy', true);\napp.use(toobusy);\n\n// Security middleware.\naddSecurityMiddleware(app, { enableNonce: false, enableCSP: false });\nif (process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV) {\n  app.use(csrf);\n}\n\n// All other middlewares\napp.use(compression());\napp.use(middlewares);\n\n// Routes\napp.use('/auth', authRoutes);\napp.use('/api', apiRoutes);\n\n// GraphQL middleware\napolloServer.applyMiddleware({ app, path: '/api', cors: corsOptions });\n\n// Redirect a request to the root path to the main app\napp.use('/', (req: express$Request, res: express$Response) => {\n  res.redirect(\n    process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV\n      ? 'https://spectrum.chat'\n      : 'http://localhost:3000'\n  );\n});\n\n// $FlowIssue\napp.use(errorHandler);\n\n// We need to create a separate HTTP server to handle GraphQL subscriptions via websockets\nconst httpServer = createServer(app);\napolloServer.installSubscriptionHandlers(httpServer);\n\nhttpServer.listen(PORT);\n\ndebug(`GraphQL API running at http://localhost:${PORT}/api`);\n\nprocess.on('unhandledRejection', async err => {\n  console.error('Unhandled rejection', err);\n  try {\n    await new Promise(resolve => Raven.captureException(err, resolve));\n  } catch (err) {\n    console.error('Raven error', err);\n  } finally {\n    process.exit(1);\n  }\n});\n\nprocess.on('uncaughtException', async err => {\n  console.error('Uncaught exception', err);\n  try {\n    await new Promise(resolve => Raven.captureException(err, resolve));\n  } catch (err) {\n    console.error('Raven error', err);\n  } finally {\n    process.exit(1);\n  }\n});\n"
  },
  {
    "path": "api/loaders/channel.js",
    "content": "// @flow\nimport { getChannels, getChannelsThreadCounts } from '../models/channel';\nimport { getChannelsSettings } from '../models/channelSettings';\nimport createLoader from './create-loader';\n\nexport const __createChannelLoader = createLoader(channels =>\n  getChannels(channels)\n);\n\nexport const __createChannelThreadCountLoader = createLoader(\n  channels => getChannelsThreadCounts(channels),\n  'group'\n);\n\nexport const __createChannelSettingsLoader = createLoader(\n  channelIds => getChannelsSettings(channelIds),\n  key => key.channelId\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/community.js",
    "content": "// @flow\nimport {\n  getCommunities,\n  getCommunitiesBySlug,\n  getCommunitiesChannelCounts,\n  getCommunitiesMemberCounts,\n} from '../models/community';\nimport { getCommunitiesSettings } from '../models/communitySettings';\nimport createLoader from './create-loader';\n\nexport const __createCommunityLoader = createLoader(communities =>\n  getCommunities(communities)\n);\n\nexport const __createCommunityBySlugLoader = createLoader(\n  communities => getCommunitiesBySlug(communities),\n  'slug'\n);\n\nexport const __createCommunityMemberCountLoader = createLoader(\n  communityIds => getCommunitiesMemberCounts(communityIds),\n  'group'\n);\n\nexport const __createCommunityChannelCountLoader = createLoader(\n  communityIds => getCommunitiesChannelCounts(communityIds),\n  'group'\n);\n\nexport const __createCommunitySettingsLoader = createLoader(\n  communityIds => getCommunitiesSettings(communityIds),\n  key => key.communityId\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/create-loader.js",
    "content": "// @flow\nimport DataLoader from 'dataloader';\nimport unique from 'shared/unique-elements';\nimport type { Loader, DataLoaderOptions } from './types';\n\n/**\n * Create a dataloader instance for a request and type\n *\n * Usage:\n * createUserLoader = () => createLoader(users => getUsers(users), 'id');\n */\nconst createLoader = (\n  batchFn: Function,\n  indexField: string | Function = 'id',\n  cacheKeyFn: Function = key => key\n) => (options?: DataLoaderOptions): Loader => {\n  return new DataLoader(keys => {\n    return batchFn(unique(keys)).then(\n      normalizeRethinkDbResults(keys, indexField, cacheKeyFn)\n    );\n  }, options);\n};\n\n// These helper functions were taken from the DataLoader docs\n// https://github.com/facebook/dataloader/blob/master/examples/RethinkDB.md\nfunction indexResults(results, indexField, cacheKeyFn) {\n  var indexedResults = new Map();\n  results.filter(Boolean).forEach(res => {\n    const key =\n      typeof indexField === 'function' ? indexField(res) : res[indexField];\n    indexedResults.set(cacheKeyFn(key), res);\n  });\n  return indexedResults;\n}\n\nfunction normalizeRethinkDbResults(keys, indexField, cacheKeyFn) {\n  return results => {\n    var indexedResults = indexResults(results, indexField, cacheKeyFn);\n    return keys.map(val => indexedResults.get(cacheKeyFn(val)) || null);\n  };\n}\n\nexport default createLoader;\n"
  },
  {
    "path": "api/loaders/directMessageThread.js",
    "content": "// @flow\nimport { getDirectMessageThreads } from '../models/directMessageThread';\nimport { getMembersInDirectMessageThreads } from '../models/usersDirectMessageThreads';\nimport { getLastMessageOfThreads } from '../models/message';\nimport createLoader from './create-loader';\nimport type { Loader } from './types';\n\nexport const __createDirectMessageThreadLoader = createLoader(threads =>\n  getDirectMessageThreads(threads)\n);\n\nexport const __createDirectMessageParticipantsLoader = createLoader(\n  threads => getMembersInDirectMessageThreads(threads),\n  'group'\n);\n\nexport const __createDirectMessageSnippetLoader = createLoader(\n  threads => getLastMessageOfThreads(threads),\n  'threadId'\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/index.js",
    "content": "// @flow\nimport {\n  __createUserLoader,\n  __createUserByUsernameLoader,\n  __createUserThreadCountLoader,\n  __createUserPermissionsInCommunityLoader,\n  __createUserPermissionsInChannelLoader,\n} from './user';\nimport {\n  __createThreadLoader,\n  __createThreadParticipantsLoader,\n} from './thread';\nimport {\n  __createChannelLoader,\n  __createChannelThreadCountLoader,\n  __createChannelSettingsLoader,\n} from './channel';\nimport {\n  __createCommunityLoader,\n  __createCommunityBySlugLoader,\n  __createCommunityChannelCountLoader,\n  __createCommunitySettingsLoader,\n  __createCommunityMemberCountLoader,\n} from './community';\nimport {\n  __createDirectMessageThreadLoader,\n  __createDirectMessageParticipantsLoader,\n  __createDirectMessageSnippetLoader,\n} from './directMessageThread';\nimport {\n  __createReactionLoader,\n  __createSingleReactionLoader,\n} from './reaction';\nimport { __createThreadReactionLoader } from './threadReaction';\nimport { __createMessageLoader } from './message';\nimport type { DataLoaderOptions } from './types';\n\n// Create all the necessary loaders to be attached to the GraphQL context for each request\nconst createLoaders = (options?: DataLoaderOptions) => ({\n  user: __createUserLoader(options),\n  userByUsername: __createUserByUsernameLoader(options),\n  userThreadCount: __createUserThreadCountLoader(options),\n  userPermissionsInCommunity: __createUserPermissionsInCommunityLoader(options),\n  userPermissionsInChannel: __createUserPermissionsInChannelLoader(options),\n  thread: __createThreadLoader(options),\n  threadParticipants: __createThreadParticipantsLoader(options),\n  channel: __createChannelLoader(options),\n  channelThreadCount: __createChannelThreadCountLoader(options),\n  channelSettings: __createChannelSettingsLoader(options),\n  community: __createCommunityLoader(options),\n  communityBySlug: __createCommunityBySlugLoader(options),\n  communityChannelCount: __createCommunityChannelCountLoader(options),\n  communityMemberCount: __createCommunityMemberCountLoader(options),\n  communitySettings: __createCommunitySettingsLoader(options),\n  directMessageThread: __createDirectMessageThreadLoader(options),\n  directMessageParticipants: __createDirectMessageParticipantsLoader(options),\n  directMessageSnippet: __createDirectMessageSnippetLoader(options),\n  message: __createMessageLoader(options),\n  messageReaction: __createReactionLoader(options),\n  threadReaction: __createThreadReactionLoader(options),\n  reaction: __createSingleReactionLoader(options),\n});\n\nexport default createLoaders;\n"
  },
  {
    "path": "api/loaders/message.js",
    "content": "// @flow\nimport { getManyMessages } from '../models/message';\nimport createLoader from './create-loader';\nimport type { Loader } from './types';\n\nexport const __createMessageLoader = createLoader((messages: string[]) =>\n  getManyMessages(messages)\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/reaction.js",
    "content": "// @flow\nimport { getReactions, getReactionsByIds } from '../models/reaction';\nimport createLoader from './create-loader';\n\nexport const __createReactionLoader = createLoader(\n  messageIds => getReactions(messageIds),\n  'group'\n);\n\nexport const __createSingleReactionLoader = createLoader(reactionIds =>\n  getReactionsByIds(reactionIds)\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/thread.js",
    "content": "// @flow\nimport { getThreads } from '../models/thread';\nimport { getParticipantsInThreads } from '../models/usersThreads';\nimport createLoader from './create-loader';\n\nexport const __createThreadLoader = createLoader(threads =>\n  getThreads(threads)\n);\n\nexport const __createThreadParticipantsLoader = createLoader(\n  threadIds => getParticipantsInThreads(threadIds),\n  'group'\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/threadReaction.js",
    "content": "// @flow\nimport { getThreadReactions } from '../models/threadReaction';\nimport createLoader from './create-loader';\n\nexport const __createThreadReactionLoader = createLoader(\n  threadIds => getThreadReactions(threadIds),\n  'group'\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/loaders/types.js",
    "content": "// @flow\n\nexport type Loader = {\n  load: (key: string | Array<string>) => Promise<any>,\n  loadMany: (keys: Array<*>) => Promise<any>,\n  clear: (key: string | Array<string>) => void,\n};\n\nexport type DataLoaderOptions = {\n  cache?: boolean,\n};\n"
  },
  {
    "path": "api/loaders/user.js",
    "content": "// @flow\nimport {\n  getUsers,\n  getUsersThreadCount,\n  getUsersByUsername,\n} from 'shared/db/queries/user';\nimport { getUsersPermissionsInCommunities } from '../models/usersCommunities';\nimport { getUsersPermissionsInChannels } from '../models/usersChannels';\nimport createLoader from './create-loader';\n\nexport const __createUserLoader = createLoader(users => getUsers(users), 'id');\n\nexport const __createUserByUsernameLoader = createLoader(\n  users => getUsersByUsername(users),\n  'username'\n);\n\nexport const __createUserThreadCountLoader = createLoader(\n  users => getUsersThreadCount(users),\n  'id'\n);\n\nexport const __createUserPermissionsInCommunityLoader = createLoader(\n  usersCommunities => getUsersPermissionsInCommunities(usersCommunities),\n  input => `${input.userId}|${input.communityId}`,\n  key => (Array.isArray(key) ? `${key[0]}|${key[1]}` : key)\n);\n\nexport const __createUserPermissionsInChannelLoader = createLoader(\n  usersChannels => getUsersPermissionsInChannels(usersChannels),\n  input => `${input.userId}|${input.channelId}`,\n  key => (Array.isArray(key) ? `${key[0]}|${key[1]}` : key)\n);\n\nexport default () => {\n  throw new Error(\n    '⚠️ Do not import loaders directly, get them from the GraphQL context instead! ⚠️'\n  );\n};\n"
  },
  {
    "path": "api/migrations/20170410074258-initial-data.js",
    "content": "exports.up = function(r, conn) {\n  return (\n    Promise.all([\n      r\n        .tableCreate('threads')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('channels')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('communities')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('messages')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('sessions')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('reactions')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('directMessageThreads')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('users')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('recurringPayments')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('invoices')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('usersCommunities')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('usersChannels')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('usersDirectMessageThreads')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n    ])\n      // Create secondary indexes\n      .then(() =>\n        Promise.all([\n          // index user by username\n          r\n            .table('users')\n            .indexCreate('username', r.row('username'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index recurringPayments by userId\n          r\n            .table('recurringPayments')\n            .indexCreate('userId', r.row('userId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index invoices by communityId\n          r\n            .table('invoices')\n            .indexCreate('communityId', r.row('communityId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // indexes on usersCommunities join table\n          r\n            .table('usersCommunities')\n            .indexCreate('userId', r.row('userId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersCommunities')\n            .indexCreate('communityId', r.row('communityId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // indexes on usersChannels join table\n          r\n            .table('usersChannels')\n            .indexCreate('userId', r.row('userId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersChannels')\n            .indexCreate('channelId', r.row('channelId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // indexes on usersDirectMessageThreads join table\n          r\n            .table('usersDirectMessageThreads')\n            .indexCreate('userId', r.row('userId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersDirectMessageThreads')\n            .indexCreate('threadId', r.row('threadId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index direct message threads by the users\n          r\n            .table('directMessageThreads')\n            .indexCreate('participants', { multi: true })\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index threads by creator\n          r\n            .table('threads')\n            .indexCreate('creatorId', r.row('creatorId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index threads by channelId\n          r\n            .table('threads')\n            .indexCreate('channelId', r.row('channelId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index threads by communityId\n          r\n            .table('threads')\n            .indexCreate('communityId', r.row('communityId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index threads by lastActive\n          r\n            .table('threads')\n            .indexCreate('lastActive', r.row('lastActive'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index reactions by message\n          r\n            .table('reactions')\n            .indexCreate('messageId', r.row('messageId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index channels by communityId\n          r\n            .table('channels')\n            .indexCreate('communityId', r.row('communityId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // index messages by thread\n          r\n            .table('messages')\n            .indexCreate('threadId', r.row('threadId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n        ])\n      )\n      .catch(err => {\n        console.log(err);\n        throw err;\n      })\n  );\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .tableDrop('threads')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('channels')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('communities')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('messages')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('sessions')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('users')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('directMessageThreads')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('reactions')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('recurringPayments')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('invoices')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('usersCommunities')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('usersChannels')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableDrop('usersDirectMessageThreads')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n"
  },
  {
    "path": "api/migrations/20170613200350-notifications.js",
    "content": "exports.up = function(r, conn) {\n  return (\n    // Create new tables, update old ones with receiveNotifications\n    Promise.all([\n      r\n        .table('usersChannels')\n        .filter({ isBlocked: false })\n        .update({ receiveNotifications: true })\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .table('usersCommunities')\n        .filter({ isBlocked: false })\n        .update({ receiveNotifications: true })\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('notifications')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('usersThreads')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n      r\n        .tableCreate('usersNotifications')\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n    ])\n      // Add secondary indexes to new tables\n      .then(() =>\n        Promise.all([\n          r\n            .table('notifications')\n            .indexCreate('modifiedAt', r.row('modifiedAt'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersThreads')\n            .indexCreate('userId')\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersThreads')\n            .indexCreate('threadId')\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersNotifications')\n            .indexCreate('userId')\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('notifications')\n            .indexCreate('contextId', r.row('context')('id'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          r\n            .table('usersNotifications')\n            .indexCreate('notificationId', r.row('notificationId'))\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n        ])\n      )\n      // Insert data into new tables that should be there\n      .then(() =>\n        Promise.all([\n          // Thread creators -> usersThreads\n          r\n            .table('threads')\n            .filter(r.row.hasFields('deletedAt').not())\n            .run(conn)\n            .then(cursor => cursor.toArray())\n            .then(threads =>\n              Promise.all(\n                threads.map(thread =>\n                  r\n                    .table('usersThreads')\n                    .insert({\n                      createdAt: r.now(),\n                      isParticipant: true,\n                      receiveNotifications: true,\n                      threadId: thread.id,\n                      userId: thread.creatorId,\n                    })\n                    .run(conn)\n                    .catch(err => {\n                      console.log(err);\n                      throw err;\n                    })\n                )\n              )\n            )\n            .catch(err => {\n              console.log(err);\n              throw err;\n            }),\n          // Thread participants -> usersThreads\n          r\n            .table('threads')\n            .filter(r.row.hasFields('deletedAt').not())\n            .run(conn)\n            .catch(err => {\n              console.log(err);\n              throw err;\n            })\n            .then(cursor => cursor.toArray())\n            .then(threads =>\n              Promise.all(\n                threads.map(thread => {\n                  return Promise.all([\n                    r\n                      .table('messages')\n                      .filter({ threadId: thread.id })\n                      .map(message => message('senderId'))\n                      .run(conn)\n                      .then(cursor => cursor.toArray())\n                      .catch(err => {\n                        console.log(err);\n                        throw err;\n                      }),\n                    thread,\n                  ]);\n                })\n              )\n            )\n            .then(threadsMessages =>\n              Promise.all(\n                threadsMessages.map(([threadSenders, thread]) => {\n                  if (!threadSenders) return Promise.resolve();\n                  let uniqueThreadSenders = threadSenders.filter(\n                    (item, i, ar) => ar.indexOf(item) === i\n                  );\n                  return Promise.all(\n                    uniqueThreadSenders.map(sender => {\n                      return r\n                        .table('usersThreads')\n                        .insert({\n                          createdAt: r.now(),\n                          isParticipant: true,\n                          receiveNotifications: true,\n                          threadId: thread.id,\n                          userId: sender,\n                        })\n                        .run(conn)\n                        .catch(err => {\n                          console.log(err);\n                          throw err;\n                        });\n                    })\n                  );\n                })\n              )\n            ),\n        ])\n      )\n      .catch(err => {\n        console.log(err);\n        throw err;\n      })\n  );\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r.tableDrop('usersThreads').run(conn),\n    r.tableDrop('usersNotifications').run(conn),\n    r.tableDrop('notifications').run(conn),\n    r\n      .table('usersCommunities')\n      .update({ receiveNotifications: r.literal() })\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .update({ receiveNotifications: r.literal() })\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20170616113103-compound-indexes-for-ordering.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    // messages#threadIdAndTimestamp\n    r\n      .table('messages')\n      .indexCreate('threadIdAndTimestamp', [\n        r.row('threadId'),\n        r.row('timestamp'),\n      ])\n      .run(conn),\n    // threads#channelIdAndLastActive\n    r\n      .table('threads')\n      .indexCreate('channelIdAndLastActive', [\n        r.row('channelId'),\n        r.row('lastActive'),\n      ])\n      .run(conn),\n    // threads#communityIdAndLastActive\n    r\n      .table('threads')\n      .indexCreate('communityIdAndLastActive', [\n        r.row('communityId'),\n        r.row('lastActive'),\n      ])\n      .run(conn),\n    // community#createdAt\n    r\n      .table('communities')\n      .indexCreate('createdAt')\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170627104435-user-email-settings.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .tableCreate('usersSettings')\n      .run(conn)\n      // Create secondary indexes\n      .then(() =>\n        // index user by username\n        r\n          .table('usersSettings')\n          .indexCreate('userId', r.row('userId'))\n          .run(conn)\n      )\n      .then(() =>\n        Promise.all([\n          // Get all user ids while we wait for the index to finish creating\n          r.table('users').withFields('id').map(user => user('id')).run(conn),\n          r.table('usersSettings').indexWait('userId').run(conn),\n        ])\n      )\n      .then(([userIds]) => userIds.toArray())\n      .then(userIds =>\n        Promise.all(\n          userIds.map(id =>\n            r\n              .table('usersSettings')\n              .insert({\n                userId: id,\n                notifications: {\n                  types: {\n                    newMessageInThreads: {\n                      email: true,\n                    },\n                  },\n                },\n              })\n              .run(conn)\n          )\n        )\n      )\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return r.tableDrop('usersSettings').run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20170701173337-linkify-messages.js",
    "content": "const markdownLinkify = require('../utils/markdown-linkify');\n\nexports.up = function(r, conn) {\n  return (\n    // Markdown linkify each message\n    r\n      .table('messages')\n      .withFields('id', 'content')\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      .then(messages =>\n        Promise.all(\n          messages.map(message =>\n            r\n              .table('messages')\n              .get(message.id)\n              .update({\n                content: {\n                  body: markdownLinkify(message.content.body),\n                },\n              })\n              .run(conn)\n          )\n        )\n      )\n  );\n};\n\nexports.down = function(r, conn) {\n  // Can't really undo just this change so we don't bother\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170702194221-fix-images.js",
    "content": "const MARKDOWN_LINK = /(?:\\[(.*?)\\]\\((.*?)\\))/g;\n\nexports.up = function(r, conn) {\n  return (\n    // The last migration fucked images up in production\n    // so this one fixes them again 😅\n    r\n      .table('messages')\n      .filter({ messageType: 'media' })\n      .withFields('id', 'content')\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      .then(messages =>\n        Promise.all(\n          messages.map(message =>\n            r\n              .table('messages')\n              .get(message.id)\n              .update({\n                content: {\n                  body: MARKDOWN_LINK.test(message.content.body)\n                    ? message.content.body.replace(MARKDOWN_LINK, '$2')\n                    : message.content.body,\n                },\n              })\n              .run(conn)\n          )\n        )\n      )\n  );\n};\n\nexports.down = function(r, conn) {\n  // Can't really undo just this change so we don't bother\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170706114239-providerfield-indexes.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('users')\n      .indexCreate('providerId')\n      .run(conn),\n    r\n      .table('users')\n      .indexCreate('fbProviderId')\n      .run(conn),\n    r\n      .table('users')\n      .indexCreate('googleProviderId')\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170706205658-slack-import.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .tableCreate('slackImports')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ])\n    .then(() =>\n      Promise.all([\n        r\n          .table('slackImports')\n          .indexCreate('communityId', r.row('communityId'))\n          .run(conn)\n          .catch(err => {\n            console.log(err);\n            throw err;\n          }),\n        r\n          .table('users')\n          .indexCreate('email', r.row('email'))\n          .run(conn),\n      ])\n    )\n    .catch(err => {\n      console.log(err);\n      throw err;\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('slackImports').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20170714171920-web-push-subscription.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .tableCreate('webPushSubscriptions')\n    .run(conn)\n    .catch(err => {\n      throw new Error(err);\n    })\n    .then(() =>\n      r\n        .table('webPushSubscriptions')\n        .indexCreate('userId')\n        .run(conn)\n    )\n    .then(() =>\n      r\n        .table('webPushSubscriptions')\n        .indexCreate('endpoint')\n        .run(conn)\n    );\n};\n\nexports.down = function(r, conn) {\n  return r\n    .tableDrop('webPushSubscriptions')\n    .run(conn)\n    .catch(err => {\n      throw new Error(err);\n    });\n};\n"
  },
  {
    "path": "api/migrations/20170724184557-notifications-entity-added-index.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersNotifications')\n      .indexCreate('userIdAndEntityAddedAt', [\n        r.row('userId'),\n        r.row('entityAddedAt'),\n      ])\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170803104302-dedupe-users-settings.js",
    "content": "const without = require('lodash/without');\n// This is taken from the Babel REPL and is what it transpiles ...arr to.\n// (can't use rest/spread in Node yet)\nfunction _toConsumableArray(arr) {\n  if (Array.isArray(arr)) {\n    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n      arr2[i] = arr[i];\n    }\n    return arr2;\n  } else {\n    return Array.from(arr);\n  }\n}\n\nexports.up = function(r, conn) {\n  // Get every UserID that has opted out of new message in threads emails\n  return (\n    r\n      .table('usersSettings')\n      .filter({\n        notifications: {\n          types: {\n            newMessageInThreads: {\n              email: false,\n            },\n          },\n        },\n      })\n      .map(rec => rec('userId'))\n      .distinct()\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      .then(optedOut => {\n        return Promise.all([\n          optedOut,\n          r\n            .table('usersSettings')\n            .filter({\n              notifications: {\n                types: {\n                  newMessageInThreads: {\n                    email: true,\n                  },\n                },\n              },\n            })\n            .map(rec => rec('userId'))\n            .distinct()\n            .run(conn)\n            .then(cursor => cursor.toArray()),\n        ]);\n      })\n      .then(([optedOut, optedIn]) => {\n        return [\n          optedOut,\n          // Remove userIds that appear in optedOut from optedIn\n          without.apply(\n            undefined,\n            [optedIn].concat(_toConsumableArray(optedOut))\n          ),\n        ];\n      })\n      // Drop the usersSettings table\n      .then(([optedOut, optedIn]) => {\n        return Promise.all([\n          optedOut,\n          optedIn,\n          r.table('usersSettings').delete().run(conn),\n        ]);\n      })\n      .then(([optedOut, optedIn]) => {\n        // Insert records of users that have opted out\n        const optedOutInsertions = optedOut.map(userId =>\n          r\n            .table('usersSettings')\n            .insert({\n              userId,\n              notifications: {\n                types: {\n                  newMessageInThreads: {\n                    email: false,\n                  },\n                  newThreadCreated: {\n                    email: true,\n                  },\n                },\n              },\n            })\n            .run(conn)\n        );\n        // Insert records of users that have opted in\n        const optedInInsertions = optedIn.map(userId =>\n          r\n            .table('usersSettings')\n            .insert({\n              userId,\n              notifications: {\n                types: {\n                  newMessageInThreads: {\n                    email: true,\n                  },\n                  newThreadCreated: {\n                    email: true,\n                  },\n                },\n              },\n            })\n            .run(conn)\n        );\n        return Promise.all(\n          [].concat(\n            _toConsumableArray(optedOutInsertions),\n            _toConsumableArray(optedInInsertions)\n          )\n        );\n      })\n  );\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170825220615-clean-recurring-payments.js",
    "content": "exports.up = function(r, conn) {\n  // get all recurring payments\n  return r\n    .table('recurringPayments')\n    .run(conn)\n    .then(cursor => cursor.toArray())\n    .then(subscriptions => {\n      // for each subscription record, map it and create a new object with a cleaner data model\n      return subscriptions.map(subscription => {\n        if (!subscription.stripeData) return subscription;\n\n        return Object.assign(\n          {},\n          {\n            id: subscription.id,\n            // userId is used to keep track of who is making payments for any subscription it is also queries against to determine if a user isPro\n            userId: subscription.userId,\n            // communityId is queried against to determine if a community isPro\n            communityId: subscription.communityId,\n            customerId: subscription.stripeData.customer,\n            subscriptionId: subscription.stripeData.id,\n            // planId and planName will determine if the user is paying for a Pro user account or for an upgraded community\n            planId: subscription.stripeData.plan.id,\n            planName: subscription.stripeData.plan.name,\n            amount: subscription.stripeData.plan.amount,\n            // rather than having multiple plans on Stripe for every possible tier of upgraded community, we can instead just stack quantities - so an upgraded community with 9k members would have a single 'pro community' record with 9 quantity that determines how much they will be billed every month\n            // when rendering subscriptions in the client, the quantity should be multiplied by the amount to determine the total cost of the subscription\n            quantity: subscription.stripeData.quantity,\n            // will be used to determine the current state of an isPro query against a user or community. When a community or user gets downgraded this field will switch from 'active' to 'canceled'\n            status: subscription.stripeData.status,\n            // the following field dates will be used for client side rendering - we will need to implement webhooks to keep the currentPeriodStart and currentPeriodEnd timestamps up to date\n            currentPeriodStart: subscription.stripeData.current_period_start,\n            currentPeriodEnd: subscription.stripeData.current_period_end,\n            createdAt: subscription.stripeData.plan.created,\n          }\n        );\n      });\n    })\n    .then(cleanSubscriptions => {\n      return Promise.all([\n        cleanSubscriptions,\n        // delete all the old records in recurringPayments table\n        r\n          .table('recurringPayments')\n          .delete()\n          .run(conn),\n        // also create a new index against communityId for faster isPro lookups on communities\n        r\n          .table('recurringPayments')\n          .indexCreate('communityId')\n          .run(conn),\n      ]);\n    })\n    .then(([cleanSubscriptions]) => {\n      // insert each new clean record into the table\n      return cleanSubscriptions.map(subscription => {\n        return r\n          .table('recurringPayments')\n          .insert({ ...subscription })\n          .run(conn);\n      });\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170829233734-userid-index-on-invoices.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('invoices')\n      .indexCreate('userId')\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170831163211-invoice-data-model-update.js",
    "content": "exports.up = function(r, conn) {\n  // get all recurring payments\n  return r\n    .table('invoices')\n    .run(conn)\n    .then(cursor => cursor.toArray())\n    .then(invoices => {\n      // for each subscription record, map it and create a new object with a cleaner data model\n      return invoices.map(invoice => {\n        if (!invoice.stripeData) return invoice;\n\n        return Object.assign(\n          {},\n          {\n            id: invoice.id,\n            amount: invoice.amount,\n            chargeId: invoice.stripeData.id,\n            communityId: invoice.communityId,\n            customerId: null,\n            paidAt: invoice.stripeData.created,\n            planId: 'community-standard',\n            planName: 'Spectrum Standard Community',\n            quantity: 1,\n            sourceBrand: invoice.stripeData.source.brand,\n            sourceLast4: invoice.stripeData.source.last4,\n            status: 'paid',\n            subscriptionId: null,\n            userId: null,\n          }\n        );\n      });\n    })\n    .then(cleanInvoices => {\n      return Promise.all([\n        cleanInvoices,\n        // delete all the old records in recurringPayments table\n        r\n          .table('invoices')\n          .delete()\n          .run(conn),\n      ]);\n    })\n    .then(([cleanInvoices]) => {\n      // insert each new clean record into the table\n      return cleanInvoices.map(invoice => {\n        return r\n          .table('invoices')\n          .insert(invoice)\n          .run(conn);\n      });\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170907222544-digest-email-notification-settings.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      .then(settings => {\n        return settings.map(setting => {\n          return Object.assign(\n            {},\n            {\n              ...setting,\n              notifications: {\n                types: {\n                  newMessageInThreads: {\n                    email: setting.notifications.types.newMessageInThreads\n                      ? setting.notifications.types.newMessageInThreads.email\n                      : true,\n                  },\n                  newThreadCreated: {\n                    email: setting.notifications.types.newThreadCreated\n                      ? setting.notifications.types.newThreadCreated.email\n                      : true,\n                  },\n                  newDirectMessage: {\n                    email: setting.notifications.types.newDirectMessage\n                      ? setting.notifications.types.newDirectMessage.email\n                      : true,\n                  },\n                  weeklyDigest: {\n                    email: true,\n                  },\n                  dailyDigest: {\n                    email: true,\n                  },\n                },\n              },\n            }\n          );\n        });\n      })\n      .then(newSettings => {\n        return Promise.all([\n          newSettings,\n          // delete all the old records\n          r\n            .table('usersSettings')\n            .delete()\n            .run(conn),\n        ]);\n      })\n      .then(([newSettings]) => {\n        // insert each new clean record into the table\n        return newSettings.map(setting => {\n          return r\n            .table('usersSettings')\n            .insert({ ...setting })\n            .run(conn);\n        });\n      })\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170908230623-add-reputation-field-to-communities.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .update({\n        reputation: 1,\n      })\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n    r\n      .tableCreate('reputationEvents')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ]).then(() => {\n    // create a compound index to easily fetch all reputation events in chronological order\n    return Promise.all([\n      r\n        .table('reputationEvents')\n        .indexCreate('userIdAndTimestamp', [\n          r.row('userId'),\n          r.row('timestamp'),\n        ])\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        }),\n    ]);\n  });\n};\n\nexports.down = function(r, conn) {\n  return r\n    .tableDrop('reputationEvents')\n    .run(conn)\n    .catch(err => {\n      console.log(err);\n      throw err;\n    });\n};\n"
  },
  {
    "path": "api/migrations/20170912000619-backfill-rep.js",
    "content": "exports.up = function(r, conn) {\n  const updateReputation = (userId, communityId, score, type) => {\n    return r\n      .table('usersCommunities')\n      .getAll(userId, { index: 'userId' })\n      .filter({ communityId })\n      .update({\n        reputation: r.row('reputation').add(score),\n      })\n      .run(conn)\n      .then(() => {\n        return r\n          .table('reputationEvents')\n          .insert({\n            timestamp: new Date(),\n            userId,\n            type,\n            communityId,\n            score,\n          })\n          .run(conn);\n      });\n  };\n\n  return r\n    .table('threads')\n    .filter(row => row.hasFields('deletedAt').not())\n    .run(conn)\n    .then(cursor => cursor.toArray())\n    .then(threads => {\n      const threadPromises = threads.map(thread => {\n        return updateReputation(\n          thread.creatorId,\n          thread.communityId,\n          100,\n          'thread created'\n        );\n      });\n\n      return Promise.all(threadPromises);\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170915201609-clean-up-bad-dm-data.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('messages')\n      .filter({ threadType: 'DIRECT_MESSAGE_GROUP' })\n      .update({\n        threadType: 'directMessageThread',\n      })\n      .run(conn),\n    r\n      .table('messages')\n      .filter({ threadType: 'STORY' })\n      .update({\n        threadType: 'story',\n      })\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170926003025-activate-daily-weekly-digest-settings.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .update({\n        notifications: {\n          types: {\n            dailyDigest: {\n              email: true,\n            },\n            weeklyDigest: {\n              email: true,\n            },\n          },\n        },\n      })\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170926102527-speedy-gonzales.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .indexCreate('userIdAndCommunityId', [\n        r.row('userId'),\n        r.row('communityId'),\n      ])\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170927002438-communityid-index-on-reputation-events.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('reputationEvents')\n      .indexCreate('communityId')\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20170928143435-slate-to-draftjs.js.js",
    "content": "const compose = require('redux/lib/compose').default;\nconst { convertToRaw, genKey } = require('draft-js');\nconst { stateFromMarkdown } = require('draft-js-import-markdown');\nconst isHtml = require('is-html');\nconst cheerio = require('cheerio');\nconst { toPlainText, toState } = require('../../shared/slate-utils');\n\nconst convertEmbeds = state => {\n  const entityMap = state.entityMap || {};\n  const blocks = state.blocks.map(block => {\n    if (block.type !== 'unstyled') return block;\n    if (!isHtml(block.text)) return block;\n\n    const $ = cheerio.load(block.text);\n    const iframe = $('iframe')[0];\n\n    if (!iframe) return block;\n\n    const src = $(iframe).attr('src');\n    const height = $(iframe).attr('height');\n    const width = $(iframe).attr('width');\n\n    if (!src) return block;\n\n    const keys = Object.keys(entityMap).map(key => parseInt(key, 10));\n    const lastKey = keys.sort()[keys.length - 1];\n    const newKey = lastKey === undefined ? 0 : lastKey + 1;\n\n    entityMap[newKey] = {\n      data: { src, height, width },\n      mutability: 'IMMUTABLE',\n      type: 'embed',\n    };\n\n    return {\n      data: {},\n      depth: 0,\n      entityRanges: [\n        {\n          key: newKey,\n          offset: 0,\n          length: 1,\n        },\n      ],\n      inlineStyleRanges: [],\n      key: genKey(),\n      text: ' ',\n      type: 'atomic',\n    };\n  });\n\n  return {\n    ...state,\n    entityMap,\n    blocks,\n  };\n};\n\nconst plainToDraft = compose(\n  JSON.stringify,\n  convertEmbeds,\n  convertToRaw,\n  stateFromMarkdown\n);\n\nconst slateToDraft = compose(plainToDraft, toPlainText, toState, JSON.parse);\n\nexports.up = function(r, conn) {\n  return (\n    r\n      .table('threads')\n      .filter(thread =>\n        r.not(thread.hasFields('type')).or(thread('type').ne('DRAFTJS'))\n      )\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      // Transform slate state to draftjs state\n      .then(threads =>\n        threads.map(thread =>\n          Object.assign({}, thread, {\n            type: 'DRAFTJS',\n            content: Object.assign({}, thread.content, {\n              body:\n                thread.type === 'SLATE'\n                  ? slateToDraft(thread.content.body)\n                  : plainToDraft(thread.content.body),\n            }),\n          })\n        )\n      )\n      // Store the transformed threads\n      .then(threads =>\n        Promise.all(\n          threads.map(thread =>\n            r\n              .table('threads')\n              .get(thread.id)\n              .update(thread)\n              .run(conn)\n          )\n        )\n      )\n  );\n};\n\nexports.down = function(r, conn) {\n  // Not spending any time undoing this\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171005075445-remove-markdown-links-from-messages.js",
    "content": "const replace = require('string-replace-to-array');\nconst MARKDOWN_LINK = /(?:\\[(.*?)\\]\\((.*?)\\))/g;\n\nconst removeMarkdownLinks = text => {\n  if (!text || typeof text !== 'string') return text;\n  return replace(text, MARKDOWN_LINK, (fullLink, text, url) => url).join('');\n};\n\nexports.up = function(r, conn) {\n  return r\n    .table('messages')\n    .withFields('id', 'content')\n    .run(conn)\n    .then(cursor => cursor.toArray())\n    .then(messages =>\n      Promise.all(\n        messages.map(message =>\n          r\n            .table('messages')\n            .get(message.id)\n            .update({\n              content: {\n                body: removeMarkdownLinks(message.content.body),\n              },\n            })\n            .run(conn)\n        )\n      )\n    );\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171008101118-last-slate-to-draft.js",
    "content": "const compose = require('redux/lib/compose').default;\nconst { convertToRaw, genKey } = require('draft-js');\nconst { stateFromMarkdown } = require('draft-js-import-markdown');\nconst isHtml = require('is-html');\nconst cheerio = require('cheerio');\nconst { toPlainText, toState } = require('../../shared/slate-utils');\n\nconst convertEmbeds = state => {\n  const entityMap = state.entityMap || {};\n  const blocks = state.blocks.map(block => {\n    if (block.type !== 'unstyled') return block;\n    if (!isHtml(block.text)) return block;\n\n    const $ = cheerio.load(block.text);\n    const iframe = $('iframe')[0];\n\n    if (!iframe) return block;\n\n    const src = $(iframe).attr('src');\n    const height = $(iframe).attr('height');\n    const width = $(iframe).attr('width');\n\n    if (!src) return block;\n\n    const keys = Object.keys(entityMap).map(key => parseInt(key, 10));\n    const lastKey = keys.sort()[keys.length - 1];\n    const newKey = lastKey === undefined ? 0 : lastKey + 1;\n\n    entityMap[newKey] = {\n      data: { src, height, width },\n      mutability: 'IMMUTABLE',\n      type: 'embed',\n    };\n\n    return {\n      data: {},\n      depth: 0,\n      entityRanges: [\n        {\n          key: newKey,\n          offset: 0,\n          length: 1,\n        },\n      ],\n      inlineStyleRanges: [],\n      key: genKey(),\n      text: ' ',\n      type: 'atomic',\n    };\n  });\n\n  return {\n    ...state,\n    entityMap,\n    blocks,\n  };\n};\n\nconst plainToDraft = compose(\n  JSON.stringify,\n  convertEmbeds,\n  convertToRaw,\n  stateFromMarkdown\n);\n\nconst slateToDraft = compose(plainToDraft, toPlainText, toState, JSON.parse);\n\nexports.up = function(r, conn) {\n  return (\n    r\n      .table('threads')\n      .filter({\n        type: 'SLATE',\n      })\n      .run(conn)\n      .then(cursor => cursor.toArray())\n      // Transform slate state to draftjs state\n      .then(threads =>\n        threads.map(thread =>\n          Object.assign({}, thread, {\n            type: 'DRAFTJS',\n            content: Object.assign({}, thread.content, {\n              body: slateToDraft(thread.content.body),\n            }),\n          })\n        )\n      )\n      // Store the transformed threads\n      .then(threads =>\n        Promise.all(\n          threads.map(thread =>\n            r\n              .table('threads')\n              .get(thread.id)\n              .update(thread)\n              .run(conn)\n          )\n        )\n      )\n  );\n};\n\nexports.down = function(r, conn) {\n  // Not spending any time undoing this\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171013195530-core-metrics-table.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .tableCreate('coreMetrics')\n      .run(conn)\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ])\n    .then(() => {\n      return r\n        .table('coreMetrics')\n        .indexCreate('date', r.row('date'))\n        .run(conn)\n        .catch(err => {\n          console.log(err);\n          throw err;\n        });\n    })\n    .then(() => {\n      const saveCoreMetrics = (data, index) => {\n        const d = new Date();\n        d.setDate(d.getDate() - index);\n        return r\n          .table('coreMetrics')\n          .insert({\n            date: d,\n            ...data,\n          })\n          .run(conn);\n      };\n\n      const getCount = (table, filter, index, field) => {\n        if (filter) {\n          return r\n            .table(table)\n            .filter(filter)\n            .filter(\n              r.row(field).during(\n                // go back to all time, for some reason minval isn't working\n                r.now().sub(60 * 60 * 24 * 10000),\n                r.now().sub(60 * 60 * 24 * index)\n              )\n            )\n            .filter(row => r.not(row.hasFields('deletedAt')))\n            .count()\n            .run(conn);\n        }\n\n        return r\n          .table(table)\n          .filter(\n            r.row(field).during(\n              // go back to all time, for some reason minval isn't working\n              r.now().sub(60 * 60 * 24 * 10000),\n              r.now().sub(60 * 60 * 24 * index)\n            )\n          )\n          .filter(row => r.not(row.hasFields('deletedAt')))\n          .count()\n          .run(conn);\n      };\n\n      // cpu, tpu, mpu\n      const getPu = (table, field, index) => {\n        // get the count of the users within a given range\n        return getCount('users', null, index, 'createdAt')\n          .then(userCount => {\n            // get the count of whatever entity within a given range\n            const tableCount = r\n              .table(table)\n              .filter(\n                r.row(field).during(\n                  // go back to all time, for some reason minval isn't working\n                  r.now().sub(60 * 60 * 24 * 10000),\n                  r.now().sub(60 * 60 * 24 * index)\n                )\n              )\n              .filter(row => r.not(row.hasFields('deletedAt')))\n              .count()\n              .run(conn);\n\n            return Promise.all([userCount, tableCount]);\n          })\n          .then(([userCount, tableCount]) => {\n            return parseFloat((tableCount / userCount).toFixed(3));\n          });\n      };\n\n      // array of 30 things\n      const arr = Array.apply(null, { length: 60 }).map(() => 0);\n      const backfill = arr.map((o, i) => {\n        const cpu = getPu('usersCommunities', 'createdAt', i);\n        const mpu = getPu('messages', 'timestamp', i);\n        const tpu = getPu('threads', 'createdAt', i);\n        const users = getCount('users', null, i, 'createdAt');\n        const communities = getCount('communities', null, i, 'createdAt');\n        const threads = getCount('threads', null, i, 'createdAt');\n        const dmThreads = getCount(\n          'directMessageThreads',\n          null,\n          i,\n          'createdAt'\n        );\n        const threadMessages = getCount(\n          'messages',\n          { threadType: 'story' },\n          i,\n          'timestamp'\n        );\n        const dmMessages = getCount(\n          'messages',\n          {\n            threadType: 'directMessageThread',\n          },\n          i,\n          'timestamp'\n        );\n\n        return Promise.all([\n          cpu,\n          mpu,\n          tpu,\n          users,\n          communities,\n          threads,\n          dmThreads,\n          threadMessages,\n          dmMessages,\n        ]).then(\n          ([\n            cpu,\n            mpu,\n            tpu,\n            users,\n            communities,\n            threads,\n            dmThreads,\n            threadMessages,\n            dmMessages,\n          ]) => {\n            const coreMetrics = {\n              cpu: cpu || 0,\n              mpu: mpu || 0,\n              tpu: tpu || 0,\n              users: users || 0,\n              communities: communities || 0,\n              threads: threads || 0,\n              dmThreads: dmThreads || 0,\n              threadMessages: threadMessages || 0,\n              dmMessages: dmMessages || 0,\n            };\n            return saveCoreMetrics(coreMetrics, i);\n          }\n        );\n      });\n\n      return Promise.all(backfill);\n    })\n    .catch(err => {\n      console.log(err);\n      throw err;\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('coreMetrics').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20171018235659-add-direst-message-user-settings.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .update({\n        notifications: {\n          types: {\n            newDirectMessage: {\n              email: true,\n            },\n          },\n        },\n      })\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171029090619-users-channels-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('usersChannels')\n    .indexCreate('userIdAndChannelId', [r.row('userId'), r.row('channelId')])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersChannels')\n    .indexDrop('userIdAndChannelId')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20171029094352-users-threads-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('usersThreads')\n    .indexCreate('userIdAndThreadId', [r.row('userId'), r.row('threadId')])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersThreads')\n    .indexDrop('userIdAndThreadId')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20171103014955-add-mention-notification-settings.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .update({\n        notifications: {\n          types: {\n            newMention: {\n              email: true,\n            },\n          },\n        },\n      })\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171129215512-index-communities-by-slug.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('communities')\n      .indexCreate('slug')\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171129221050-curated-content-table-creation.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .tableCreate('curatedContent')\n      .run(conn)\n      .then(() => {\n        const types = [\n          {\n            type: 'design-communities',\n            data: [\n              'product-design',\n              'icon-design',\n              'typography',\n              'illustrators',\n              'design-management',\n              'specfm',\n              'up-coming',\n              'sketchcasts',\n              'google-design',\n              'design-code',\n              'vectors',\n              'designhunt',\n              'figma',\n              'sketch',\n              'framer',\n              'abstract',\n              'invision',\n              'principle',\n              'compositor',\n              'origami-studio',\n              'webflow',\n              'fuse',\n            ],\n          },\n          {\n            type: 'development-communities',\n            data: [\n              'realm',\n              'expo',\n              'compositor',\n              'codepen',\n              'bootstrap',\n              'tachyons',\n              'frontend',\n              'specfm',\n              'android',\n              'swiftdev',\n              'react-native',\n              'react',\n              'node',\n              'vue-js',\n              'angular',\n              'ember-js',\n              'laravel',\n              'elixir',\n              'styled-components',\n              'graphql',\n              'css-in-js',\n              'electron',\n            ],\n          },\n          {\n            type: 'tech-communities',\n            data: [\n              'tech-tea',\n              'balancemymoney',\n              'crypto',\n              'btc',\n              'ethereum',\n              'augmented-reality',\n              'voice-interfaces',\n            ],\n          },\n          {\n            type: 'life-communities',\n            data: [\n              'for-good',\n              'mental-health',\n              'dev-fit',\n              'music',\n              'tabletop-rpg',\n              'gaming',\n              'careers',\n              'job-opportunities',\n              'need-some-work',\n            ],\n          },\n          {\n            type: 'top-communities-by-members',\n            data: [\n              'spectrum',\n              'sketch',\n              'react',\n              'specfm',\n              'product-design',\n              'figma',\n              'styled-components',\n              'framer',\n              'frontend',\n              'google-design',\n              'wip',\n              'abstract',\n              'vectors',\n              'crypto',\n              'sketchcasts',\n              'bootstrap',\n              'css-in-js',\n              'ooohours',\n              'tech-tea',\n              'design-code',\n            ],\n          },\n        ];\n\n        const insertPromises = types.map(type => {\n          return r\n            .table('curatedContent')\n            .insert(type)\n            .run(conn);\n        });\n\n        return Promise.all([insertPromises]);\n      })\n      .catch(err => {\n        console.log(err);\n        throw err;\n      }),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('curatedContent').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20171208175038-index-users-for-search.js",
    "content": "require('now-env');\n// const initIndex = require('../../shared/algolia');\n// const searchIndex = initIndex('users');\n\nexports.up = function(r, conn) {\n  return Promise.resolve();\n  // return r\n  //   .table('users')\n  //   .filter(user => user.hasFields('username'))\n  //   .run(conn)\n  //   .then(cursor => cursor.toArray())\n  //   .then(users =>\n  //     users.map(user => ({\n  //       name: user.name,\n  //       username: user.username,\n  //       description: user.description,\n  //       website: user.website,\n  //       objectID: user.id,\n  //     }))\n  //   )\n  //   .then(searchableUsers => {\n  //     return;\n  //     // return searchIndex.addObjects(searchableUsers)\n  //   })\n  //   .catch(err => console.log(err));\n};\n\nexports.down = function(r, conn) {\n  // Not spending any time undoing this\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171208180800-index-communities-for-search.js",
    "content": "require('now-env');\n// const initIndex = require('../../shared/algolia');\n// const searchIndex = initIndex('communities');\n\nexports.up = function(r, conn) {\n  return Promise.resolve();\n  // return r\n  //   .table('communities')\n  //   .filter(community => community.hasFields('deletedAt').not())\n  //   .run(conn)\n  //   .then(cursor => cursor.toArray())\n  //   .then(communities =>\n  //     communities.map(community => ({\n  //       description: community.description,\n  //       name: community.name,\n  //       slug: community.slug,\n  //       website: community.website ? community.website : null,\n  //       objectID: community.id,\n  //     }))\n  //   )\n  //   .then(searchableCommunities => {\n  //     return;\n  //     // searchIndex.addObjects(searchableCommunities)\n  //   })\n  //   .catch(err => console.log(err));\n};\n\nexports.down = function(r, conn) {\n  // Not spending any time undoing this\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20171213002813-add-modified-at-field-to-users-and-communities.js",
    "content": "exports.up = function(r, conn) {\n  /*\n\n    We are adding a modifiedAt field on users and communities for 2 key reasons:\n    1. By having a single field that changes as edits happen, it makes changefeeds\n       much easier to follow because we only ever have to filter by the change\n       on a single field (versus for watching for changes on many potentially-nested fields)\n       like content.title or content.body. Because users and communities can have many\n       different fields modified, in any random combination, it will make our lives\n       easier to add a single `modifiedAt` field that we update whenever an edit occurs.\n       Then, in the changefeed, we don't have to care about *what* changed, only\n       that something changed, and we can handle downstream events (like re-indexing in\n      search results)\n    2. It's probably good practice anyways to keep track of when things are updated. Since\n       we don't have a universal event stream, this is an incremental step towards having\n       more complete knowledge about when things are being changed or deleted in the database,\n       which thus makes it easier for us to trace down replayable events should a server\n       crash. E.g. we can know that if a worker crashed, there were 10 users who updated\n       their profiles during the downtime based on the `modifiedAt` field \n\n  */\n  return Promise.all([\n    r\n      .table('users')\n      .update({\n        modifiedAt: new Date(),\n      })\n      .run(conn),\n    r\n      .table('communities')\n      .update({\n        modifiedAt: new Date(),\n      })\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('users')\n      .update({\n        modifiedAt: r.literal(),\n      })\n      .run(conn),\n    r\n      .table('communities')\n      .update({\n        modifiedAt: r.literal(),\n      })\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20180209015734-github-provider-id-index.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('users')\n      .indexCreate('githubProviderId')\n      .run(conn),\n  ]).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20180214111357-expo-push-subscriptions.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .tableCreate('expoPushSubscriptions')\n    .run(conn)\n    .then(() =>\n      r\n        .table('expoPushSubscriptions')\n        .indexCreate('userId')\n        .run(conn)\n    )\n    .then(() =>\n      r\n        .table('expoPushSubscriptions')\n        .indexCreate('token')\n        .run(conn)\n    )\n    .catch(err => {\n      throw new Error(err);\n    });\n};\n\nexports.down = function(r, conn) {\n  return r\n    .tableDrop('expoPushSubscriptions')\n    .run(conn)\n    .catch(err => {\n      throw new Error(err);\n    });\n};\n"
  },
  {
    "path": "api/migrations/20180309144845-create-community-settings-table.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .tableCreate('communitySettings')\n    .run(conn)\n    .then(() =>\n      r\n        .table('communitySettings')\n        .indexCreate('communityId', r.row('communityId'))\n        .run(conn)\n    )\n    .catch(err => {\n      console.log(err);\n      throw err;\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('communitySettings').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20180316195507-create-channel-settings-table.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .tableCreate('channelSettings')\n    .run(conn)\n    .then(() =>\n      r\n        .table('channelSettings')\n        .indexCreate('channelId', r.row('channelId'))\n        .run(conn)\n    )\n    .catch(err => {\n      console.error(err);\n      throw err;\n    });\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('channelSettings').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20180320122000-create-stripe-tables.js",
    "content": "exports.up = function(r, conn) {\n  const createCustomersTable = () =>\n    r.tableCreate('stripeCustomers', { primaryKey: 'customerId' }).run(conn);\n  const createInvoicesTable = () =>\n    r.tableCreate('stripeInvoices', { primaryKey: 'invoiceId' }).run(conn);\n\n  return Promise.all([createCustomersTable(), createInvoicesTable()])\n    .then(() =>\n      Promise.all([\n        r\n          .table('stripeInvoices')\n          .indexCreate('customerId')\n          .run(conn),\n      ])\n    )\n    .catch(err => console.log(err));\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r.tableDrop('stripeCustomers').run(conn),\n    r.tableDrop('stripeInvoices').run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20180320173414-set-administrator-info-on-community.js",
    "content": "exports.up = async (r, conn) => {\n  const addFields = r\n    .table('communities')\n    .update({\n      // a distinct email for each community where receipts and admin\n      // messages will be sent, can be different from the owner's personal\n      // email\n      administratorEmail: null,\n      // references the actual creator of the community, discrete from the 'owner'\n      // role\n      creatorId: null,\n      // will be used to fetch records from the stripeCustomers and stripeInvoices\n      // tables in order to populate the billing area and resolve query fields\n      // for community features\n      stripeCustomerId: null,\n      // these are two feature flags that pluto will listen to changes for in\n      // order to trigger billing events\n      analyticsEnabled: false,\n      prioritySupportEnabled: false,\n    })\n    .run(conn);\n\n  // gets all the owner records in a community, figures out which one is the oldest,\n  // then uses that record to populate an administratorEmail and creatorId field\n  // if they exist\n  const oldestOwners = await r\n    .table('usersCommunities')\n    .filter({ isOwner: true })\n    .group('communityId')\n    .ungroup()\n    .map(row => row('reduction'))\n    .map(row => row.min('createdAt'))\n    .eqJoin('userId', r.table('users'))\n    .zip()\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const setAdminFields = oldestOwners.map(async owner => {\n    if (!owner || !owner.userId || !owner.communityId) return;\n    return await r\n      .table('communities')\n      .get(owner.communityId)\n      .update({\n        administratorEmail: owner.email,\n        creatorId: owner.userId,\n      })\n      .run(conn);\n  });\n\n  return Promise.all([addFields]).then(\n    async () => await Promise.all(setAdminFields)\n  );\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('communities')\n    .update({\n      administratorEmail: r.literal(),\n      creatorId: r.literal(),\n      stripeCustomerId: r.literal(),\n      analyticsEnabled: r.literal(),\n      prioritySupportEnabled: r.literal(),\n    })\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20180411183454-lowercase-all-the-slugs.js",
    "content": "exports.up = async (r, conn) => {\n  return Promise.all([\n    r\n      .table('users')\n      .update({\n        username: r.row('username').downcase(),\n        email: r.row('email').downcase(),\n      })\n      .run(conn),\n    r\n      .table('communities')\n      .update({\n        slug: r.row('slug').downcase(),\n      })\n      .run(conn),\n    r\n      .table('channels')\n      .update({\n        slug: r.row('slug').downcase(),\n      })\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20180428001543-reset-slack-import-records.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('slackImports')\n      .update({\n        members: r.literal(),\n      })\n      .run(conn),\n  ]).catch(err => console.error(err));\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20180504003702-encrypt-existing-slack-data.js",
    "content": "const { encryptString } = require('../../shared/encryption');\n\nexports.up = async (r, conn) => {\n  const encryptOldSlackImportData = async () => {\n    const records = await r\n      .table('slackImports')\n      .run(conn)\n      .then(cursor => cursor.toArray());\n\n    const recordPromises = records.map(async record => {\n      const teamId = encryptString(record.teamId);\n      const teamName = encryptString(record.teamName);\n      const token = encryptString(record.token);\n\n      return await r\n        .table('slackImports')\n        .get(record.id)\n        .update({\n          teamId,\n          teamName,\n          token,\n        })\n        .run(conn);\n    });\n\n    return await Promise.all([...recordPromises]);\n  };\n\n  const encryptNewSlackImportData = async () => {\n    const records = await r\n      .table('communitySettings')\n      .filter(row => row.hasFields('slackSettings'))\n      .run(conn)\n      .then(cursor => cursor.toArray());\n\n    const recordPromises = records.map(async record => {\n      const teamId = encryptString(record.slackSettings.teamId);\n      const teamName = encryptString(record.slackSettings.teamName);\n      const token = encryptString(record.slackSettings.token);\n      const scope = encryptString(record.slackSettings.scope);\n\n      return await r\n        .table('communitySettings')\n        .get(record.id)\n        .update({\n          slackSettings: {\n            teamId,\n            teamName,\n            token,\n            scope,\n          },\n        })\n        .run(conn);\n    });\n\n    return await Promise.all([...recordPromises]);\n  };\n\n  return await Promise.all([\n    encryptOldSlackImportData(),\n    encryptNewSlackImportData(),\n  ]).catch(err => console.error(err));\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20180517180716-enable-private-communities.js",
    "content": "exports.up = async (r, conn) => {\n  return r\n    .table('communities')\n    .update({\n      isPrivate: false,\n    })\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('communities')\n    .update({\n      isPrivate: r.literal(),\n    })\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20180517215503-add-ispending-to-userscommunities.js",
    "content": "exports.up = async (r, conn) => {\n  return r\n    .table('usersCommunities')\n    .update({\n      isPending: false,\n    })\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersCommunities')\n    .update({\n      isPending: r.literal(),\n    })\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20180518135040-add-join-settings-to-community-settings.js",
    "content": "exports.up = async (r, conn) => {\n  return r\n    .table('communitySettings')\n    .update({\n      joinSettings: {\n        tokenJoinEnabled: false,\n        token: null,\n      },\n    })\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('communitySettings')\n    .update({\n      joinSettings: r.literal(),\n    })\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20180621001409-thread-likes-table.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .tableCreate('threadReactions')\n    .run(conn)\n    .then(() => {\n      return Promise.all([\n        r\n          .table('threadReactions')\n          .indexCreate('threadId')\n          .run(conn),\n        r\n          .table('threadReactions')\n          .indexCreate('userId')\n          .run(conn),\n      ]);\n    })\n    .catch(err => console.error(err));\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([r.tableDrop('threadReactions').run(conn)]);\n};\n"
  },
  {
    "path": "api/migrations/20180823115847-add-users-communities-indexes.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .indexCreate('communityIdAndIsMember', [\n        r.row('communityId'),\n        r.row('isMember'),\n      ])\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexCreate('communityIdAndIsMemberAndReputation', [\n        r.row('communityId'),\n        r.row('isMember'),\n        r.row('reputation'),\n      ])\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexCreate('communityIdAndIsModerator', [\n        r.row('communityId'),\n        r.row('isModerator'),\n      ])\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexCreate('communityIdAndIsOwner', [\n        r.row('communityId'),\n        r.row('isOwner'),\n      ])\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexCreate('communityIdAndIsTeamMember', [\n        r.row('communityId'),\n        r.row('isOwner').or(r.row('isModerator')),\n      ])\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .indexDrop('communityIdAndIsMember')\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexDrop('communityIdAndIsModerator')\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexDrop('communityIdAndIsOwner')\n      .run(conn),\n    r\n      .table('usersCommunities')\n      .indexDrop('communityIdAndIsTeamMember')\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20181001061156-thread-metadata-denormalization.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('threads')\n    .update(\n      {\n        messageCount: r\n          .table('messages')\n          .getAll(r.row('id'), { index: 'threadId' })\n          .count()\n          .default(0),\n        reactionCount: r\n          .table('threadReactions')\n          .getAll(r.row('id'), { index: 'threadId' })\n          .count()\n          .default(0),\n      },\n      {\n        nonAtomic: true,\n      }\n    )\n    .run(conn)\n    .then(() => {\n      return Promise.all([\n        r\n          .table('threads')\n          .indexCreate('messageCount')\n          .run(conn),\n        r\n          .table('threads')\n          .indexCreate('reactionCount')\n          .run(conn),\n      ]);\n    })\n    .catch(err => console.error(err));\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('threads')\n    .update({\n      messageCount: r.literal(),\n      reactionCount: r.literal(),\n    })\n    .run(conn)\n    .then(() => {\n      return Promise.all([\n        r\n          .table('threads')\n          .indexDrop('messageCount')\n          .run(conn),\n        r\n          .table('threads')\n          .indexDrop('reactionCount')\n          .run(conn),\n      ]);\n    });\n};\n"
  },
  {
    "path": "api/migrations/20181001064151-fix-thread-metadata-message-counts.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('threads')\n    .update(\n      {\n        messageCount: r\n          .table('messages')\n          .getAll(r.row('id'), { index: 'threadId' })\n          .filter(row => r.not(row.hasFields('deletedAt')))\n          .count()\n          .default(0),\n        reactionCount: r\n          .table('threadReactions')\n          .getAll(r.row('id'), { index: 'threadId' })\n          .filter(row => r.not(row.hasFields('deletedAt')))\n          .count()\n          .default(0),\n      },\n      {\n        nonAtomic: true,\n      }\n    )\n    .run(conn)\n    .catch(err => console.error(err));\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181002060237-remove-payments.js",
    "content": "exports.up = async (r, conn) => {\n  const betaSupporterIds = await r\n    .db('spectrum')\n    .table('recurringPayments')\n    .filter({ planId: 'beta-pro' })\n    .map(row => row('userId'))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const addSupporterFieldToUsersPromises = async () =>\n    await r\n      .db('spectrum')\n      .table('users')\n      .getAll(...betaSupporterIds)\n      .update({\n        betaSupporter: true,\n      })\n      .run(conn);\n\n  const cleanCommunitiesModel = () =>\n    r\n      .table('communities')\n      .update({\n        stripeCustomerId: r.literal(),\n        analyticsEnabled: r.literal(),\n        prioritySupportEnabled: r.literal(),\n        ossVerified: r.literal(),\n      })\n      .run(conn);\n\n  return await Promise.all([\n    cleanCommunitiesModel(),\n    addSupporterFieldToUsersPromises(),\n  ]);\n};\n\nexports.down = async (r, conn) => {\n  return await Promise.all([\n    r\n      .db('spectrum')\n      .table('communities')\n      .update({\n        stripeCustomerId: null,\n        analyticsEnabled: false,\n        prioritySupportEnabled: false,\n        ossVerified: false,\n      })\n      .run(conn),\n    r\n      .db('spectrum')\n      .table('users')\n      .update({\n        betaSupporter: r.literal(),\n      })\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20181003233411-thread-reactions-useridandthreadid-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('threadReactions')\n    .indexCreate('userIdAndThreadId', [r.row('userId'), r.row('threadId')])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('threadReactions')\n    .indexDrop('userIdAndThreadId')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181004222636-denormalize-channel-community-member-counts.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('communities')\n      .update(\n        {\n          memberCount: r\n            .table('usersCommunities')\n            .getAll(r.row('id'), { index: 'communityId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n    r\n      .table('channels')\n      .update(\n        {\n          memberCount: r\n            .table('usersChannels')\n            .getAll(r.row('id'), { index: 'channelId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n  ]).catch(err => console.error(err));\n};\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('communities')\n      .update({\n        memberCount: r.literal(),\n      })\n      .run(conn),\n    r\n      .table('channels')\n      .update({\n        memberCount: r.literal(),\n      })\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20181005143053-users-notifications-useridandnotificationid-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('usersNotifications')\n    .indexCreate('userIdAndNotificationId', [\n      r.row('userId'),\n      r.row('notificationId'),\n    ])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersNotifications')\n    .indexDrop('userIdAndNotificationId')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181005144259-users-notifications-userIdAndIsSeen-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('usersNotifications')\n    .indexCreate('userIdAndIsSeen', [r.row('userId'), r.row('isSeen')])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersNotifications')\n    .indexDrop('userIdAndIsSeen')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181023160027-update-denormalized-member-counts.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('communities')\n      .update(\n        {\n          memberCount: r\n            .table('usersCommunities')\n            .getAll(r.row('id'), { index: 'communityId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n    r\n      .table('channels')\n      .update(\n        {\n          memberCount: r\n            .table('usersChannels')\n            .getAll(r.row('id'), { index: 'channelId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n  ]).catch(err => console.error(err));\n};\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181024173616-indexes-for-digests.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .indexCreate(\n        'weeklyDigestEmail',\n        r.row('notifications')('types')('weeklyDigest')('email')\n      )\n      .run(conn),\n    r\n      .table('usersSettings')\n      .indexCreate(\n        'dailyDigestEmail',\n        r.row('notifications')('types')('dailyDigest')('email')\n      )\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersSettings')\n      .indexDrop('weeklyDigestEmail')\n      .run(conn),\n    r\n      .table('usersSettings')\n      .indexDrop('dailyDigestEmail')\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20181027050052-remove-attachments-from-thread-model.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('threads')\n      .update({\n        attachments: r.literal(),\n      })\n      .run(conn),\n  ]).catch(err => console.error(err));\n};\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181102025454-fix-old-image-urls-in-messages.js",
    "content": "exports.up = async function(r, conn) {\n  const messages = await r\n    .db('spectrum')\n    .table('messages')\n    .filter({ messageType: 'media' })\n    .filter(row => row('timestamp').lt(r.epochTime(1540929600)))\n    .filter(row => row('content')('body').match('spectrum.imgix.net'))\n    .filter(row => row('content')('body').match('%20'))\n    .filter(row => row.hasFields('deletedAt').not())\n    .map(row => ({ id: row('id'), url: row('content')('body') }))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const messagePromises = messages.map(async obj => {\n    return await r\n      .db('spectrum')\n      .table('messages')\n      .get(obj.id)\n      .update({\n        content: {\n          body: decodeURIComponent(obj.url),\n        },\n        imageReplaced: new Date(),\n      })\n      .run(conn);\n  });\n\n  return await Promise.all(messagePromises);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181102040518-fix-old-image-urls-in-threads.js",
    "content": "exports.up = async function(r, conn) {\n  const threads = await r\n    .db('spectrum')\n    .table('threads')\n    .filter(row => row('modifiedAt').lt(r.epochTime(1540929600)))\n    .filter(row => row('content')('body').match('spectrum.imgix.net'))\n    .filter(row => row('content')('body').match('%20'))\n    .filter(row => row.hasFields('deletedAt').not())\n    .map(row => ({ id: row('id'), body: row('content')('body') }))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const threadPromises = threads.map(async obj => {\n    const newBody = JSON.parse(obj.body);\n\n    const imageKeys = Object.keys(newBody.entityMap).filter(\n      key => newBody.entityMap[key].type.toLowerCase() === 'image'\n    );\n\n    const LEGACY_PREFIX = 'https://spectrum.imgix.net/';\n    const hasLegacyPrefix = url => url.startsWith(LEGACY_PREFIX, 0);\n    const stripLegacyPrefix = url => url.replace(LEGACY_PREFIX, '');\n\n    const processImageUrl = str => {\n      if (str.indexOf(LEGACY_PREFIX) < 0) {\n        return str;\n      }\n      if (str.indexOf('%20') < 0) {\n        return str;\n      }\n\n      const split = str.split('?');\n      const imagePath = split[0];\n\n      const decoded = decodeURIComponent(imagePath);\n\n      const processed = hasLegacyPrefix(decoded)\n        ? stripLegacyPrefix(decoded)\n        : decoded;\n\n      return processed;\n    };\n\n    imageKeys.forEach((key, index) => {\n      if (!newBody.entityMap[key]) {\n        return;\n      }\n\n      const { src } = newBody.entityMap[key].data;\n      newBody.entityMap[key].data.src = processImageUrl(src);\n    });\n\n    return await r\n      .db('spectrum')\n      .table('threads')\n      .get(obj.id)\n      .update({\n        content: {\n          body: JSON.stringify(newBody),\n        },\n        imageReplaced: new Date(),\n      })\n      .run(conn);\n  });\n\n  return await Promise.all(threadPromises);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181102044407-fix-old-image-urls-in-communities.js",
    "content": "exports.up = async function(r, conn) {\n  const communities = await r\n    .db('spectrum')\n    .table('communities')\n    .filter(row => row('modifiedAt').lt(r.epochTime(1540929600)))\n    .filter(row =>\n      row('profilePhoto')\n        .match('spectrum.imgix.net')\n        .or(row('coverPhoto').match('spectrum.imgix.net'))\n    )\n    .filter(row =>\n      row('profilePhoto')\n        .match('%20')\n        .or(row('coverPhoto').match('%20'))\n    )\n    .filter(row => row.hasFields('deletedAt').not())\n    .map(row => ({\n      id: row('id'),\n      profilePhoto: row('profilePhoto'),\n      coverPhoto: row('coverPhoto'),\n    }))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const communityPromises = communities.map(async obj => {\n    const { profilePhoto, coverPhoto } = obj;\n\n    const LEGACY_PREFIX = 'https://spectrum.imgix.net/';\n    const hasLegacyPrefix = url => url.startsWith(LEGACY_PREFIX, 0);\n    const stripLegacyPrefix = url => url.replace(LEGACY_PREFIX, '');\n\n    const processImageUrl = str => {\n      if (str.indexOf(LEGACY_PREFIX) < 0) {\n        return str;\n      }\n\n      if (str.indexOf('%20') < 0) {\n        return str;\n      }\n\n      const split = str.split('?');\n      const imagePath = split[0];\n\n      const decoded = decodeURIComponent(imagePath);\n\n      const processed = hasLegacyPrefix(decoded)\n        ? stripLegacyPrefix(decoded)\n        : decoded;\n\n      return processed;\n    };\n\n    const newProfilePhoto = processImageUrl(profilePhoto);\n    const newCoverPhoto = processImageUrl(coverPhoto);\n\n    return await r\n      .db('spectrum')\n      .table('communities')\n      .get(obj.id)\n      .update({\n        coverPhoto: newCoverPhoto,\n        profilePhoto: newProfilePhoto,\n        imageReplaced: new Date(),\n      })\n      .run(conn);\n  });\n\n  return await Promise.all(communityPromises);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181102045821-fix-old-image-urls-in-users.js",
    "content": "exports.up = async function(r, conn) {\n  const users = await r\n    .db('spectrum')\n    .table('users')\n    .filter(row => row('modifiedAt').lt(r.epochTime(1540929600)))\n    .filter(row =>\n      row.hasFields('coverPhoto').and(row.hasFields('profilePhoto'))\n    )\n    .filter(row =>\n      row('profilePhoto')\n        .match('spectrum.imgix.net')\n        .or(row('coverPhoto').match('spectrum.imgix.net'))\n    )\n    .filter(row =>\n      row('profilePhoto')\n        .match('%20')\n        .or(row('coverPhoto').match('%20'))\n    )\n    .filter(row => row.hasFields('deletedAt').not())\n    .map(row => ({\n      id: row('id'),\n      profilePhoto: row('profilePhoto'),\n      coverPhoto: row('coverPhoto'),\n    }))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const userPromises = users.map(async obj => {\n    const { profilePhoto, coverPhoto } = obj;\n\n    const LEGACY_PREFIX = 'https://spectrum.imgix.net/';\n    const hasLegacyPrefix = url => url.startsWith(LEGACY_PREFIX, 0);\n    const stripLegacyPrefix = url => url.replace(LEGACY_PREFIX, '');\n\n    const processImageUrl = str => {\n      if (str.indexOf(LEGACY_PREFIX) < 0) {\n        return str;\n      }\n\n      if (str.indexOf('%20') < 0) {\n        return str;\n      }\n\n      const split = str.split('?');\n      const imagePath = split[0];\n\n      const decoded = decodeURIComponent(imagePath);\n\n      const processed = hasLegacyPrefix(decoded)\n        ? stripLegacyPrefix(decoded)\n        : decoded;\n\n      return processed;\n    };\n\n    const newProfilePhoto = processImageUrl(profilePhoto);\n    const newCoverPhoto = processImageUrl(coverPhoto);\n\n    return await r\n      .db('spectrum')\n      .table('users')\n      .get(obj.id)\n      .update({\n        coverPhoto: newCoverPhoto,\n        profilePhoto: newProfilePhoto,\n        imageReplaced: new Date(),\n      })\n      .run(conn);\n  });\n\n  return await Promise.all(userPromises);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181102054523-fix-aws-static-url-community-photos.js",
    "content": "exports.up = async function(r, conn) {\n  const LEGACY_PREFIX = 'https://s3.amazonaws.com/spectrum-chat/';\n\n  const communities = await r\n    .db('spectrum')\n    .table('communities')\n    .filter(row =>\n      row('profilePhoto')\n        .match(LEGACY_PREFIX)\n        .or(row('coverPhoto').match(LEGACY_PREFIX))\n    )\n    .filter(row => row.hasFields('deletedAt').not())\n    .map(row => ({\n      id: row('id'),\n      profilePhoto: row('profilePhoto'),\n      coverPhoto: row('coverPhoto'),\n    }))\n    .run(conn)\n    .then(cursor => cursor.toArray());\n\n  const communityPromises = communities.map(async obj => {\n    const { profilePhoto, coverPhoto } = obj;\n    const hasLegacyPrefix = url => url.startsWith(LEGACY_PREFIX, 0);\n    const stripLegacyPrefix = url => url.replace(LEGACY_PREFIX, '');\n\n    const processImageUrl = str => {\n      if (str.indexOf(LEGACY_PREFIX) < 0) {\n        return str;\n      }\n\n      return stripLegacyPrefix(str);\n    };\n\n    const newProfilePhoto = processImageUrl(profilePhoto);\n    const newCoverPhoto = processImageUrl(coverPhoto);\n\n    return await r\n      .db('spectrum')\n      .table('communities')\n      .get(obj.id)\n      .update({\n        coverPhoto: newCoverPhoto,\n        profilePhoto: newProfilePhoto,\n        awsStaticReplaced: new Date(),\n      })\n      .run(conn);\n  });\n\n  return await Promise.all(communityPromises);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181116173949-add-terms-last-accepted-field-to-users.js",
    "content": "exports.up = async (r, conn) => {\n  return r\n    .table('users')\n    .update({\n      termsLastAcceptedAt: r.row('createdAt'),\n    })\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('users')\n    .update({\n      termsLastAcceptedAt: r.literal(),\n    })\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181121054300-resync-community-member-counts.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('communities')\n      .update(\n        {\n          memberCount: r\n            .table('usersCommunities')\n            .getAll(r.row('id'), { index: 'communityId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n    r\n      .table('channels')\n      .update(\n        {\n          memberCount: r\n            .table('usersChannels')\n            .getAll(r.row('id'), { index: 'channelId' })\n            .filter(row => row('isMember').eq(true))\n            .count()\n            .default(1),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n  ]).catch(err => console.error(err));\n};\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181122162921-users-communities-useridandmember-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('usersCommunities')\n    .indexCreate('userIdAndIsMember', [r.row('userId'), r.row('isMember')])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('usersCommunities')\n    .indexDrop('userIdAndIsMember')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181126094455-users-channels-roles.js",
    "content": "const branch = (r, field, fallback) => {\n  return r.branch(r.row(`is${field}`).eq(true), field.toLowerCase(), fallback);\n};\n\nexports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersChannels')\n      .indexCreate('channelIdAndRole', [\n        r.row('channelId'),\n        branch(\n          r,\n          'Pending',\n          branch(\n            r,\n            'Blocked',\n            branch(\n              r,\n              'Owner',\n              branch(r, 'Moderator', branch(r, 'Member', r.literal()))\n            )\n          )\n        ),\n      ])\n      .run(conn),\n    r\n      .table('usersChannels')\n      .indexCreate('userIdAndRole', [\n        r.row('userId'),\n        branch(\n          r,\n          'Pending',\n          branch(\n            r,\n            'Blocked',\n            branch(\n              r,\n              'Owner',\n              branch(r, 'Moderator', branch(r, 'Member', r.literal()))\n            )\n          )\n        ),\n      ])\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersChannels')\n      .indexDrop('channelIdAndRole')\n      .run(conn),\n    r\n      .table('usersChannels')\n      .indexDrop('userIdAndRole')\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20181127090014-communities-member-count-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('communities')\n    .indexCreate('memberCount')\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('communities')\n    .indexDrop('memberCount')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20181205171559-remove-old-users-notifications.js",
    "content": "exports.up = async (r, conn) => {\n  let after = 0;\n  let limit = 10000;\n  let done = false;\n\n  const getRecords = async (after, limit) => {\n    return await r\n      .table('usersNotifications')\n      .skip(after)\n      .limit(limit)\n      .run(conn)\n      .then(cursor => cursor.toArray());\n  };\n\n  const deleteRecords = async arr => {\n    if (!arr || arr.length === 0) return;\n\n    const filtered = arr\n      .filter(rec => rec.isSeen)\n      .filter(rec => {\n        const THIRTY_DAYS = 1000 * 60 * 60 * 24 * 30; //ms\n        const added = new Date(rec.entityAddedAt).getTime(); //ms\n        const now = new Date().getTime(); //ms\n        return now - added > THIRTY_DAYS;\n      })\n      .map(rec => rec.id)\n      .filter(Boolean);\n\n    return await r\n      .table('usersNotifications')\n      .getAll(...filtered)\n      .delete()\n      .run(conn);\n  };\n\n  const processUsersNotificiations = async arr => {\n    if (done) {\n      return await deleteRecords(arr);\n    }\n\n    if (arr.length < limit) {\n      done = true;\n      return await deleteRecords(arr);\n    }\n\n    return deleteRecords(arr).then(async () => {\n      after = after + limit;\n      const nextRecords = await getRecords(after, limit);\n\n      return processUsersNotificiations(nextRecords);\n    });\n  };\n\n  const initialRecordIds = await getRecords(after, limit);\n\n  return processUsersNotificiations(initialRecordIds);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/20181211181146-add-usersthreads-user-id-and-participant-index.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersThreads')\n      .indexCreate('userIdAndIsParticipant', [\n        r.row('userId'),\n        r.row('isParticipant'),\n      ])\n      .run(conn),\n  ]);\n};\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersThreads')\n      .indexDrop('userIdAndIsParticipant')\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20190226085909-bot-user-sam.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('users')\n    .insert({\n      id: 'sam',\n      description: \"Spectrum's automated bot.\",\n      createdAt: new Date(),\n      email: null,\n      providerId: null,\n      fbProviderId: null,\n      githubProviderId: null,\n      githubUsername: 'withspectrum',\n      googleProviderId: null,\n      isOnline: true,\n      lastSeen: new Date(),\n      modifiedAt: new Date(),\n      name: 'Spectrum Bot',\n      termsLastAcceptedAt: new Date(),\n      username: 'spectrumbot',\n      website: 'https://spectrum.chat',\n      profilePhoto: '/default_images/sam.png',\n    })\n    .run(conn);\n};\nexports.down = function(r, conn) {\n  return r\n    .table('users')\n    .get('sam')\n    .delete()\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20190306125252-threads-watercooler-index.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('threads')\n    .indexCreate('communityIdAndWatercooler', [\n      r.row('communityId'),\n      r.row('watercooler'),\n    ])\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return r\n    .table('threads')\n    .indexDrop('communityIdAndWatercooler')\n    .run(conn);\n};\n"
  },
  {
    "path": "api/migrations/20190315142923-backfill-userscommunities-last-seen-community-last-active.js",
    "content": "exports.up = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .update(\n        {\n          lastSeen: r\n            .table('users')\n            .get(r.row('userId'))('lastSeen')\n            .default(r.row('lastSeen')),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n    r\n      .table('communities')\n      .update(\n        {\n          lastActive: r\n            .table('threads')\n            .between(\n              [r.row('communityId'), r.minval],\n              [r.row('communityId'), r.maxval],\n              {\n                index: 'communityIdAndLastActive',\n                leftBound: 'open',\n                rightBound: 'open',\n              }\n            )\n            .orderBy({ index: r.desc('communityIdAndLastActive') })\n            .limit(1)('lastActive')\n            .default(r.row('createdAt')),\n        },\n        {\n          nonAtomic: true,\n        }\n      )\n      .run(conn),\n  ]);\n};\n\nexports.down = function(r, conn) {\n  return Promise.all([\n    r\n      .table('usersCommunities')\n      .update({\n        lastSeen: r.literal(),\n      })\n      .run(conn),\n    r\n      .table('communities')\n      .update({\n        lastActive: r.literal(),\n      })\n      .run(conn),\n  ]);\n};\n"
  },
  {
    "path": "api/migrations/20190327134509-delete-bot-messages.js",
    "content": "exports.up = function(r, conn) {\n  return r\n    .table('messages')\n    .filter({ bot: true })\n    .delete()\n    .run(conn);\n};\n\nexports.down = function(r, conn) {\n  return Promise.resolve();\n};\n"
  },
  {
    "path": "api/migrations/config.js",
    "content": "const path = require('path');\nconst fs = require('fs');\nconst debug = require('debug')('migrations');\n\nconst DEFAULT_CONFIG = {\n  driver: 'rethinkdbdash',\n  db: process.env.NODE_ENV === 'test' ? 'testing' : 'spectrum',\n  host: 'localhost',\n  port: 28015,\n  migrationsDirectory: 'api/migrations',\n};\n\nlet ca;\n\ntry {\n  ca = fs.readFileSync(path.join(process.cwd(), 'cacert'));\n} catch (err) {}\n\nconst RUN_IN_PROD = !!process.env.AWS_RETHINKDB_PASSWORD;\n\nif (!ca && RUN_IN_PROD)\n  throw new Error(\n    'Please provide the SSL certificate to connect to the production database in a file called `cacert` in the root directory.'\n  );\n\nif (RUN_IN_PROD && process.argv[4] === 'down') {\n  throw new Error('Do not drop the production database!!!!!');\n}\n\nif (RUN_IN_PROD) debug('Running migration in production...');\n\nmodule.exports = !RUN_IN_PROD\n  ? DEFAULT_CONFIG\n  : Object.assign({}, DEFAULT_CONFIG, {\n      password: process.env.AWS_RETHINKDB_PASSWORD,\n      host: process.env.AWS_RETHINKDB_URL,\n      port: process.env.AWS_RETHINKDB_PORT,\n      ...(ca\n        ? {\n            ssl: {\n              ca,\n            },\n          }\n        : {}),\n    });\n"
  },
  {
    "path": "api/migrations/seed/default/channelSettings.js",
    "content": "const constants = require('./constants');\nconst { PAYMENTS_PRIVATE_CHANNEL_ID } = constants;\n\nmodule.exports = [\n  {\n    id: 1,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    joinSettings: {\n      tokenJoinEnabled: true,\n      token: 'abc',\n    },\n    slackSettings: {\n      botLinks: {\n        threadCreated: null,\n      },\n    },\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/channels.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst {\n  DATE,\n  SPECTRUM_COMMUNITY_ID,\n  PAYMENTS_COMMUNITY_ID,\n  DELETED_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_ID,\n  SINGLE_CHANNEL_COMMUNITY_ID,\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  PAYMENTS_GENERAL_CHANNEL_ID,\n  PAYMENTS_PRIVATE_CHANNEL_ID,\n  PAYMENTS_FEATURES_CHANNEL_ID,\n  SPECTRUM_ARCHIVED_CHANNEL_ID,\n  SPECTRUM_DELETED_CHANNEL_ID,\n  DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n  MODERATOR_CREATED_CHANNEL_ID,\n  PRIVATE_GENERAL_CHANNEL_ID,\n  SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'General',\n    description: 'General chatter',\n    slug: 'general',\n    isPrivate: false,\n    isDefault: true,\n    memberCount: 5,\n  },\n\n  {\n    id: SPECTRUM_PRIVATE_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Private',\n    description: 'Private chatter',\n    slug: 'private',\n    isPrivate: true,\n    isDefault: false,\n    memberCount: 5,\n  },\n\n  {\n    id: PAYMENTS_GENERAL_CHANNEL_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'General',\n    description: 'General chatter',\n    slug: 'general',\n    isPrivate: false,\n    isDefault: true,\n    memberCount: 5,\n  },\n\n  {\n    id: PAYMENTS_PRIVATE_CHANNEL_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Private',\n    description: 'Private chatter',\n    slug: 'private',\n    isPrivate: true,\n    isDefault: false,\n    memberCount: 5,\n  },\n\n  {\n    id: PAYMENTS_FEATURES_CHANNEL_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Payments Features',\n    description: 'Payments Features',\n    slug: 'features',\n    isPrivate: false,\n    isDefault: false,\n    memberCount: 5,\n  },\n\n  {\n    id: SPECTRUM_ARCHIVED_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Archived',\n    description: 'Testing archiving',\n    slug: 'archived',\n    isPrivate: false,\n    isDefault: true,\n    archivedAt: new Date(DATE),\n    memberCount: 3,\n  },\n\n  {\n    id: SPECTRUM_DELETED_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Deleted',\n    description: 'Testing deleted channel',\n    slug: 'deleted',\n    isPrivate: false,\n    isDefault: false,\n    deletedAt: new Date(DATE),\n    memberCount: 0,\n  },\n\n  {\n    id: DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n    communityId: DELETED_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Deleted',\n    description: 'Testing deleted channel',\n    slug: 'deleted',\n    isPrivate: false,\n    isDefault: false,\n    deletedAt: new Date(DATE),\n    memberCount: 1,\n  },\n\n  {\n    id: MODERATOR_CREATED_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'Moderator created',\n    description: 'Moderator created channel',\n    slug: 'moderator-created',\n    isPrivate: false,\n    isDefault: false,\n    memberCount: 1,\n  },\n\n  {\n    id: PRIVATE_GENERAL_CHANNEL_ID,\n    communityId: PRIVATE_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'General',\n    description: 'General',\n    slug: 'private-general',\n    isPrivate: false,\n    isDefault: false,\n    memberCount: 1,\n  },\n\n  {\n    id: SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n    communityId: SINGLE_CHANNEL_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    name: 'General',\n    description: 'General',\n    slug: 'general',\n    isPrivate: false,\n    isDefault: false,\n    memberCount: 1,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/communities.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst {\n  DATE,\n  SPECTRUM_COMMUNITY_ID,\n  PAYMENTS_COMMUNITY_ID,\n  DELETED_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_ID,\n  SINGLE_CHANNEL_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: SPECTRUM_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    isPrivate: false,\n    name: 'Spectrum',\n    description: 'The future of communities',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'spectrum',\n    memberCount: 4,\n  },\n  {\n    id: PAYMENTS_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    isPrivate: false,\n    name: 'Payments',\n    description: 'Where payments are tested',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'payments',\n    memberCount: 5,\n  },\n  {\n    id: DELETED_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    deletedAt: new Date(DATE),\n    isPrivate: false,\n    name: 'Deleted',\n    description: 'Things didnt work out',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'deleted',\n    memberCount: 0,\n  },\n  {\n    id: PRIVATE_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    isPrivate: true,\n    name: 'Private community',\n    description: 'Private community',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'private',\n    memberCount: 1,\n  },\n  {\n    id: SINGLE_CHANNEL_COMMUNITY_ID,\n    createdAt: new Date(DATE),\n    isPrivate: false,\n    name: 'Single channel community',\n    description: 'Single channel community',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'single',\n    memberCount: 1,\n  },\n  {\n    id: PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID,\n    createdAt: new Date(DATE),\n    isPrivate: true,\n    name: 'private community with join token',\n    description: 'private community with join token',\n    website: 'https://spectrum.chat',\n    profilePhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Profile.png.0.6225566835336693',\n    coverPhoto:\n      'https://spectrum.imgix.net/communities/-Kh6RfPYjmSaIWbkck8i/Twitter Header.png.0.3303118636071434',\n    slug: 'private-join',\n    memberCount: 1,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/communitySettings.js",
    "content": "const constants = require('./constants');\nconst {\n  PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID,\n  PAYMENTS_COMMUNITY_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: 1,\n    communityId: PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID,\n    brandedLogin: {\n      isEnabled: false,\n      message: null,\n    },\n    slackSettings: {\n      connectedAt: null,\n      connectedBy: null,\n      teamName: null,\n      teamId: null,\n      scope: null,\n      token: null,\n      invitesSentAt: null,\n      invitesMemberCount: null,\n      invitesCustomMessage: null,\n    },\n    joinSettings: {\n      tokenJoinEnabled: true,\n      token: 'abc',\n    },\n  },\n  {\n    id: 2,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    brandedLogin: {\n      isEnabled: false,\n      message: null,\n    },\n    slackSettings: {\n      connectedAt: null,\n      connectedBy: null,\n      teamName: null,\n      teamId: null,\n      scope: null,\n      token: null,\n      invitesSentAt: null,\n      invitesMemberCount: null,\n      invitesCustomMessage: null,\n    },\n    joinSettings: {\n      tokenJoinEnabled: true,\n      token: 'abc',\n    },\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/constants.js",
    "content": "// @flow\nconst DATE = 1483225200000;\n\n// users\nconst MAX_ID = '1';\nconst BRIAN_ID = '2';\nconst BRYN_ID = '3';\n// this user is blocked in spectrum community\nconst BLOCKED_USER_ID = '4';\n// this user is has never joined communities or channels\nconst QUIET_USER_ID = '5';\n// this user was a previous member of spectrum community\nconst PREVIOUS_MEMBER_USER_ID = '6';\n// this user is pending in all private channels\nconst PENDING_USER_ID = '7';\n// this user is moderator in all channels, member in all communities\nconst CHANNEL_MODERATOR_USER_ID = '8';\n// this user is moderator in all communities\nconst COMMUNITY_MODERATOR_USER_ID = '9';\n// this user is only a member of one community, and that community only has\n// one channel - use for testing the composer community+channel selection\nconst SINGLE_CHANNEL_COMMUNITY_USER_ID = '10';\nconst NEW_USER_ID = '11';\n\n// communities\nconst SPECTRUM_COMMUNITY_ID = '1';\nconst PAYMENTS_COMMUNITY_ID = '2';\nconst DELETED_COMMUNITY_ID = '3';\nconst PRIVATE_COMMUNITY_ID = '4';\nconst SINGLE_CHANNEL_COMMUNITY_ID = '5';\nconst PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID = '6';\n\n// channels\nconst SPECTRUM_GENERAL_CHANNEL_ID = '1';\nconst SPECTRUM_PRIVATE_CHANNEL_ID = '2';\nconst PAYMENTS_GENERAL_CHANNEL_ID = '3';\nconst PAYMENTS_PRIVATE_CHANNEL_ID = '4';\nconst PAYMENTS_FEATURES_CHANNEL_ID = '10';\nconst SPECTRUM_ARCHIVED_CHANNEL_ID = '5';\nconst SPECTRUM_DELETED_CHANNEL_ID = '6';\nconst DELETED_COMMUNITY_DELETED_CHANNEL_ID = '7';\nconst MODERATOR_CREATED_CHANNEL_ID = '8';\nconst PRIVATE_GENERAL_CHANNEL_ID = '9';\nconst SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID = '11';\n\nmodule.exports = {\n  DATE,\n  MAX_ID,\n  BRIAN_ID,\n  BRYN_ID,\n  BLOCKED_USER_ID,\n  QUIET_USER_ID,\n  PREVIOUS_MEMBER_USER_ID,\n  PENDING_USER_ID,\n  CHANNEL_MODERATOR_USER_ID,\n  COMMUNITY_MODERATOR_USER_ID,\n  SINGLE_CHANNEL_COMMUNITY_USER_ID,\n  PRIVATE_COMMUNITY_WITH_JOIN_TOKEN_ID,\n  NEW_USER_ID,\n  SPECTRUM_COMMUNITY_ID,\n  PAYMENTS_COMMUNITY_ID,\n  DELETED_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_ID,\n  SINGLE_CHANNEL_COMMUNITY_ID,\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  PAYMENTS_GENERAL_CHANNEL_ID,\n  PAYMENTS_PRIVATE_CHANNEL_ID,\n  PAYMENTS_FEATURES_CHANNEL_ID,\n  SPECTRUM_ARCHIVED_CHANNEL_ID,\n  SPECTRUM_DELETED_CHANNEL_ID,\n  DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n  MODERATOR_CREATED_CHANNEL_ID,\n  PRIVATE_GENERAL_CHANNEL_ID,\n  SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n};\n"
  },
  {
    "path": "api/migrations/seed/default/directMessageThreads.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { DATE } = constants;\n\nmodule.exports = [\n  {\n    id: 'dm-1',\n    createdAt: new Date(DATE),\n    name: null,\n    threadLastActive: new Date(DATE),\n  },\n  {\n    id: 'dm-2',\n    createdAt: new Date(DATE - 1),\n    name: null,\n    threadLastActive: new Date(DATE - 1),\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/index.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst defaultUsers = require('./users');\nconst defaultCommunities = require('./communities');\nconst defaultChannels = require('./channels');\nconst defaultThreads = require('./threads');\nconst defaultUsersThreads = require('./usersThreads');\nconst defaultDirectMessageThreads = require('./directMessageThreads');\nconst defaultUsersDirectMessageThreads = require('./usersDirectMessageThreads');\nconst defaultUsersCommunities = require('./usersCommunities');\nconst defaultUsersChannels = require('./usersChannels');\nconst defaultUsersSettings = require('./usersSettings')();\nconst defaultMessages = require('./messages');\nconst defaultReactions = require('./reactions');\nconst defaultUsersNotifications = require('./usersNotifications');\nconst defaultNotifications = require('./notifications');\nconst defaultCommunitySettings = require('./communitySettings');\nconst defaultChannelSettings = require('./channelSettings');\n\nmodule.exports = {\n  constants,\n  defaultUsers,\n  defaultCommunities,\n  defaultChannels,\n  defaultThreads,\n  defaultUsersThreads,\n  defaultDirectMessageThreads,\n  defaultUsersDirectMessageThreads,\n  defaultUsersCommunities,\n  defaultUsersChannels,\n  defaultMessages,\n  defaultUsersSettings,\n  defaultNotifications,\n  defaultUsersNotifications,\n  defaultCommunitySettings,\n  defaultChannelSettings,\n  defaultReactions,\n};\n"
  },
  {
    "path": "api/migrations/seed/default/messages.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { fromPlainText, toJSON } = require('../../../../shared/draft-utils');\nconst { DATE, MAX_ID, BRYN_ID, BRIAN_ID } = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    threadId: 'thread-1',\n    content: {\n      body: JSON.stringify({\n        blocks: [\n          {\n            key: '9u8bg',\n            text: 'This is the first message!',\n            type: 'unstyled',\n            depth: 0,\n            inlineStyleRanges: [],\n            entityRanges: [],\n            data: {},\n          },\n        ],\n        entityMap: {},\n      }),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE),\n  },\n  {\n    id: '2',\n    threadId: 'thread-1',\n    content: {\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is the second message!'))\n      ),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: BRYN_ID,\n    timestamp: new Date(DATE + 1),\n  },\n  {\n    id: '3',\n    threadId: 'thread-1',\n    content: {\n      body: JSON.stringify(\n        toJSON(fromPlainText('The next one is an emoji-only one :scream:'))\n      ),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE + 2),\n  },\n  {\n    id: '4',\n    threadId: 'thread-1',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('🎉'))),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: BRIAN_ID,\n    timestamp: new Date(DATE + 3),\n  },\n\n  {\n    id: '5',\n    threadId: 'thread-2',\n    content: {\n      body: JSON.stringify({\n        blocks: [\n          {\n            key: '9u8bg',\n            text: 'This is the first message!',\n            type: 'unstyled',\n            depth: 0,\n            inlineStyleRanges: [],\n            entityRanges: [],\n            data: {},\n          },\n        ],\n        entityMap: {},\n      }),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE),\n  },\n  {\n    id: '6',\n    threadId: 'thread-2',\n    content: {\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is the second message!'))\n      ),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: BRYN_ID,\n    timestamp: new Date(DATE + 1),\n  },\n  {\n    id: '7',\n    threadId: 'thread-2',\n    content: {\n      body: JSON.stringify(\n        toJSON(fromPlainText('The next one is an emoji-only one :scream:'))\n      ),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE + 2),\n  },\n  {\n    id: '8',\n    threadId: 'thread-2',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('🎉'))),\n    },\n    messageType: 'draftjs',\n    threadType: 'story',\n    senderId: BRIAN_ID,\n    timestamp: new Date(DATE + 3),\n  },\n\n  // DM Thread\n  {\n    id: '9',\n    threadId: 'dm-1',\n    threadType: 'directMessageThread',\n    content: {\n      body: JSON.stringify(\n        toJSON(fromPlainText('Direct message thread message!'))\n      ),\n    },\n    messageType: 'draftjs',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE),\n  },\n  {\n    id: '10',\n    threadId: 'dm-1',\n    threadType: 'directMessageThread',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A second one'))),\n    },\n    messageType: 'draftjs',\n    senderId: BRYN_ID,\n    timestamp: new Date(DATE + 50000),\n  },\n  {\n    id: '11',\n    threadId: 'dm-1',\n    threadType: 'directMessageThread',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A third one'))),\n    },\n    messageType: 'draftjs',\n    senderId: BRIAN_ID,\n    timestamp: new Date(DATE + 100000),\n  },\n  {\n    id: '12',\n    threadId: 'dm-1',\n    threadType: 'directMessageThread',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A fourth one'))),\n    },\n    messageType: 'draftjs',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE + 200000),\n  },\n  {\n    id: '13',\n    threadId: 'dm-1',\n    threadType: 'directMessageThread',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A fifth one'))),\n    },\n    messageType: 'draftjs',\n    senderId: BRYN_ID,\n    timestamp: new Date(DATE + 300000),\n  },\n  {\n    id: '14',\n    threadId: 'thread-6',\n    threadType: 'story',\n    content: {\n      body: `{\"blocks\":[{\"key\":\"7d3uf\",\"text\":\"http://localhost:3000/spectrum/general/yet-another-thread~thread-9\",\"type\":\"unstyled\",\"depth\":0,\"inlineStyleRanges\":[],\"entityRanges\":[],\"data\":{}},{\"type\":\"atomic\",\"data\":{},\"text\":\" \",\"depth\":0,\"entityRanges\":[{\"offset\":0,\"length\":1,\"key\":0}],\"inlineStyleRanges\":[],\"key\":\"7jad1\"},{\"type\":\"unstyled\",\"data\":{},\"text\":\" \",\"depth\":0,\"entityRanges\":[],\"inlineStyleRanges\":[],\"key\":\"7a0pk\"}],\"entityMap\":{\"0\":{\"data\":{\"type\":\"internal\",\"id\":\"thread-9\",\"entity\":\"thread\"},\"mutability\":\"MUTABLE\",\"type\":\"embed\"}}}`,\n    },\n    messageType: 'draftjs',\n    senderId: BRIAN_ID,\n    timestamp: new Date(DATE + 300000),\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/notifications.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst users = require('./users');\n\nconst { DATE, BRIAN_ID, PREVIOUS_MEMBER_USER_ID } = constants;\n\nmodule.exports = [\n  {\n    actors: [\n      {\n        id: PREVIOUS_MEMBER_USER_ID,\n        payload: JSON.stringify(\n          users.find(u => u.id === PREVIOUS_MEMBER_USER_ID)\n        ),\n        type: 'USER',\n      },\n    ],\n    context: {\n      id: 'dm-2',\n      payload: '',\n      type: 'DIRECT_MESSAGE_THREAD',\n    },\n    createdAt: new Date(DATE + 1),\n    entities: [\n      {\n        id: '1',\n        payload: '',\n        type: 'MESSAGE',\n      },\n    ],\n    event: 'MESSAGE_CREATED',\n    id: '1',\n    modifiedAt: new Date(DATE + 1),\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/reactions.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { DATE, MAX_ID } = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    messageId: '4',\n    type: 'like',\n    senderId: MAX_ID,\n    timestamp: new Date(DATE + 4),\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/threads.js",
    "content": "// @flow\nconst { fromPlainText, toJSON } = require('../../../../shared/draft-utils');\nconst constants = require('./constants');\nconst {\n  DATE,\n  BRIAN_ID,\n  MAX_ID,\n  BRYN_ID,\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  PRIVATE_GENERAL_CHANNEL_ID,\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n  MODERATOR_CREATED_CHANNEL_ID,\n  DELETED_COMMUNITY_ID,\n  SPECTRUM_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_ID,\n  SPECTRUM_ARCHIVED_CHANNEL_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: 'thread-1',\n    createdAt: new Date(DATE),\n    creatorId: BRIAN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'The first thread! 🎉',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is it, we got a thread here'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE),\n        content: {\n          title: 'The first thread! 🎉',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is it, we got a thread here'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE),\n    lastActive: new Date(DATE),\n    messageCount: 4,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-2',\n    createdAt: new Date(DATE + 1),\n    creatorId: MAX_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 1),\n        content: {\n          title: 'Another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 1),\n    lastActive: new Date(DATE + 1),\n    messageCount: 4,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-3',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n\n  {\n    id: 'thread-4',\n    createdAt: new Date(DATE),\n    creatorId: BRIAN_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'The first thread! 🎉',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is it, we got a thread here'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE),\n        content: {\n          title: 'The first thread! 🎉',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is it, we got a thread here'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE),\n    lastActive: new Date(DATE),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-5',\n    createdAt: new Date(DATE + 1),\n    creatorId: MAX_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 1),\n        content: {\n          title: 'Another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 1),\n    lastActive: new Date(DATE + 1),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-6',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-7',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n    communityId: DELETED_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    deletedAt: new Date(DATE + 3),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-8',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: SPECTRUM_ARCHIVED_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-9',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: true,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n  },\n\n  {\n    id: 'thread-10',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: MODERATOR_CREATED_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n  {\n    id: 'thread-11',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: true,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Deleted thread',\n      body: JSON.stringify(toJSON(fromPlainText('This is a deleted thread'))),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Deleted thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is a deleted thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    deletedAt: new Date(DATE + 3),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n\n  {\n    id: 'thread-12',\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n    communityId: DELETED_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    deletedAt: new Date(DATE),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n\n  {\n    id: 'thread-13',\n    createdAt: new Date(DATE + 2),\n    creatorId: MAX_ID,\n    channelId: PRIVATE_GENERAL_CHANNEL_ID,\n    communityId: PRIVATE_COMMUNITY_ID,\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: JSON.stringify(\n        toJSON(fromPlainText('This is just another thread'))\n      ),\n    },\n    edits: [\n      {\n        timestamp: new Date(DATE + 2),\n        content: {\n          title: 'Yet another thread',\n          body: JSON.stringify(\n            toJSON(fromPlainText('This is just another thread'))\n          ),\n        },\n      },\n    ],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n    messageCount: 0,\n    reactionCount: 0,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/users.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst {\n  MAX_ID,\n  BRIAN_ID,\n  BRYN_ID,\n  QUIET_USER_ID,\n  BLOCKED_USER_ID,\n  PREVIOUS_MEMBER_USER_ID,\n  CHANNEL_MODERATOR_USER_ID,\n  COMMUNITY_MODERATOR_USER_ID,\n  SINGLE_CHANNEL_COMMUNITY_USER_ID,\n  NEW_USER_ID,\n  DATE,\n} = constants;\n\nmodule.exports = [\n  {\n    id: MAX_ID,\n    name: 'Max Stoiber',\n    description:\n      'Makes styled-components, react-boilerplate and micro-analytics 💅 Speciality coffee geek, skier, traveller ☕',\n    website: 'https://mxstbr.com',\n    username: 'mxstbr',\n    profilePhoto: 'https://img.gs/jztmrqvgzv/500/mxstbr.com/headshot.jpeg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/2451223458/1479507323/1500x500',\n    email: 'contact@mxstbr.com',\n    providerId: '2451223458',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: BRIAN_ID,\n    name: 'Brian Lovin',\n    description: 'Chief Nice Boy™',\n    website: 'https://brianlovin.com',\n    username: 'brian',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/570313913648955392/cf4tgX7M_bigger.jpeg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/465068802/1490051733/1500x500',\n    email: 'briandlovin@gmail.com',\n    providerId: '465068802',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: BRYN_ID,\n    name: 'Bryn Jackson',\n    description: 'full-stack flapjack',\n    website: 'https://bryn.io',\n    username: 'bryn',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@bryn.io',\n    providerId: '17106008',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: QUIET_USER_ID,\n    name: 'Quiet user',\n    description: \"I've never joined anything on Spectrum\",\n    website: '',\n    username: 'quiet-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@quietuser.com',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: BLOCKED_USER_ID,\n    name: 'Blocked user',\n    description: 'I am blocked in the Spectrum community',\n    website: '',\n    username: 'blocked-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@blockeduser.com',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: PREVIOUS_MEMBER_USER_ID,\n    name: 'Previous member',\n    description: 'I used to be in the Spectrum community, but then left',\n    website: '',\n    username: 'previous-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@previousboy.io',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: CHANNEL_MODERATOR_USER_ID,\n    name: 'Channel moderator',\n    description: 'I moderate all channels',\n    website: '',\n    username: 'channel-moderator-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@channelmoderatorboy.io',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: COMMUNITY_MODERATOR_USER_ID,\n    name: 'Community moderator',\n    description: 'I moderate all communities',\n    website: '',\n    username: 'community-moderator-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@communitymoderatorboy.io',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: SINGLE_CHANNEL_COMMUNITY_USER_ID,\n    name: 'Single community person',\n    description: 'Im a member of one community',\n    website: '',\n    username: 'single-community-user',\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@singlecommunity.io',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n  {\n    id: NEW_USER_ID,\n    name: 'New user',\n    description: 'Just joined spectrum',\n    website: '',\n    username: null,\n    profilePhoto:\n      'https://pbs.twimg.com/profile_images/848823167699230721/-9CbPtto_bigger.jpg',\n    coverPhoto:\n      'https://pbs.twimg.com/profile_banners/17106008/1491444958/1500x500',\n    email: 'hi@newuser.io',\n    createdAt: new Date(DATE),\n    lastSeen: new Date(DATE),\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/usersChannels.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst {\n  DATE,\n  BRIAN_ID,\n  MAX_ID,\n  BRYN_ID,\n  BLOCKED_USER_ID,\n  PREVIOUS_MEMBER_USER_ID,\n  CHANNEL_MODERATOR_USER_ID,\n  COMMUNITY_MODERATOR_USER_ID,\n  SINGLE_CHANNEL_COMMUNITY_USER_ID,\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  PRIVATE_GENERAL_CHANNEL_ID,\n  SPECTRUM_ARCHIVED_CHANNEL_ID,\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n  PAYMENTS_GENERAL_CHANNEL_ID,\n  PAYMENTS_PRIVATE_CHANNEL_ID,\n  PAYMENTS_FEATURES_CHANNEL_ID,\n  MODERATOR_CREATED_CHANNEL_ID,\n  SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '2',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '3',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '4',\n    createdAt: new Date(DATE),\n    userId: BLOCKED_USER_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: true,\n    isPending: false,\n    receiveNotifications: true,\n  },\n\n  {\n    id: '5',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '6',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '7',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '8',\n    createdAt: new Date(DATE),\n    userId: BLOCKED_USER_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: true,\n    isPending: false,\n    receiveNotifications: true,\n  },\n\n  {\n    id: '9',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '10',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '32',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: PAYMENTS_FEATURES_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '11',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '12',\n    createdAt: new Date(DATE),\n    userId: BLOCKED_USER_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: true,\n    isPending: false,\n    receiveNotifications: true,\n  },\n\n  {\n    id: '13',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '14',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '15',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '16',\n    createdAt: new Date(DATE),\n    userId: BLOCKED_USER_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: true,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '17',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: SPECTRUM_ARCHIVED_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '18',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '19',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: SPECTRUM_ARCHIVED_CHANNEL_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '20',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '21',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '22',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '23',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    channelId: MODERATOR_CREATED_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n\n  {\n    id: '24',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '25',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    channelId: SPECTRUM_ARCHIVED_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '26',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    channelId: SPECTRUM_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '27',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    channelId: PAYMENTS_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '28',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    channelId: PAYMENTS_PRIVATE_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '29',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    id: '30',\n    createdAt: new Date(DATE),\n    userId: PREVIOUS_MEMBER_USER_ID,\n    channelId: SPECTRUM_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  },\n  {\n    id: '31',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    channelId: PRIVATE_GENERAL_CHANNEL_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  },\n  {\n    id: '33',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    channelId: SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  },\n  {\n    id: '34',\n    createdAt: new Date(DATE),\n    userId: SINGLE_CHANNEL_COMMUNITY_USER_ID,\n    channelId: SINGLE_CHANNEL_COMMUNITY_GENERAL_CHANNEL_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/usersCommunities.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst {\n  DATE,\n  MAX_ID,\n  BRYN_ID,\n  BRIAN_ID,\n  PREVIOUS_MEMBER_USER_ID,\n  BLOCKED_USER_ID,\n  CHANNEL_MODERATOR_USER_ID,\n  COMMUNITY_MODERATOR_USER_ID,\n  SINGLE_CHANNEL_COMMUNITY_USER_ID,\n  SPECTRUM_COMMUNITY_ID,\n  PAYMENTS_COMMUNITY_ID,\n  PRIVATE_COMMUNITY_ID,\n  SINGLE_CHANNEL_COMMUNITY_ID,\n} = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '2',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 101,\n  },\n  {\n    id: '3',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '4',\n    createdAt: new Date(DATE),\n    userId: BLOCKED_USER_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: true,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '6',\n    createdAt: new Date(DATE),\n    userId: PREVIOUS_MEMBER_USER_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n    reputation: 100,\n  },\n\n  {\n    id: '7',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '8',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '9',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '10',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '11',\n    createdAt: new Date(DATE),\n    userId: CHANNEL_MODERATOR_USER_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '12',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    communityId: SPECTRUM_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '13',\n    createdAt: new Date(DATE),\n    userId: COMMUNITY_MODERATOR_USER_ID,\n    communityId: PAYMENTS_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: true,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n  {\n    id: '14',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    communityId: PRIVATE_COMMUNITY_ID,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n\n  {\n    id: '15',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    communityId: PRIVATE_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 100,\n  },\n\n  {\n    id: '16',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    communityId: SINGLE_CHANNEL_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 0,\n  },\n\n  {\n    id: '17',\n    createdAt: new Date(DATE),\n    userId: SINGLE_CHANNEL_COMMUNITY_USER_ID,\n    communityId: SINGLE_CHANNEL_COMMUNITY_ID,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n    reputation: 0,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/usersDirectMessageThreads.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { DATE, BRIAN_ID, MAX_ID, BRYN_ID, PREVIOUS_MEMBER_USER_ID } = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    threadId: 'dm-1',\n    lastActive: new Date(DATE),\n    lastSeen: new Date(DATE),\n    receiveNotifications: true,\n  },\n  {\n    id: '2',\n    createdAt: new Date(DATE),\n    userId: BRYN_ID,\n    threadId: 'dm-1',\n    lastActive: new Date(DATE),\n    lastSeen: new Date(DATE),\n    receiveNotifications: true,\n  },\n  {\n    id: '3',\n    createdAt: new Date(DATE),\n    userId: MAX_ID,\n    threadId: 'dm-1',\n    lastActive: new Date(DATE),\n    lastSeen: new Date(DATE),\n    receiveNotifications: true,\n  },\n  {\n    id: '4',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    threadId: 'dm-2',\n    lastActive: new Date(DATE - 1),\n    lastSeen: null,\n    receiveNotifications: true,\n  },\n  {\n    id: '5',\n    createdAt: new Date(DATE),\n    userId: PREVIOUS_MEMBER_USER_ID,\n    threadId: 'dm-2',\n    lastActive: new Date(DATE - 1),\n    lastSeen: new Date(DATE - 1),\n    receiveNotifications: true,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/usersNotifications.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { DATE, BRIAN_ID } = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    notificationId: '1',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    entityAddedAt: new Date(DATE + 1),\n    isRead: false,\n    isSeen: false,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/default/usersSettings.js",
    "content": "// @flow\n\nmodule.exports = () => {\n  let settings = [];\n  for (let step = 0; step < 11; step++) {\n    settings.push({\n      userId: step.toString(),\n      notifications: {\n        types: {\n          newMessageInThreads: {\n            email: true,\n          },\n          newMention: {\n            email: true,\n          },\n          newDirectMessage: {\n            email: true,\n          },\n          newThreadCreated: {\n            email: true,\n          },\n          dailyDigest: {\n            email: true,\n          },\n          weeklyDigest: {\n            email: true,\n          },\n        },\n      },\n    });\n  }\n  return settings;\n};\n"
  },
  {
    "path": "api/migrations/seed/default/usersThreads.js",
    "content": "// @flow\nconst constants = require('./constants');\nconst { DATE, MAX_ID, BRYN_ID, BRIAN_ID } = constants;\n\nmodule.exports = [\n  {\n    id: '1',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    threadId: 'thread-1',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '2',\n    createdAt: new Date(DATE + 1),\n    userId: MAX_ID,\n    threadId: 'thread-1',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '3',\n    createdAt: new Date(DATE + 2),\n    userId: BRYN_ID,\n    threadId: 'thread-1',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n\n  {\n    id: '4',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    threadId: 'thread-2',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '5',\n    createdAt: new Date(DATE + 1),\n    userId: MAX_ID,\n    threadId: 'thread-2',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '6',\n    createdAt: new Date(DATE + 2),\n    userId: BRYN_ID,\n    threadId: 'thread-2',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n\n  {\n    id: '7',\n    createdAt: new Date(DATE),\n    userId: BRIAN_ID,\n    threadId: 'thread-3',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '8',\n    createdAt: new Date(DATE + 1),\n    userId: MAX_ID,\n    threadId: 'thread-3',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n  {\n    id: '9',\n    createdAt: new Date(DATE + 2),\n    userId: BRYN_ID,\n    threadId: 'thread-3',\n    receiveNotifications: true,\n    isParticipant: true,\n  },\n];\n"
  },
  {
    "path": "api/migrations/seed/generate.js",
    "content": "// $FlowFixMe\nconst { v4: uuid } = require('uuid');\n// $FlowFixMe\nconst faker = require('faker');\n// $FlowFixMe\nconst slugify = require('slugg');\n// $FlowFixMe\nconst casual = require('casual').functions();\nconst { fromPlainText, toJSON } = require('../../../shared/draft-utils');\n\nconst randomAmount = ({ max, min }, cb) => {\n  if (!max) throw new Error('randomAmount({ max }): max has to be defined!');\n  const n = faker.random.number({ min: min || 0, max });\n  let result = [];\n  for (var i = 0; i < n; i++) {\n    result.push(cb(i));\n  }\n  return result;\n};\n\nconst generateUser = () => {\n  const createdAt = faker.date.past(2);\n  const name = faker.name.findName();\n  return {\n    id: uuid(),\n    name,\n    description: casual.short_description(),\n    website: faker.internet.url(),\n    username: faker.internet.userName(name),\n    profilePhoto: faker.internet.avatar(),\n    coverPhoto: faker.image.image(),\n    email: faker.internet.email(name),\n    providerId: uuid(),\n    createdAt,\n    // Make sure lastSeen is > createdAt\n    lastSeen: faker.date.between(createdAt, new Date()),\n  };\n};\n\nconst generateUsersSettings = userId => {\n  return {\n    id: uuid(),\n    userId,\n    notifications: {\n      types: {\n        newMessageInThreads: {\n          email: true,\n        },\n        newThreadCreated: {\n          email: true,\n        },\n        dailyDigest: {\n          email: true,\n        },\n        weeklyDigest: {\n          email: true,\n        },\n      },\n    },\n  };\n};\n\nconst generateCommunity = () => {\n  const name = faker.company.companyName();\n\n  return {\n    id: uuid(),\n    createdAt: faker.date.past(2),\n    name,\n    description: casual.short_description(),\n    website: faker.internet.url(),\n    profilePhoto: faker.image.business(),\n    coverPhoto: faker.image.image(),\n    slug: slugify(name),\n  };\n};\n\nconst generateChannel = communityId => {\n  const name = faker.commerce.department();\n\n  return {\n    id: uuid(),\n    communityId,\n    createdAt: faker.date.past(2),\n    name,\n    description: casual.short_description(),\n    slug: slugify(name),\n    isPrivate: faker.random.boolean(),\n    isDefault: false,\n  };\n};\n\nconst generateUsersCommunities = (communityId, userId) => {\n  const isOwner = faker.random.boolean();\n  // for ease of use, set to false\n  const isModerator = false;\n  // if user is either an admin or moderator, they have to be a member\n  // otherwise random chance\n  const isMember = isOwner || isModerator ? true : faker.random.boolean();\n  // might be blocked as long as they aren't an admin, mod, or member\n  const isBlocked =\n    isOwner || isModerator || isMember ? false : faker.random.boolean();\n\n  return {\n    id: uuid(),\n    createdAt: faker.date.past(2),\n    communityId,\n    userId,\n    isOwner,\n    isModerator,\n    isMember,\n    isBlocked,\n    receiveNotifications: true,\n    reputation: 1,\n  };\n};\n\nconst generateUsersChannels = (channels, usersCommunities, userId) => {\n  // figure out which communities the user being evaulated is a member of\n  let possibleCommunities = usersCommunities.filter(\n    elem => elem.userId === userId\n  );\n  // make sure they are a member of the community\n  possibleCommunities = possibleCommunities\n    .filter(elem => elem.isMember || elem.isOwner || elem.isModerator)\n    .map(elem => elem.communityId);\n  let possibleChannels = channels.filter(\n    channel => possibleCommunities.indexOf(channel.communityId) > -1\n  );\n\n  // for each of those communities, construct an array of channels that are in\n  // that community\n  // const possibleChannels = possibleCommunities.map(community => channels.filter(channel => channel.communityId === community.id))\n\n  // for each of hte possible channels, generate a new usersChannels object\n  const foo = possibleChannels.map(channel => {\n    const isOwner = faker.random.boolean();\n    // for ease of use, set to false\n    const isModerator = false;\n    // if user is either an admin or moderator, they have to be a member\n    // otherwise random chance\n    const isMember = isOwner || isModerator ? true : faker.random.boolean();\n    // if a user is admin, mod, or member, they can't be pending, otherwise random\n    const isPending =\n      isOwner || isModerator || isMember ? false : faker.random.boolean();\n    // might be blocked as long as they aren't an admin, mod, pending, or member\n    const isBlocked =\n      isOwner || isModerator || isMember || isPending\n        ? false\n        : faker.random.boolean();\n\n    return {\n      id: uuid(),\n      createdAt: new Date(),\n      channelId: channel.id,\n      userId,\n      isOwner,\n      isModerator,\n      isMember,\n      isBlocked,\n      isPending,\n      receiveNotifications: true,\n    };\n  });\n  return foo;\n};\n\nconst generateThread = (communityId, channelId, creatorId) => {\n  const content = {\n    title: casual.title(),\n    body: JSON.stringify(toJSON(fromPlainText(casual.text()))),\n  };\n\n  const createdAt = faker.date.past(2);\n\n  return {\n    id: uuid(),\n    createdAt,\n    creatorId,\n    channelId,\n    communityId,\n    isPublished: faker.random.boolean(),\n    content,\n    type: 'DRAFTJS',\n    lastActive: faker.date.between(createdAt, new Date()),\n    edits: [\n      {\n        timestamp: createdAt,\n        content,\n      },\n    ],\n    modifiedAt: faker.date.between(createdAt, new Date()),\n  };\n};\n\nconst generateUsersThreads = (threadId, userId) => {\n  const createdAt = faker.date.past(2);\n\n  return {\n    id: uuid(),\n    createdAt,\n    threadId,\n    userId,\n    isParticipant: true,\n    receiveNotifications: true,\n  };\n};\n\nconst generateDirectMessageThread = users => {\n  const createdAt = faker.date.past(2);\n  const threadLastActive = faker.date.between(createdAt, faker.date.recent());\n\n  return {\n    id: uuid(),\n    name: null,\n    createdAt,\n    threadLastActive,\n  };\n};\n\nconst generateUsersDirectMessageThreads = (threadId, userId) => {\n  const createdAt = faker.date.past(2);\n  const lastActive = faker.date.between(createdAt, faker.date.recent());\n  const lastSeen = faker.date.between(createdAt, new Date());\n\n  return {\n    id: uuid(),\n    createdAt,\n    threadId,\n    userId,\n    lastActive,\n    lastSeen,\n    receiveNotifications: true,\n  };\n};\n\nconst generateMessage = (senderId, threadId, threadType) => {\n  return {\n    id: uuid(),\n    threadType,\n    threadId,\n    senderId,\n    content: {\n      body: casual.text(),\n    },\n    messageType: 'text',\n    timestamp: faker.date.past(2),\n  };\n};\n\nconst generateReaction = (userId, messageId) => {\n  return {\n    id: uuid(),\n    messageId,\n    userId,\n    timestamp: faker.date.past(2),\n    type: 'like',\n  };\n};\n\nmodule.exports = {\n  randomAmount,\n  generateUser,\n  generateUsersSettings,\n  generateCommunity,\n  generateChannel,\n  generateUsersCommunities,\n  generateUsersChannels,\n  generateUsersDirectMessageThreads,\n  generateThread,\n  generateUsersThreads,\n  generateMessage,\n  generateReaction,\n  generateDirectMessageThread,\n};\n"
  },
  {
    "path": "api/migrations/seed/index.js",
    "content": "// @flow\nconst faker = require('faker');\nconst debug = require('debug')('api:migrations:seed');\nconst { v4: uuid } = require('uuid');\nconst {\n  defaultCommunities,\n  defaultUsers,\n  defaultChannels,\n  defaultThreads,\n  defaultUsersThreads,\n  defaultDirectMessageThreads,\n  defaultUsersDirectMessageThreads,\n  defaultUsersCommunities,\n  defaultUsersChannels,\n  defaultMessages,\n} = require('./default/index');\n\nconst {\n  randomAmount,\n  generateUser,\n  generateUsersSettings,\n  generateCommunity,\n  generateChannel,\n  generateUsersCommunities,\n  generateUsersChannels,\n  generateThread,\n  generateUsersThreads,\n  generateDirectMessageThread,\n  generateUsersDirectMessageThreads,\n  generateMessage,\n  generateReaction,\n} = require('./generate');\n\nconst userAmount = faker.random.number(1000);\nconst users = [\n  ...defaultUsers,\n  ...randomAmount({ max: userAmount, min: 1 }, generateUser),\n];\n\nconst usersSettings = [];\nusers.forEach(user => {\n  usersSettings.push(generateUsersSettings(user.id));\n});\n\ndebug('Generating communities...');\nconst communities = [\n  ...defaultCommunities,\n  ...randomAmount({ min: 10, max: 20 }, () => {\n    return generateCommunity();\n  }),\n];\n\ndebug('Generating usersCommunities...');\nlet usersCommunities = [];\nusers.forEach(user => {\n  communities.forEach(community => {\n    usersCommunities.push(generateUsersCommunities(community.id, user.id));\n  });\n});\n\ndebug('Generating channels...');\nlet channels = defaultChannels;\ncommunities.forEach(community => {\n  if (community.deletedAt) return;\n  randomAmount({ max: 10 }, () => {\n    channels.push(generateChannel(community.id));\n  });\n});\n\ndebug('Generating usersChannels...');\nlet usersChannels = defaultUsersChannels;\nconst generatedUsersChannels = users.map(user => {\n  return generateUsersChannels(channels, usersCommunities, user.id);\n});\ngeneratedUsersChannels.map(elem => {\n  usersChannels.push(...elem);\n});\n\ndebug('Generating threads...');\nlet threads = defaultThreads;\nchannels.forEach(channel => {\n  const community = communities.find(\n    community => community.id === channel.communityId\n  );\n  if (community.deletedAt) return;\n\n  randomAmount({ max: 10 }, () => {\n    const creator = faker.random.arrayElement(users);\n    const thread = generateThread(channel.communityId, channel.id, creator.id);\n    threads.push(thread);\n  });\n});\n\nlet usersThreads = defaultUsersThreads;\nthreads.forEach(thread => {\n  const usersThread = generateUsersThreads(thread.id, thread.creatorId);\n  usersThreads.push(usersThread);\n});\n\ndebug('Generating direct message threads...');\nlet directMessageThreads = defaultDirectMessageThreads;\nrandomAmount({ max: 100 }, () => {\n  directMessageThreads.push(generateDirectMessageThread());\n});\n\ndebug('Generating usersDirectMessageThreads...');\nlet usersDirectMessageThreads = defaultUsersDirectMessageThreads;\ndirectMessageThreads.forEach(thread => {\n  const thread_users = randomAmount({ max: 5, min: 2 }, i => users[i]);\n\n  thread_users.forEach(user => {\n    usersDirectMessageThreads.push(\n      generateUsersDirectMessageThreads(thread.id, user.id)\n    );\n  });\n});\n\ndebug('Generating messages...');\nlet messages = defaultMessages;\nthreads.forEach(thread => {\n  const channel = channels.find(channel => channel.id === thread.channelId);\n  const threadMessages = [];\n  randomAmount({ max: 10 }, () => {\n    const sender = faker.random.arrayElement(users);\n    const message = generateMessage(sender.id, thread.id, 'story');\n    messages.push(message);\n    threadMessages.push(message);\n  });\n});\n\ndebug('Generating direct messages...');\nlet direct_messages = [];\nusersDirectMessageThreads.forEach(thread => {\n  const threadMessages = [];\n  const sender = thread.userId;\n  randomAmount({ max: 100 }, () => {\n    const message = generateMessage(\n      sender,\n      thread.threadId,\n      'directMessageThread'\n    );\n    direct_messages.push(message);\n    threadMessages.push(message);\n  });\n});\n\ndebug('Generating reactions...');\nlet reactions = [];\nmessages.map(message => {\n  randomAmount({ max: 5 }, () => {\n    const user = faker.random.arrayElement(users);\n    reactions.push(generateReaction(user.id, message.id));\n  });\n});\n\ndebug('Connecting to db...');\n// $FlowFixMe\nconst db = require('rethinkhaberdashery')({\n  db: 'spectrum',\n});\n\ndebug(\n  `Inserting ${users.length} users,\n  ${communities.length} communities, ${channels.length} channels, ${\n    threads.length\n  } threads, ${messages.length + direct_messages.length} messages, ${\n    reactions.length\n  } reactions, ${directMessageThreads.length} direct message threads, ${\n    usersCommunities.length\n  } usersCommunities objects, ${\n    usersChannels.length\n  } usersChannels objects, and ${\n    usersDirectMessageThreads.length\n  } usersDirectMessageThreads objects into the database... (this might take a while!)`\n);\nPromise.all([\n  db\n    .table('communities')\n    .insert(communities)\n    .run(),\n  db\n    .table('channels')\n    .insert(channels)\n    .run(),\n  db\n    .table('threads')\n    .insert(threads)\n    .run(),\n  db\n    .table('messages')\n    .insert(messages)\n    .run(),\n  db\n    .table('users')\n    .insert(users)\n    .run(),\n  db\n    .table('usersSettings')\n    .insert(usersSettings)\n    .run(),\n  db\n    .table('reactions')\n    .insert(reactions)\n    .run(),\n  db\n    .table('directMessageThreads')\n    .insert(directMessageThreads)\n    .run(),\n  db\n    .table('messages')\n    .insert(direct_messages)\n    .run(),\n  db\n    .table('usersCommunities')\n    .insert(usersCommunities)\n    .run(),\n  db\n    .table('usersChannels')\n    .insert(usersChannels)\n    .run(),\n  db\n    .table('usersDirectMessageThreads')\n    .insert(usersDirectMessageThreads)\n    .run(),\n  db\n    .table('usersThreads')\n    .insert(usersThreads)\n    .run(),\n])\n  .then(() => {\n    debug('Finished seeding database! 🎉');\n    process.exit();\n  })\n  .catch(err => {\n    debug(\n      'Encountered error while inserting data (see below), please run yarn run db:drop and yarn run db:migrate to restore tables to original condition, then run this script again.'\n    );\n    console.error('❌ Error in job:\\n');\n    console.error(err);\n  });\n"
  },
  {
    "path": "api/models/channel.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport type { DBChannel } from 'shared/types';\n\n// reusable query parts -- begin\nconst channelsByCommunitiesQuery = (...communityIds: string[]) =>\n  db\n    .table('channels')\n    .getAll(...communityIds, { index: 'communityId' })\n    .filter(channel => channel.hasFields('deletedAt').not());\n\nconst channelsByIdsQuery = (...channelIds: string[]) =>\n  db\n    .table('channels')\n    .getAll(...channelIds)\n    .filter(channel => channel.hasFields('deletedAt').not());\n\nconst threadsByChannelsQuery = (...channelIds: string[]) =>\n  channelsByIdsQuery(...channelIds)\n    .eqJoin('id', db.table('threads'), { index: 'channelId' })\n    .map(row => row('right'))\n    .filter(thread => db.not(thread.hasFields('deletedAt')));\n\nconst membersByChannelsQuery = (...channelIds: string[]) =>\n  channelsByIdsQuery(...channelIds)\n    .eqJoin('id', db.table('usersChannels'), { index: 'channelId' })\n    .map(row => row('right'))\n    .filter({ isBlocked: false, isPending: false, isMember: true });\n\n// reusable query parts -- end\n\n// prettier-ignore\nconst getChannelsByCommunity = (communityId: string): Promise<Array<DBChannel>> => {\n  return channelsByCommunitiesQuery(communityId).run();\n};\n\n/*\n  If a non-user is viewing a community page, they should only see threads\n  from public channels. We use this function to return an array of channelIds\n  that are public, and pass them into a getThreads function\n*/\n// prettier-ignore\nconst getPublicChannelsByCommunity = (communityId: string): Promise<Array<string>> => {\n  return channelsByCommunitiesQuery(communityId)\n    .filter({ isPrivate: false })\n    .filter(row => row.hasFields('archivedAt').not())\n    .map(c => c('id'))\n    .run();\n};\n\n/*\n  If a user is viewing a community, they should see threads from all public channels as well as from private channels they are a member of.\n\n  This function returns an array of objects with the field 'id' that corresponds\n  to a channelId. This array of IDs will be passed into a threads method which\n  will only return threads in those channels\n*/\n// prettier-ignore\nconst getChannelsByUserAndCommunity = async (communityId: string, userId: string): Promise<Array<string>> => {\n  const channels = await channelsByCommunitiesQuery(communityId).run();\n  const unarchived = channels.filter(channel => !channel.archivedAt)\n  const channelIds = unarchived.map(channel => channel.id)\n  \n  return db\n    .table('usersChannels')\n    .getAll(...channelIds.map(id => ([userId, id])), {\n      index: 'userIdAndChannelId',\n    })\n    .filter({ isMember: true })('channelId')\n    .run();\n};\n\nconst getChannelsByUser = (userId: string): Promise<Array<DBChannel>> => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, 'member'], [userId, 'moderator'], [userId, 'owner'], {\n      index: 'userIdAndRole',\n    })\n    .eqJoin('channelId', db.table('channels'))\n    .without({ left: ['id', 'channelId', 'userId', 'createdAt'] })\n    .zip()\n    .filter(channel => db.not(channel.hasFields('deletedAt')))\n    .run();\n};\n\nconst getChannelBySlug = async (\n  channelSlug: string,\n  communitySlug: string\n): Promise<?DBChannel> => {\n  const [communityId] = await db\n    .table('communities')\n    .getAll(communitySlug, { index: 'slug' })('id')\n    .run();\n\n  if (!communityId) return null;\n\n  return db\n    .table('channels')\n    .getAll(communityId, { index: 'communityId' })\n    .filter(channel =>\n      channel('slug')\n        .eq(channelSlug)\n        .and(db.not(channel.hasFields('deletedAt')))\n    )\n    .run()\n    .then(res => {\n      if (Array.isArray(res) && res.length > 0) return res[0];\n      return null;\n    });\n};\n\nconst getChannelById = async (id: string) => {\n  return (await channelsByIdsQuery(id).run())[0] || null;\n};\n\ntype GetChannelByIdArgs = {|\n  id: string,\n|};\n\ntype GetChannelBySlugArgs = {|\n  slug: string,\n  communitySlug: string,\n|};\n\nexport type GetChannelArgs = GetChannelByIdArgs | GetChannelBySlugArgs;\n\nconst getChannels = (channelIds: Array<string>): Promise<Array<DBChannel>> => {\n  return channelsByIdsQuery(...channelIds).run();\n};\n\nexport type EditChannelInput = {\n  input: {\n    channelId: string,\n    name: string,\n    description: string,\n    slug: string,\n    isPrivate: Boolean,\n  },\n};\n\n// prettier-ignore\nconst editChannel = async ({ input }: EditChannelInput): Promise<DBChannel> => {\n  const { name, slug, description, isPrivate, channelId } = input;\n\n  const channelRecord = await db\n    .table('channels')\n    .get(channelId)\n    .run()\n    .then(result => {\n      return Object.assign({}, result, {\n        name,\n        description,\n        slug,\n        isPrivate,\n      });\n    });\n\n  return db\n    .table('channels')\n    .get(channelId)\n    .update({ ...channelRecord }, { returnChanges: 'always' })\n    .run()\n    .then(result => {\n      // if an update happened\n      if (result.replaced === 1) {\n        return result.changes[0].new_val;\n      }\n\n      // an update was triggered from the client, but no data was changed\n      if (result.unchanged === 1) {\n        return result.changes[0].old_val;\n      }\n\n      return null;\n    });\n};\n\nconst deleteChannel = (channelId: string, userId: string): Promise<Boolean> => {\n  return db\n    .table('channels')\n    .get(channelId)\n    .update(\n      {\n        deletedBy: userId,\n        deletedAt: new Date(),\n        slug: db.uuid(),\n      },\n      {\n        returnChanges: true,\n        nonAtomic: true,\n      }\n    )\n    .run();\n};\n\nconst setMemberCount = (\n  channelId: string,\n  value: number\n): Promise<DBChannel> => {\n  return db\n    .table('channels')\n    .get(channelId)\n    .update(\n      {\n        memberCount: value,\n      },\n      { returnChanges: true }\n    )\n    .run()\n    .then(result => result.changes[0].new_val || result.changes[0].old_val);\n};\n\nconst decrementMemberCount = (channelId: string): Promise<DBChannel> => {\n  return db\n    .table('channels')\n    .get(channelId)\n    .update(\n      {\n        memberCount: db\n          .row('memberCount')\n          .default(1)\n          .sub(1),\n      },\n      { returnChanges: true }\n    )\n    .run()\n    .then(result => result.changes[0].new_val || result.changes[0].old_val);\n};\n\ntype GroupedCount = {\n  group: string,\n  reduction: number,\n};\n\n// prettier-ignore\nconst getChannelsThreadCounts = (channelIds: Array<string>): Promise<Array<GroupedCount>> => {\n  return threadsByChannelsQuery(...channelIds)\n    .group('channelId')\n    .count()\n    .run();\n};\n\nmodule.exports = {\n  getChannelBySlug,\n  getChannelById,\n  getChannelsByUser,\n  getChannelsByCommunity,\n  getPublicChannelsByCommunity,\n  getChannelsByUserAndCommunity,\n  editChannel,\n  deleteChannel,\n  getChannels,\n  setMemberCount,\n  decrementMemberCount,\n  getChannelsThreadCounts,\n  __forQueryTests: {\n    channelsByCommunitiesQuery,\n    channelsByIdsQuery,\n    threadsByChannelsQuery,\n    membersByChannelsQuery,\n  },\n};\n"
  },
  {
    "path": "api/models/channelSettings.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport type { DBChannelSettings } from 'shared/types';\n\nconst defaultSettings = {\n  joinSettings: {\n    tokenJoinEnabled: false,\n    token: null,\n  },\n  slackSettings: {\n    botLinks: {\n      threadCreated: null,\n    },\n  },\n};\n\n// prettier-ignore\nexport const getChannelsSettings = (channelIds: Array<string>): Promise<?DBChannelSettings> => {\n  return db\n    .table('channelSettings')\n    .getAll(...channelIds, { index: 'channelId' })\n    .run()\n    .then(data => {\n      if (!data || data.length === 0)\n        return Array.from({ length: channelIds.length }, (_, index) => ({\n          ...defaultSettings,\n          channelId: channelIds[index],\n        }));\n\n      return data.map(\n        (rec, index) =>\n          rec\n            ? rec\n            : {\n                ...defaultSettings,\n                channelId: channelIds[index],\n              }\n      );\n    });\n};\n"
  },
  {
    "path": "api/models/community.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport intersection from 'lodash.intersection';\nimport { uploadImage } from '../utils/file-storage';\nimport getRandomDefaultPhoto from '../utils/get-random-default-photo';\nimport type { DBCommunity } from 'shared/types';\n\nexport const getCommunityById = (id: string): Promise<DBCommunity> => {\n  return db\n    .table('communities')\n    .get(id)\n    .run()\n    .then(result => {\n      if (result && result.deletedAt) return null;\n      return result;\n    });\n};\n\n// prettier-ignore\nexport const getCommunities = (communityIds: Array<string>): Promise<Array<DBCommunity>> => {\n  return db\n    .table('communities')\n    .getAll(...communityIds)\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run();\n};\n\n// prettier-ignore\nexport const getCommunitiesBySlug = (slugs: Array<string>): Promise<Array<DBCommunity>> => {\n  return db\n    .table('communities')\n    .getAll(...slugs, { index: 'slug' })\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run();\n};\n\nexport const getCommunityBySlug = (slug: string): Promise<?DBCommunity> => {\n  return db\n    .table('communities')\n    .getAll(slug, { index: 'slug' })\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run()\n    .then(results => {\n      if (!results || results.length === 0) return null;\n      return results[0];\n    });\n};\n\n// prettier-ignore\nexport const getCommunitiesByUser = (userId: string): Promise<Array<DBCommunity>> => {\n  return (\n    db\n      .table('usersCommunities')\n      // get all the user's communities\n      .getAll([userId, true], { index: 'userIdAndIsMember' })\n      // get the community objects for each community\n      .eqJoin('communityId', db.table('communities'))\n      // get rid of unnecessary info from the usersCommunities object on the left\n      .without({ left: ['id', 'communityId', 'userId', 'createdAt'] })\n      // zip the tables\n      .zip()\n      // ensure we don't return any deleted communities\n      .filter(community => db.not(community.hasFields('deletedAt')))\n      .run()\n  );\n};\n\n// prettier-ignore\nexport const getVisibleCommunitiesByUser = async (evaluatingUserId: string, currentUserId: string) => {\n  const evaluatingUserMemberships = await db\n    .table('usersCommunities')\n    // get all the user's communities\n    .getAll([evaluatingUserId, true], { index: 'userIdAndIsMember' })\n    // get the community objects for each community\n    .eqJoin('communityId', db.table('communities'))\n    // get rid of unnecessary info from the usersCommunities object on the left\n    .without({ left: ['id', 'communityId', 'userId', 'createdAt'] })\n    // zip the tables\n    .zip()\n    // ensure we don't return any deleted communities\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run()\n\n  const currentUserMemberships = await db\n    .table('usersCommunities')\n    // get all the user's communities\n    .getAll([currentUserId, true], { index: 'userIdAndIsMember' })\n    // get the community objects for each community\n    .eqJoin('communityId', db.table('communities'))\n    // get rid of unnecessary info from the usersCommunities object on the left\n    .without({ left: ['id', 'communityId', 'userId', 'createdAt'] })\n    // zip the tables\n    .zip()\n    // ensure we don't return any deleted communities\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run()\n\n  const evaluatingUserCommunityIds = evaluatingUserMemberships.map(community => community.id)\n  const currentUserCommunityIds = currentUserMemberships.map(community => community.id)\n  const publicCommunityIds = evaluatingUserMemberships\n    .filter(community => !community.isPrivate)\n    .map(community => community.id)\n\n  const overlappingMemberships = intersection(evaluatingUserCommunityIds, currentUserCommunityIds)\n  const allVisibleCommunityIds = [...publicCommunityIds, ...overlappingMemberships]\n  const distinctCommunityIds = allVisibleCommunityIds.filter((x, i, a) => a.indexOf(x) === i)\n\n  return await db\n    .table('communities')\n    .getAll(...distinctCommunityIds)\n    .run()\n}\n\nexport const getPublicCommunitiesByUser = async (userId: string) => {\n  return await db\n    .table('usersCommunities')\n    // get all the user's communities\n    .getAll([userId, true], { index: 'userIdAndIsMember' })\n    // get the community objects for each community\n    .eqJoin('communityId', db.table('communities'))\n    // only return public community ids\n    .filter(row => row('right')('isPrivate').eq(false))\n    // get rid of unnecessary info from the usersCommunities object on the left\n    .without({ left: ['id', 'communityId', 'userId', 'createdAt'] })\n    // zip the tables\n    .zip()\n    // ensure we don't return any deleted communities\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .run();\n};\n\nexport const getCommunitiesChannelCounts = (communityIds: Array<string>) => {\n  return db\n    .table('channels')\n    .getAll(...communityIds, { index: 'communityId' })\n    .filter(channel => db.not(channel.hasFields('deletedAt')))\n    .group('communityId')\n    .count()\n    .run();\n};\n\nexport const getCommunitiesMemberCounts = (communityIds: Array<string>) => {\n  return db\n    .table('usersCommunities')\n    .getAll(...communityIds.map(id => [id, true]), {\n      index: 'communityIdAndIsMember',\n    })\n    .group('communityId')\n    .count()\n    .run();\n};\n\nexport type EditCommunityInput = {\n  input: {\n    name: string,\n    slug: string,\n    description: string,\n    website: string,\n    file: Object,\n    coverFile: Object,\n    coverPhoto: string,\n    communityId: string,\n    watercoolerId?: boolean,\n  },\n};\n\n// prettier-ignore\nexport const editCommunity = async ({ input }: EditCommunityInput, userId: string): Promise<DBCommunity> => {\n  const { name, slug, description, website, watercoolerId, file, coverPhoto, coverFile, communityId } = input\n\n  let community = await db.table('communities').get(communityId).run()\n\n  // if the input comes in with a coverPhoto of length 0 (empty string), it means\n  // the user was trying to delete or reset their cover photo from the front end.\n  // in this case we can just set a new default. Otherwise, just keep their\n  // original cover photo\n  let updatedCoverPhoto = community.coverPhoto\n  if (input.coverPhoto.length === 0) {\n    ({ coverPhoto: updatedCoverPhoto } = getRandomDefaultPhoto())\n  }\n\n  return db\n    .table('communities')\n    .get(communityId)\n    .update({\n      ...community,\n      name,\n      slug,\n      description,\n      website,\n      watercoolerId: watercoolerId || community.watercoolerId,\n      coverPhoto: coverFile \n        ? await uploadImage(coverFile, 'communities', community.id) \n        : updatedCoverPhoto,\n      profilePhoto: file \n        ? await uploadImage(file, 'communities', community.id) \n        : community.profilePhoto,\n      modifiedAt: new Date()\n    }, { returnChanges: 'always' })\n    .run()\n    .then(result => {\n      if (result.replaced === 1) {\n        community = result.changes[0].new_val;\n      }\n\n      // an update was triggered from the client, but no data was changed\n      if (result.unchanged === 1) {\n        community = result.changes[0].old_val;\n      }\n\n      return community\n    })\n};\n\nexport const toggleCommunityRedirect = async (communityId: string) => {\n  const community = await db.table('communities').get(communityId);\n  if (!community) return null;\n\n  return db\n    .table('communities')\n    .get(communityId)\n    .update(\n      {\n        redirect: !community.redirect,\n      },\n      {\n        returnChanges: true,\n      }\n    )\n    .then(result => {\n      if (!Array.isArray(result.changes) || result.changes.length === 0)\n        return getCommunityById(communityId);\n      return result.changes[0].new_val;\n    });\n};\n\nexport const toggleCommunityNoindex = async (communityId: string) => {\n  const community = await db.table('communities').get(communityId);\n  if (!community) return null;\n\n  return db\n    .table('communities')\n    .get(communityId)\n    .update(\n      {\n        noindex: !community.noindex,\n      },\n      {\n        returnChanges: true,\n      }\n    )\n    .then(result => {\n      if (!Array.isArray(result.changes) || result.changes.length === 0)\n        return getCommunityById(communityId);\n      return result.changes[0].new_val;\n    });\n};\n\n// prettier-ignore\nexport const deleteCommunity = (communityId: string, userId: string): Promise<DBCommunity> => {\n  return db\n    .table('communities')\n    .get(communityId)\n    .update(\n      {\n        deletedBy: userId,\n        deletedAt: new Date(),\n        slug: db.uuid(),\n      },\n      {\n        returnChanges: 'always',\n        nonAtomic: true,\n      }\n    )\n    .run()\n};\n\n// prettier-ignore\nexport const userIsMemberOfAnyChannelInCommunity = (communityId: string, userId: string): Promise<Boolean> => {\n  return db('spectrum')\n    .table('channels')\n    .getAll(communityId, { index: 'communityId' })\n    .eqJoin('id', db.table('usersChannels'), { index: 'channelId' })\n    .zip()\n    .filter({ userId })\n    .pluck('isMember')\n    .run()\n    .then(channels => channels.some(channel => channel.isMember));\n};\n\nexport const getRecentCommunities = (): Array<DBCommunity> => {\n  return db\n    .table('communities')\n    .orderBy({ index: db.desc('createdAt') })\n    .filter(community => db.not(community.hasFields('deletedAt')))\n    .limit(100)\n    .run();\n};\n\nexport const getThreadCount = (communityId: string) => {\n  return db\n    .table('threads')\n    .getAll(communityId, { index: 'communityId' })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .count()\n    .run();\n};\n\nexport const setMemberCount = (\n  communityId: string,\n  value: number\n): Promise<DBCommunity> => {\n  return db\n    .table('communities')\n    .get(communityId)\n    .update(\n      {\n        memberCount: value,\n      },\n      { returnChanges: true }\n    )\n    .run()\n    .then(result => result.changes[0].new_val || result.changes[0].old_val);\n};\n\nexport const decrementMemberCount = (\n  communityId: string\n): Promise<DBCommunity> => {\n  return db\n    .table('communities')\n    .get(communityId)\n    .update(\n      {\n        memberCount: db\n          .row('memberCount')\n          .default(1)\n          .sub(1),\n      },\n      { returnChanges: true }\n    )\n    .run()\n    .then(result => result.changes[0].new_val || result.changes[0].old_val);\n};\n"
  },
  {
    "path": "api/models/communitySettings.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport type { DBCommunitySettings } from 'shared/types';\n\nconst defaultSettings = {\n  brandedLogin: {\n    isEnabled: false,\n    message: null,\n  },\n  slackSettings: {\n    connectedAt: null,\n    connectedBy: null,\n    teamName: null,\n    teamId: null,\n    scope: null,\n    token: null,\n    invitesSentAt: null,\n    invitesMemberCount: null,\n    invitesCustomMessage: null,\n  },\n  joinSettings: {\n    tokenJoinEnabled: false,\n    token: null,\n  },\n};\n\n// prettier-ignore\nexport const getCommunitySettings = (id: string): Promise<DBCommunitySettings> => {\n  return db\n    .table('communitySettings')\n    .getAll(id, { index: 'communityId' })\n    .run()\n    .then(data => {\n      if (!data || data.length === 0) {\n        return defaultSettings;\n      }\n      return data[0];\n    });\n};\n\n// prettier-ignore\nexport const getCommunitiesSettings = (communityIds: Array<string>): Promise<?DBCommunitySettings> => {\n  return db\n    .table('communitySettings')\n    .getAll(...communityIds, { index: 'communityId' })\n    .run()\n    .then(data => {\n      if (!data || data.length === 0) {\n        return Array.from({ length: communityIds.length }, (_, index) => ({\n          ...defaultSettings,\n          communityId: communityIds[index],\n        }));\n      }\n\n      if (data.length === communityIds.length) {\n        return data.map(\n          (rec, index) =>\n            rec\n              ? rec\n              : {\n                  ...defaultSettings,\n                  communityId: communityIds[index],\n                }\n        );\n      }\n\n      if (data.length < communityIds.length) {\n        return communityIds.map(communityId => {\n          const record = data.find(o => o.communityId === communityId);\n          if (record) return record;\n          return {\n            ...defaultSettings,\n            communityId,\n          };\n        });\n      }\n\n      if (data.length > communityIds.length) {\n        return communityIds.map(communityId => {\n          const record = data.find(o => o.communityId === communityId);\n          if (record) return record;\n          return {\n            ...defaultSettings,\n            communityId,\n          };\n        });\n      }\n    });\n};\n"
  },
  {
    "path": "api/models/curatedContent.js",
    "content": "//@flow\nconst { db } = require('shared/db');\nimport type { DBCommunity } from 'shared/types';\nimport { getCommunitiesBySlug } from './community';\n\n// prettier-ignore\nexport const getCuratedCommunities = (type: string): Promise<Array<DBCommunity>> => {\n  return db\n    .table('curatedContent')\n    .filter({ type })\n    .run()\n    .then(results => (results && results.length > 0 ? results[0] : null))\n    .then(result => result && getCommunitiesBySlug(result.data));\n};\n"
  },
  {
    "path": "api/models/directMessageThread.js",
    "content": "//@flow\nconst { db } = require('shared/db');\n\nexport type DBDirectMessageThread = {\n  createdAt: Date,\n  id: string,\n  name?: string,\n  threadLastActive: Date,\n};\n\n// prettier-ignore\nconst checkForExistingDMThread = async (participants: Array<string>): Promise<?string> => {\n  // return a list of all threadIds where both participants are active\n  let idsToCheck = await db\n    .table('usersDirectMessageThreads')\n    .getAll(...participants, { index: 'userId' })\n    .group('threadId')\n    .map(row => row('userId'))\n    .ungroup()\n    .filter(row =>\n      row('reduction')\n        .count()\n        .eq(participants.length)\n    )\n    .pluck('group')\n    .run();\n\n  if (!idsToCheck || idsToCheck.length === 0) return null;\n\n  // return only the thread Ids\n  idsToCheck = idsToCheck.map(row => row.group);\n\n  // given a list of threads where both users are active (includes all groups)\n  // return only threads where these exact participants are used\n  return await db\n    .table('usersDirectMessageThreads')\n    .getAll(...idsToCheck, { index: 'threadId' })\n    .group('threadId')\n    .ungroup()\n    .filter(row =>\n      row('reduction')\n        .count()\n        .eq(participants.length)\n    )\n    .pluck('group')\n    .map(row => row('group'))\n    .run()\n    .then(results => (results && results.length > 0 ? results[0] : null));\n};\n\n// prettier-ignore\nconst getDirectMessageThread = (directMessageThreadId: string): Promise<DBDirectMessageThread> => {\n  return db\n    .table('directMessageThreads')\n    .get(directMessageThreadId)\n    .run()\n    .then(res => res && !res.deletedAt ? res : null);\n};\n\n// prettier-ignore\nconst getDirectMessageThreads = (ids: Array<string>): Promise<Array<DBDirectMessageThread>> => {\n  return db\n    .table('directMessageThreads')\n    .getAll(...ids)\n    .filter(row => row.hasFields('deletedAt').not())\n    .run();\n};\n\nconst getDirectMessageThreadsByUser = (\n  userId: string,\n  // $FlowFixMe\n  { first, after }\n): Promise<Array<DBDirectMessageThread>> => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(userId, { index: 'userId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .eqJoin('threadId', db.table('directMessageThreads'))\n    .without({\n      left: ['id', 'createdAt', 'threadId', 'userId', 'lastActive', 'lastSeen'],\n    })\n    .zip()\n    .orderBy(db.desc('threadLastActive'))\n    .skip(after || 0)\n    .limit(first)\n    .run();\n};\n\nmodule.exports = {\n  checkForExistingDMThread,\n  getDirectMessageThread,\n  getDirectMessageThreads,\n  getDirectMessageThreadsByUser,\n};\n"
  },
  {
    "path": "api/models/message.js",
    "content": "//@flow\nconst { db } = require('shared/db');\nimport { incrementMessageCount, decrementMessageCount } from './thread';\nimport type { DBMessage } from 'shared/types';\n\nexport type MessageTypes = 'text' | 'media';\n\nexport const getMessage = (messageId: string): Promise<DBMessage> => {\n  return db\n    .table('messages')\n    .get(messageId)\n    .run()\n    .then(message => {\n      if (!message || message.deletedAt) return null;\n      return message;\n    });\n};\n\nexport const getManyMessages = (messageIds: string[]): Promise<DBMessage[]> => {\n  return db\n    .table('messages')\n    .getAll(...messageIds)\n    .run()\n    .then(messages => {\n      return messages.filter(message => message && !message.deletedAt);\n    });\n};\n\ntype BackwardsPaginationOptions = { last?: number, before?: number | Date };\n\n// prettier-ignore\nconst getBackwardsMessages = (threadId: string, { last, before }: BackwardsPaginationOptions) => {\n  return db\n    .table('messages')\n    .between(\n      [threadId, db.minval],\n      [threadId, before ? new Date(before) : db.maxval],\n      { index: 'threadIdAndTimestamp' }\n    )\n    .orderBy({ index: db.desc('threadIdAndTimestamp') })\n    .filter(db.row.hasFields('deletedAt').not())\n    .limit(last || 0)\n    .run();\n};\n\ntype ForwardsPaginationOptions = { first?: number, after?: number | Date };\n\n// prettier-ignore\nconst getForwardMessages = (threadId: string, { first, after }: ForwardsPaginationOptions) => {\n  return db\n    .table('messages')\n    .between(\n      [threadId, after ? new Date(after) : db.minval],\n      [threadId, db.maxval],\n      { index: 'threadIdAndTimestamp', leftBound: 'open', rightBound: 'closed' }\n    )\n    .orderBy({ index: 'threadIdAndTimestamp' })\n    .filter(db.row.hasFields('deletedAt').not())\n    .limit(first || 0)\n    .run();\n};\n\nexport const getMessages = (\n  threadId: string,\n  {\n    first,\n    after,\n    last,\n    before,\n  }: { ...BackwardsPaginationOptions, ...ForwardsPaginationOptions }\n): Promise<Array<DBMessage>> => {\n  // $FlowIssue\n  if (last || before) return getBackwardsMessages(threadId, { last, before });\n  // $FlowIssue\n  return getForwardMessages(threadId, { first, after });\n};\n\nexport const getLastMessage = (threadId: string): Promise<?DBMessage> => {\n  return db\n    .table('messages')\n    .between([threadId, db.minval], [threadId, db.maxval], {\n      index: 'threadIdAndTimestamp',\n      leftBound: 'open',\n      rightBound: 'closed',\n    })\n    .orderBy({ index: db.desc('threadIdAndTimestamp') })\n    .filter(db.row.hasFields('deletedAt').not())\n    .limit(1)\n    .run()\n    .then(res => (Array.isArray(res) && res.length > 0 ? res[0] : null));\n};\n\nexport const getLastMessageOfThreads = (\n  threadIds: Array<string>\n): Promise<Array<?DBMessage>> => {\n  return Promise.all(threadIds.map(id => getLastMessage(id)));\n};\n\n// prettier-ignore\nexport const getMediaMessagesForThread = (threadId: string): Promise<Array<DBMessage>> => {\n  return db\n    .table('messages')\n    .getAll(threadId, { index: 'threadId' })\n    .filter({ messageType: 'media' })\n    .filter(db.row.hasFields('deletedAt').not())\n    .run();\n};\n\nexport const getMessageCount = (threadId: string): Promise<number> => {\n  return db\n    .table('messages')\n    .getAll(threadId, { index: 'threadId' })\n    .filter(db.row.hasFields('deletedAt').not())\n    .count()\n    .run();\n};\n\n// prettier-ignore\nexport const getMessageCountInThreads = (threadIds: Array<string>): Promise<Array<mixed>> => {\n  return db\n    .table('messages')\n    .getAll(...threadIds, { index: 'threadId' })\n    .filter(db.row.hasFields('deletedAt').not())\n    .group('threadId')\n    .count()\n    .run();\n};\n\nexport const deleteMessage = (userId: string, messageId: string) => {\n  return db\n    .table('messages')\n    .get(messageId)\n    .update(\n      {\n        deletedBy: userId,\n        deletedAt: new Date(),\n      },\n      { returnChanges: 'always' }\n    )\n    .run()\n    .then(result => result.changes[0].new_val || result.changes[0].old_val)\n    .then(async message => {\n      await Promise.all([\n        message.threadType === 'story'\n          ? decrementMessageCount(message.threadId)\n          : Promise.resolve(),\n      ]);\n\n      return message;\n    });\n};\n\n// prettier-ignore\nexport const deleteMessagesInThread = async (threadId: string, userId: string) => {\n  const messages = await db\n    .table('messages')\n    .getAll(threadId, { index: 'threadId' })\n    .run();\n\n  if (!messages || messages.length === 0) return;\n\n  const deletePromise = db\n    .table('messages')\n    .getAll(threadId, { index: 'threadId' })\n    .update({\n      deletedBy: userId,\n      deletedAt: new Date(),\n    })\n    .run();\n\n  return await Promise.all([\n    deletePromise,\n  ]).then(() => {\n    return Promise.all(Array.from({ length: messages.length }).map(() => decrementMessageCount(threadId)))\n  });\n};\n\nexport const userHasMessagesInThread = (threadId: string, userId: string) => {\n  return db\n    .table('messages')\n    .getAll(threadId, { index: 'threadId' })\n    .filter(db.row.hasFields('deletedAt').not())('senderId')\n    .contains(userId)\n    .run();\n};\n"
  },
  {
    "path": "api/models/reaction.js",
    "content": "// @flow\nimport { db } from 'shared/db';\nimport type { DBReaction } from 'shared/types';\n\ntype ReactionType = 'like';\n\nexport type ReactionInput = {\n  messageId: string,\n  type: ReactionType,\n};\n\n// prettier-ignore\nexport const getReactions = (messageIds: Array<string>): Promise<Array<DBReaction>> => {\n  const distinctMessageIds = messageIds.filter((x, i, a) => a.indexOf(x) == i);\n  return db\n    .table('reactions')\n    .getAll(...distinctMessageIds, { index: 'messageId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .group('messageId')\n    .run();\n};\n\nexport const getReaction = (reactionId: string): Promise<DBReaction> => {\n  return db\n    .table('reactions')\n    .get(reactionId)\n    .run();\n};\n\n// prettier-ignore\nexport const getReactionsByIds = (reactionIds: Array<string>): Promise<Array<DBReaction>> => {\n  return db\n    .table('reactions')\n    .getAll(...reactionIds)\n    .run();\n};\n"
  },
  {
    "path": "api/models/search.js",
    "content": "//@flow\nconst { db } = require('shared/db');\n\n// prettier-ignore\nexport const getPublicChannelIdsInCommunity = (communityId: string): Promise<Array<string>> => {\n  return db\n    .table('channels')\n    .getAll(communityId, { index: 'communityId' })\n    .filter(row =>\n      row\n        .hasFields('deletedAt')\n        .not()\n        .and(row('isPrivate').eq(false))\n    )\n    .map(row => row('id'))\n    .run();\n};\n\n// prettier-ignore\nexport const getPrivateChannelIdsInCommunity = (communityId: string): Promise<Array<string>> => {\n  return db\n    .table('channels')\n    .getAll(communityId, { index: 'communityId' })\n    .filter(row =>\n      row\n        .hasFields('deletedAt')\n        .not()\n        .and(row('isPrivate').eq(true))\n    )\n    .map(row => row('id'))\n    .run();\n};\n\n// prettier-ignore\nexport const getPublicChannelIdsForUsersThreads = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('threads')\n    .getAll(userId, { index: 'creatorId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .eqJoin('channelId', db.table('channels'))\n    .filter(row => row('right')('isPrivate').eq(false))\n    .zip()\n    .map(row => row('channelId'))\n    .run();\n};\n\nexport const getPublicCommunityIdsForUsersThreads = (\n  userId: string\n): Promise<Array<string>> => {\n  return db\n    .table('threads')\n    .getAll(userId, { index: 'creatorId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .eqJoin('communityId', db.table('communities'))\n    .filter(row => row('right')('isPrivate').eq(false))\n    .zip()\n    .map(row => row('communityId'))\n    .run();\n};\n\n// prettier-ignore\nexport const getPrivateChannelIdsForUsersThreads = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('threads')\n    .getAll(userId, { index: 'creatorId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .eqJoin('channelId', db.table('channels'))\n    .filter(row => row('right')('isPrivate').eq(true))\n    .zip()\n    .map(row => row('channelId'))\n    .run();\n};\n\nexport const getPrivateCommunityIdsForUsersThreads = (\n  userId: string\n): Promise<Array<string>> => {\n  return db\n    .table('threads')\n    .getAll(userId, { index: 'creatorId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .eqJoin('communityId', db.table('communities'))\n    .filter(row => row('right')('isPrivate').eq(true))\n    .zip()\n    .map(row => row('communityId'))\n    .run();\n};\n\n// prettier-ignore\nexport const getUsersJoinedChannels = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, \"member\"], [userId, \"moderator\"], [userId, \"owner\"], { index: 'userIdAndRole' })\n    .eqJoin('channelId', db.table('channels'))\n    .filter(row => row('right').hasFields('deletedAt').not())\n    .zip()\n    .map(row => row('channelId'))\n    .run();\n};\n\n// prettier-ignore\nexport const getUsersJoinedCommunities = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('usersCommunities')\n    .getAll([userId, true], { index: 'userIdAndIsMember' })\n    .eqJoin('communityId', db.table('communities'))\n    .filter(row => row('right').hasFields('deletedAt').not())\n    .zip()\n    .map(row => row('communityId'))\n    .run();\n};\n\n// prettier-ignore\nexport const getUsersJoinedPrivateChannelIds = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, \"member\"], [userId, \"moderator\"], [userId, \"owner\"], { index: 'userIdAndRole' })\n    .eqJoin('channelId', db.table('channels'))\n    .filter(row => row('right')('isPrivate').eq(true).and(row('right').hasFields('deletedAt').not()))\n    .without({ left: ['id'] })\n    .zip()\n    .map(row => row('id'))\n    .run();\n};\n\n// prettier-ignore\nexport const getUsersJoinedPrivateCommunityIds = (userId: string): Promise<Array<string>> => {\n  return db\n    .table('usersCommunities')\n    .getAll([userId, true], { index: 'userIdAndIsMember' })\n    .eqJoin('communityId', db.table('communities'))\n    .filter(row => row('right')('isPrivate').eq(true).and(row('right').hasFields('deletedAt').not()))\n    .without({ left: ['id'] })\n    .zip()\n    .map(row => row('id'))\n    .run();\n};\n"
  },
  {
    "path": "api/models/session.js",
    "content": "// @flow\nimport { db } from 'shared/db';\n\nexport const destroySession = (id: string) => {\n  return db\n    .table('sessions')\n    .get(id)\n    .delete()\n    .run();\n};\n"
  },
  {
    "path": "api/models/test/__snapshots__/channel.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`models/channel getChannels excludes deleted channels 1`] = `\nArray [\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"General chatter\",\n    \"id\": \"1\",\n    \"isDefault\": true,\n    \"isPrivate\": false,\n    \"memberCount\": 5,\n    \"name\": \"General\",\n    \"slug\": \"general\",\n  },\n]\n`;\n\nexports[`models/channel getChannelsByCommunity returns correct set of channels 1`] = `\nArray [\n  Object {\n    \"archivedAt\": 2016-12-31T23:00:00.000Z,\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Testing archiving\",\n    \"id\": \"5\",\n    \"isDefault\": true,\n    \"isPrivate\": false,\n    \"memberCount\": 3,\n    \"name\": \"Archived\",\n    \"slug\": \"archived\",\n  },\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"General chatter\",\n    \"id\": \"1\",\n    \"isDefault\": true,\n    \"isPrivate\": false,\n    \"memberCount\": 5,\n    \"name\": \"General\",\n    \"slug\": \"general\",\n  },\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Private chatter\",\n    \"id\": \"2\",\n    \"isDefault\": false,\n    \"isPrivate\": true,\n    \"memberCount\": 5,\n    \"name\": \"Private\",\n    \"slug\": \"private\",\n  },\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Moderator created channel\",\n    \"id\": \"8\",\n    \"isDefault\": false,\n    \"isPrivate\": false,\n    \"memberCount\": 1,\n    \"name\": \"Moderator created\",\n    \"slug\": \"moderator-created\",\n  },\n]\n`;\n\nexports[`models/channel getChannelsByUser returns correct set of channels 1`] = `\nArray [\n  Object {\n    \"communityId\": \"2\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Private chatter\",\n    \"id\": \"4\",\n    \"isBlocked\": false,\n    \"isDefault\": false,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": false,\n    \"isPending\": false,\n    \"isPrivate\": true,\n    \"memberCount\": 5,\n    \"name\": \"Private\",\n    \"receiveNotifications\": true,\n    \"slug\": \"private\",\n  },\n  Object {\n    \"communityId\": \"5\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"General\",\n    \"id\": \"11\",\n    \"isBlocked\": false,\n    \"isDefault\": false,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": false,\n    \"isPending\": false,\n    \"isPrivate\": false,\n    \"memberCount\": 1,\n    \"name\": \"General\",\n    \"receiveNotifications\": false,\n    \"slug\": \"general\",\n  },\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Private chatter\",\n    \"id\": \"2\",\n    \"isBlocked\": false,\n    \"isDefault\": false,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": false,\n    \"isPending\": false,\n    \"isPrivate\": true,\n    \"memberCount\": 5,\n    \"name\": \"Private\",\n    \"receiveNotifications\": true,\n    \"slug\": \"private\",\n  },\n  Object {\n    \"communityId\": \"1\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"General chatter\",\n    \"id\": \"1\",\n    \"isBlocked\": false,\n    \"isDefault\": true,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": false,\n    \"isPending\": false,\n    \"isPrivate\": false,\n    \"memberCount\": 5,\n    \"name\": \"General\",\n    \"receiveNotifications\": true,\n    \"slug\": \"general\",\n  },\n  Object {\n    \"communityId\": \"2\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"Payments Features\",\n    \"id\": \"10\",\n    \"isBlocked\": false,\n    \"isDefault\": false,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": true,\n    \"isPending\": false,\n    \"isPrivate\": false,\n    \"memberCount\": 5,\n    \"name\": \"Payments Features\",\n    \"receiveNotifications\": true,\n    \"slug\": \"features\",\n  },\n  Object {\n    \"communityId\": \"2\",\n    \"createdAt\": 2016-12-31T23:00:00.000Z,\n    \"description\": \"General chatter\",\n    \"id\": \"3\",\n    \"isBlocked\": false,\n    \"isDefault\": true,\n    \"isMember\": true,\n    \"isModerator\": false,\n    \"isOwner\": false,\n    \"isPending\": false,\n    \"isPrivate\": false,\n    \"memberCount\": 5,\n    \"name\": \"General\",\n    \"receiveNotifications\": true,\n    \"slug\": \"general\",\n  },\n]\n`;\n\nexports[`models/channel getChannelsByUserAndCommunity returns correct set of channels 1`] = `\nArray [\n  \"2\",\n  \"1\",\n]\n`;\n\nexports[`models/channel getChannelsThreadCounts excludes deleted channels 1`] = `\nArray [\n  Object {\n    \"group\": \"1\",\n    \"reduction\": 4,\n  },\n]\n`;\n\nexports[`models/channel getChannelsThreadCounts excludes deleted threads 1`] = `\nArray [\n  Object {\n    \"group\": \"1\",\n    \"reduction\": 4,\n  },\n  Object {\n    \"group\": \"2\",\n    \"reduction\": 3,\n  },\n]\n`;\n\nexports[`models/channel getPublicChannelsByCommunity returns correct set of channels 1`] = `\nArray [\n  \"1\",\n  \"8\",\n]\n`;\n"
  },
  {
    "path": "api/models/test/channel.test.js",
    "content": "// @flow\n\nimport * as channel from '../channel';\n\nconst queries = channel.__forQueryTests;\n\nimport {\n  BRIAN_ID,\n  MAX_ID,\n  SPECTRUM_COMMUNITY_ID,\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n} from 'api/migrations/seed/default/constants';\n\ndescribe('models/channel', () => {\n  describe('channelsByCommunitiesQuery', () => {\n    it('excludes deleted channels', async () => {\n      const channels = await queries\n        .channelsByCommunitiesQuery(SPECTRUM_COMMUNITY_ID)\n        .run();\n      expect(\n        channels.filter(channel => channel.deletedAt !== undefined)\n      ).toEqual([]);\n    });\n  });\n\n  describe('channelsByIdsQuery', () => {\n    it('excludes deleted channels', async () => {\n      const channels = await queries\n        .channelsByIdsQuery(\n          SPECTRUM_GENERAL_CHANNEL_ID,\n          DELETED_COMMUNITY_DELETED_CHANNEL_ID\n        )\n        .run();\n      expect(\n        channels.filter(channel => channel.deletedAt !== undefined)\n      ).toEqual([]);\n    });\n  });\n\n  describe('threadsByChannelsQuery', () => {\n    it('excludes deleted channels', async () => {\n      const threads = await queries\n        .threadsByChannelsQuery(DELETED_COMMUNITY_DELETED_CHANNEL_ID)\n        .run();\n      expect(threads).toEqual([]);\n    });\n\n    it('excludes deleted threads', async () => {\n      const threads = await queries\n        .threadsByChannelsQuery(SPECTRUM_GENERAL_CHANNEL_ID)\n        .run();\n      expect(threads.filter(thread => thread.deletedAt !== undefined)).toEqual(\n        []\n      );\n    });\n  });\n\n  describe('membersByChannelsQuery', () => {\n    it('excludes deleted channels', async () => {\n      const members = await queries\n        .membersByChannelsQuery(DELETED_COMMUNITY_DELETED_CHANNEL_ID)\n        .run();\n      expect(members).toEqual([]);\n    });\n\n    it('excludes removed members', async () => {\n      const members = await queries\n        .membersByChannelsQuery(SPECTRUM_GENERAL_CHANNEL_ID)\n        .run();\n      expect(members.filter(member => !member.isMember)).toEqual([]);\n    });\n  });\n\n  describe('getChannelsByCommunity', () => {\n    it('returns correct set of channels', async () => {\n      expect(\n        await channel.getChannelsByCommunity(SPECTRUM_COMMUNITY_ID)\n      ).toMatchSnapshot();\n    });\n  });\n\n  describe('getPublicChannelsByCommunity', () => {\n    it('returns correct set of channels', async () => {\n      expect(\n        await channel.getPublicChannelsByCommunity(SPECTRUM_COMMUNITY_ID)\n      ).toMatchSnapshot();\n    });\n  });\n\n  describe('getChannelsByUserAndCommunity', () => {\n    it('returns correct set of channels', async () => {\n      expect(\n        await channel.getChannelsByUserAndCommunity(\n          SPECTRUM_COMMUNITY_ID,\n          MAX_ID\n        )\n      ).toMatchSnapshot();\n    });\n  });\n\n  describe('getChannelsByUser', () => {\n    it('returns correct set of channels', async () => {\n      expect(await channel.getChannelsByUser(BRIAN_ID)).toMatchSnapshot();\n    });\n  });\n\n  describe('getChannelBySlug', () => {\n    it('excludes deleted channels', async () => {\n      expect(await channel.getChannelBySlug('deleted', 'spectrum')).toEqual(\n        null\n      );\n    });\n  });\n\n  describe('getChannelById', () => {\n    it('excludes deleted channels', async () => {\n      expect(\n        await channel.getChannelById(DELETED_COMMUNITY_DELETED_CHANNEL_ID)\n      ).toEqual(null);\n    });\n  });\n\n  describe('getChannels', () => {\n    it('excludes deleted channels', async () => {\n      expect(\n        await channel.getChannels([\n          SPECTRUM_GENERAL_CHANNEL_ID,\n          DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n        ])\n      ).toMatchSnapshot();\n    });\n  });\n\n  describe('getChannelsThreadCounts', () => {\n    it('excludes deleted channels', async () => {\n      expect(\n        await channel.getChannelsThreadCounts([\n          SPECTRUM_GENERAL_CHANNEL_ID,\n          DELETED_COMMUNITY_DELETED_CHANNEL_ID,\n        ])\n      ).toMatchSnapshot();\n    });\n\n    it('excludes deleted threads', async () => {\n      expect(\n        await channel.getChannelsThreadCounts([\n          SPECTRUM_GENERAL_CHANNEL_ID,\n          SPECTRUM_PRIVATE_CHANNEL_ID,\n        ])\n      ).toMatchSnapshot();\n    });\n  });\n});\n"
  },
  {
    "path": "api/models/thread.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport intersection from 'lodash.intersection';\nconst { parseRange } = require('./utils');\nimport { deleteMessagesInThread } from '../models/message';\nimport type { PaginationOptions } from '../utils/paginate-arrays';\nimport type { DBThread } from 'shared/types';\nimport type { Timeframe } from './utils';\n\nconst NOT_WATERCOOLER = thread =>\n  db.not(thread.hasFields('watercooler')).or(thread('watercooler').eq(false));\n\nexport const getThread = (threadId: string): Promise<DBThread> => {\n  return db\n    .table('threads')\n    .get(threadId)\n    .run();\n};\n\n// prettier-ignore\nexport const getThreads = (threadIds: Array<string>): Promise<Array<DBThread>> => {\n  return db\n    .table('threads')\n    .getAll(...threadIds)\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .run();\n};\n\nexport const getThreadById = (threadId: string): Promise<?DBThread> => {\n  return db\n    .table('threads')\n    .getAll(threadId)\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .run()\n    .then(results => {\n      if (!results || results.length === 0) return null;\n      return results[0];\n    });\n};\n\n// this is used to get all threads that need to be marked as deleted whenever a channel is deleted\nexport const getThreadsByChannelToDelete = (channelId: string) => {\n  return db\n    .table('threads')\n    .getAll(channelId, { index: 'channelId' })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .run();\n};\n\n// prettier-ignore\nexport const getThreadsByChannel = (channelId: string, options: PaginationOptions): Promise<Array<DBThread>> => {\n  const { first, after } = options\n\n  return db\n    .table('threads')\n    .between(\n      [channelId, db.minval],\n      [channelId, after ? new Date(after) : db.maxval],\n      {\n        index: 'channelIdAndLastActive',\n        leftBound: 'open',\n        rightBound: 'open',\n      }\n    )\n    .orderBy({ index: db.desc('channelIdAndLastActive') })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .limit(first)\n    .run();\n};\n\n// prettier-ignore\ntype GetThreadsByChannelPaginationOptions = {\n  first: number,\n  after: number,\n  sort: 'latest' | 'trending'\n};\n\nexport const getThreadsByChannels = (\n  channelIds: Array<string>,\n  options: GetThreadsByChannelPaginationOptions\n): Promise<Array<DBThread>> => {\n  const { first, after, sort = 'latest' } = options;\n\n  let order = [db.desc('lastActive'), db.desc('createdAt')];\n  // If we want the top threads, first sort by the score and then lastActive\n  if (sort === 'trending') order.unshift(db.desc('score'));\n\n  return db\n    .table('threads')\n    .getAll(...channelIds, { index: 'channelId' })\n    .filter(thread =>\n      db.not(thread.hasFields('deletedAt')).and(NOT_WATERCOOLER(thread))\n    )\n    .orderBy(...order)\n    .skip(after || 0)\n    .limit(first || 999999)\n    .run();\n};\n\n// prettier-ignore\nexport const getThreadsByCommunity = (communityId: string): Promise<Array<DBThread>> => {\n  return db\n    .table('threads')\n    .between([communityId, db.minval], [communityId, db.maxval], {\n      index: 'communityIdAndLastActive',\n      leftBound: 'open',\n      rightBound: 'open',\n    })\n    .orderBy({ index: db.desc('communityIdAndLastActive') })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .run();\n};\n\n// prettier-ignore\nexport const getThreadsInTimeframe = (range: Timeframe): Promise<Array<Object>> => {\n  const { current } = parseRange(range);\n  return db\n    .table('threads')\n    .filter(db.row('createdAt').during(db.now().sub(current), db.now()))\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .run();\n};\n\n// We do not filter by deleted threads intentionally to prevent users from spam\n// creating/deleting threads\n// prettier-ignore\nexport const getThreadsByUserAsSpamCheck = (userId: string, timeframe: number = 60 * 10): Promise<Array<?DBThread>> => {\n  return db\n    .table('threads')\n    .getAll(userId, { index: 'creatorId' })\n    .filter(db.row('createdAt').during(db.now().sub(timeframe), db.now()))\n    .run();\n};\n\n/*\n  When viewing a user profile we have to take two arguments into account:\n  1. The user who is being viewed\n  2. The user who is doing the viewing\n\n  We need to return only threads that meet the following criteria:\n  1. The thread was posted to a public channel\n  2. The thread was posted to a private channel and the viewing user is a member\n*/\nexport const getViewableThreadsByUser = async (\n  evalUser: string,\n  currentUser: string,\n  options: PaginationOptions\n): Promise<Array<DBThread>> => {\n  const { first, after } = options;\n  // get a list of the channelIds the current user is allowed to see threads\n  const getCurrentUsersChannelIds = db\n    .table('usersChannels')\n    .getAll(\n      [currentUser, 'member'],\n      [currentUser, 'moderator'],\n      [currentUser, 'owner'],\n      {\n        index: 'userIdAndRole',\n      }\n    )\n    .map(userChannel => userChannel('channelId'))\n    .run();\n\n  const getCurrentUserCommunityIds = db\n    .table('usersCommunities')\n    .getAll([currentUser, true], { index: 'userIdAndIsMember' })\n    .map(userCommunity => userCommunity('communityId'))\n    .run();\n\n  // get a list of the channels where the user posted a thread\n  const getPublishedChannelIds = db\n    .table('threads')\n    .getAll(evalUser, { index: 'creatorId' })\n    .map(thread => thread('channelId'))\n    .run();\n\n  const getPublishedCommunityIds = db\n    .table('threads')\n    .getAll(evalUser, { index: 'creatorId' })\n    .map(thread => thread('communityId'))\n    .run();\n\n  const [\n    currentUsersChannelIds,\n    publishedChannelIds,\n    currentUsersCommunityIds,\n    publishedCommunityIds,\n  ] = await Promise.all([\n    getCurrentUsersChannelIds,\n    getPublishedChannelIds,\n    getCurrentUserCommunityIds,\n    getPublishedCommunityIds,\n  ]);\n\n  // get a list of all the channels that are public\n  const publicChannelIds = await db\n    .table('channels')\n    .getAll(...publishedChannelIds)\n    .filter({ isPrivate: false })\n    .map(channel => channel('id'))\n    .run();\n\n  const publicCommunityIds = await db\n    .table('communities')\n    .getAll(...publishedCommunityIds)\n    .filter({ isPrivate: false })\n    .map(community => community('id'))\n    .run();\n\n  const allIds = [\n    ...currentUsersChannelIds,\n    ...currentUsersCommunityIds,\n    ...publicChannelIds,\n    ...publicCommunityIds,\n  ];\n  const distinctIds = allIds.filter((x, i, a) => a.indexOf(x) === i);\n  let validChannelIds = intersection(distinctIds, publishedChannelIds);\n  let validCommunityIds = intersection(distinctIds, publishedCommunityIds);\n\n  // takes ~70ms for a heavy load\n  return await db\n    .table('threads')\n    .getAll(evalUser, { index: 'creatorId' })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .filter(thread => db.expr(validChannelIds).contains(thread('channelId')))\n    .filter(thread =>\n      db.expr(validCommunityIds).contains(thread('communityId'))\n    )\n    .orderBy(db.desc('lastActive'), db.desc('createdAt'))\n    .skip(after || 0)\n    .limit(first)\n    .run()\n    .then(res => {\n      return res;\n    });\n};\n\n// prettier-ignore\nexport const getPublicThreadsByUser = (evalUser: string, options: PaginationOptions): Promise<Array<DBThread>> => {\n  const { first, after } = options\n  return db\n    .table('threads')\n    .getAll(evalUser, { index: 'creatorId' })\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .eqJoin('channelId', db.table('channels'))\n    .filter({ right: { isPrivate: false } })\n    .without('right')\n    .zip()\n    .eqJoin('communityId', db.table('communities'))\n    .filter({ right: { isPrivate: false } })\n    .without('right')\n    .zip()\n    .orderBy(db.desc('lastActive'), db.desc('createdAt'))\n    .skip(after || 0)\n    .limit(first || 10)\n    .run();\n};\n\nexport const getViewableParticipantThreadsByUser = async (\n  evalUser: string,\n  currentUser: string,\n  options: PaginationOptions\n): Promise<Array<DBThread>> => {\n  const { first, after } = options;\n  // get a list of the channelIds the current user is allowed to see threads for\n  const getCurrentUsersChannelIds = db\n    .table('usersChannels')\n    .getAll(\n      [currentUser, 'member'],\n      [currentUser, 'moderator'],\n      [currentUser, 'owner'],\n      {\n        index: 'userIdAndRole',\n      }\n    )\n    .map(userChannel => userChannel('channelId'))\n    .run();\n\n  const getCurrentUserCommunityIds = db\n    .table('usersCommunities')\n    .getAll([currentUser, true], { index: 'userIdAndIsMember' })\n    .map(userCommunity => userCommunity('communityId'))\n    .run();\n\n  // get a list of the channels where the user participated in a thread\n  const getParticipantChannelIds = db\n    .table('usersThreads')\n    .getAll([evalUser, true], { index: 'userIdAndIsParticipant' })\n    .eqJoin('threadId', db.table('threads'))\n    .zip()\n    .pluck('channelId', 'threadId')\n    .run();\n\n  const getParticipantCommunityIds = db\n    .table('usersThreads')\n    .getAll([evalUser, true], { index: 'userIdAndIsParticipant' })\n    .eqJoin('threadId', db.table('threads'))\n    .zip()\n    .pluck('communityId', 'threadId')\n    .run();\n\n  const [\n    currentUsersChannelIds,\n    participantChannelIds,\n    currentUsersCommunityIds,\n    participantCommunityIds,\n  ] = await Promise.all([\n    getCurrentUsersChannelIds,\n    getParticipantChannelIds,\n    getCurrentUserCommunityIds,\n    getParticipantCommunityIds,\n  ]);\n\n  const participantThreadIds = participantChannelIds.map(c => c && c.threadId);\n  const distinctParticipantChannelIds = participantChannelIds\n    .map(c => c.channelId)\n    .filter((x, i, a) => a.indexOf(x) === i);\n\n  const distinctParticipantCommunityIds = participantCommunityIds\n    .map(c => c.communityId)\n    .filter((x, i, a) => a.indexOf(x) === i);\n\n  // get a list of all the channels that are public\n  const publicChannelIds = await db\n    .table('channels')\n    .getAll(...distinctParticipantChannelIds)\n    .filter({ isPrivate: false })\n    .map(channel => channel('id'))\n    .run();\n\n  const publicCommunityIds = await db\n    .table('communities')\n    .getAll(...distinctParticipantCommunityIds)\n    .filter({ isPrivate: false })\n    .map(community => community('id'))\n    .run();\n\n  const allIds = [\n    ...currentUsersChannelIds,\n    ...publicChannelIds,\n    ...currentUsersCommunityIds,\n    ...publicCommunityIds,\n  ];\n  const distinctIds = allIds.filter((x, i, a) => a.indexOf(x) === i);\n  let validChannelIds = intersection(\n    distinctIds,\n    distinctParticipantChannelIds\n  );\n  let validCommunityIds = intersection(\n    distinctIds,\n    distinctParticipantCommunityIds\n  );\n\n  return await db\n    .table('threads')\n    .getAll(...participantThreadIds)\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .filter(thread => db.expr(validChannelIds).contains(thread('channelId')))\n    .filter(thread =>\n      db.expr(validCommunityIds).contains(thread('communityId'))\n    )\n    .orderBy(db.desc('lastActive'), db.desc('createdAt'))\n    .skip(after || 0)\n    .limit(first)\n    .run()\n    .then(res => {\n      return res;\n    });\n};\n\n// prettier-ignore\nexport const getPublicParticipantThreadsByUser = (evalUser: string, options: PaginationOptions): Promise<Array<DBThread>> => {\n  const { first, after } = options\n  return db\n    .table('usersThreads')\n    .getAll([evalUser, true], { index: 'userIdAndIsParticipant' })\n    .eqJoin('threadId', db.table('threads'))\n    .without({\n      left: [\n        'id',\n        'userId',\n        'threadId',\n        'createdAt',\n        'isParticipant',\n        'receiveNotifications',\n      ],\n    })\n    .zip()\n    .filter(thread => db.not(thread.hasFields('deletedAt')))\n    .eqJoin('channelId', db.table('channels'))\n    .filter({ right: { isPrivate: false } })\n    .without('right')\n    .zip()\n    .eqJoin('communityId', db.table('communities'))\n    .filter({ right: { isPrivate: false } })\n    .without('right')\n    .zip()\n    .orderBy(db.desc('lastActive'), db.desc('createdAt'))\n    .skip(after || 0)\n    .limit(first || 10)\n    .run()\n    .then(res => {\n      return res;\n    });\n};\n\nexport const getWatercoolerThread = (\n  communityId: string\n): Promise<?DBThread> => {\n  return db\n    .table('threads')\n    .getAll([communityId, true], { index: 'communityIdAndWatercooler' })\n    .run()\n    .then(result => {\n      if (!Array.isArray(result) || result.length === 0) return null;\n      return result[0];\n    });\n};\n\n// prettier-ignore\nexport const deleteThread = (threadId: string, userId: string): Promise<Boolean> => {\n  return db\n    .table('threads')\n    .get(threadId)\n    .update(\n      {\n        deletedBy: userId,\n        deletedAt: new Date(),\n      },\n      {\n        returnChanges: true,\n        nonAtomic: true,\n      }\n    )\n    .run()\n    .then(result =>\n      Promise.all([\n        result,\n        deleteMessagesInThread(threadId, userId),\n      ])\n    )\n    .then(([result]) => {\n      return result.replaced >= 1 ? true : false;\n    });\n};\n\nexport const incrementMessageCount = (threadId: string) => {\n  return db\n    .table('threads')\n    .get(threadId)\n    .update({\n      messageCount: db\n        .row('messageCount')\n        .default(0)\n        .add(1),\n    })\n    .run();\n};\n\nexport const decrementMessageCount = (threadId: string) => {\n  return db\n    .table('threads')\n    .get(threadId)\n    .update({\n      messageCount: db\n        .row('messageCount')\n        .default(1)\n        .sub(1),\n    })\n    .run();\n};\n"
  },
  {
    "path": "api/models/threadReaction.js",
    "content": "// @flow\nimport { db } from 'shared/db';\nimport type { DBThreadReaction } from 'shared/types';\n\n// prettier-ignore\nexport const getThreadReactions = (threadIds: Array<string>): Promise<Array<DBThreadReaction>> => {\n  const distinctMessageIds = threadIds.filter((x, i, a) => a.indexOf(x) == i);\n  return db\n    .table('threadReactions')\n    .getAll(...distinctMessageIds, { index: 'threadId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .group('threadId')\n    .run();\n};\n\nexport const hasReactedToThread = (\n  userId: string,\n  threadId: string\n): Promise<boolean> => {\n  return db\n    .table('threadReactions')\n    .getAll([userId, threadId], { index: 'userIdAndThreadId' })\n    .filter(row => row.hasFields('deletedAt').not())\n    .count()\n    .eq(1)\n    .run();\n};\n"
  },
  {
    "path": "api/models/usersChannels.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport { decrementMemberCount, setMemberCount } from './channel';\nimport type { DBUsersChannels } from 'shared/types';\n\n/*\n===========================================================\n\n        MODIFYING AND CREATING DATA IN USERSCHANNELS\n\n===========================================================\n*/\n\n// removes all the user relationships to a channel. will be invoked when a\n// channel is deleted, at which point we don't want any records in the\n// database to show a user relationship to the deleted channel\n// prettier-ignore\nconst removeMembersInChannel = async (channelId: string): Promise<Array<?DBUsersChannels>> => {\n  await setMemberCount(channelId, 0)\n\n  return db\n    .table('usersChannels')\n    .getAll(channelId, { index: 'channelId' })\n    .update({\n      isMember: false,\n      receiveNotifications: false,\n    })\n    .run();\n};\n\n// toggles all pending users to make them a member in a channel. invoked by a\n// channel or community owner when turning a private channel into a public\n// channel\n// prettier-ignore\nconst approvePendingUsersInChannel = async (channelId: string): Promise<DBUsersChannels> => {\n  const currentCount = await db.table('usersChannels')\n    .getAll(\n      [channelId, 'member'],\n      [channelId, 'moderator'],\n      [channelId, 'owner'],\n      {\n        index: 'channelIdAndRole',\n      }\n    )\n    .count()\n    .default(1)\n    .run()\n\n  const pendingCount = await db.table('usersChannels')\n    .getAll([channelId, \"pending\"], { index: 'channelIdAndRole' })\n    .count()\n    .default(0)\n    .run()\n\n  setMemberCount(channelId, currentCount + pendingCount)\n\n  return db\n    .table('usersChannels')\n    .getAll([channelId, \"pending\"], { index: 'channelIdAndRole' })\n    .update(\n      {\n        isMember: true,\n        isPending: false,\n        receiveNotifications: true,\n      },\n      { returnChanges: true }\n    )\n    .run()\n};\n\nconst removeUsersChannelMemberships = async (userId: string) => {\n  const usersChannels = await db\n    .table('usersChannels')\n    .getAll(userId, { index: 'userId' })\n    .run();\n\n  if (!usersChannels || usersChannels.length === 0) return;\n\n  const memberCountPromises = usersChannels.map(usersChannel => {\n    return decrementMemberCount(usersChannel.channelId);\n  });\n\n  const channelPromise = db\n    .table('usersChannels')\n    .getAll(userId, { index: 'userId' })\n    .update({\n      isOwner: false,\n      isModerator: false,\n      isMember: false,\n      receiveNotifications: false,\n    })\n    .run();\n\n  return await Promise.all([memberCountPromises, channelPromise]);\n};\n\n/*\n===========================================================\n\n            GETTING DATA FROM USERSCHANNELS\n\n===========================================================\n*/\n\ntype Options = { first: number, after: number };\n// prettier-ignore\nconst getMembersInChannel = (channelId: string, options: Options): Promise<Array<string>> => {\n  const { first, after } = options\n\n  return (\n    db\n      .table('usersChannels')\n      .getAll([channelId, \"member\"], [channelId, \"moderator\"], [channelId, \"owner\"], { index: 'channelIdAndRole' })\n      .skip(after || 0)\n      .limit(first || 25)\n      // return an array of the userIds to be loaded by gql\n      .map(userChannel => userChannel('userId'))\n      .run()\n  );\n};\n\nconst getModeratorsInChannel = (channelId: string): Promise<Array<string>> => {\n  return (\n    db\n      .table('usersChannels')\n      .getAll([channelId, 'moderator'], {\n        index: 'channelIdAndRole',\n      })\n      // return an array of the userIds to be loaded by gql\n      .map(userChannel => userChannel('userId'))\n      .run()\n  );\n};\n\nconst getOwnersInChannel = (channelId: string): Promise<Array<string>> => {\n  return (\n    db\n      .table('usersChannels')\n      .getAll([channelId, 'owner'], {\n        index: 'channelIdAndRole',\n      })\n      // return an array of the userIds to be loaded by gql\n      .map(userChannel => userChannel('userId'))\n      .run()\n  );\n};\n\nconst DEFAULT_USER_CHANNEL_PERMISSIONS = {\n  isOwner: false,\n  isMember: false,\n  isModerator: false,\n  isBlocked: false,\n  isPending: false,\n  receiveNotifications: false,\n};\n\n// prettier-ignore\nconst getUserPermissionsInChannel = (channelId: string, userId: string): Promise<DBUsersChannels> => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, channelId], { index: 'userIdAndChannelId' })\n    .run()\n    .then(data => {\n      // if a record exists\n      if (data.length > 0) {\n        return data[0];\n      } else {\n        // if a record doesn't exist, we're creating a new relationship\n        // so default to false for everything\n        return DEFAULT_USER_CHANNEL_PERMISSIONS;\n      }\n    });\n};\n\ntype UserIdAndChannelId = [?string, string];\n\n// prettier-ignore\nconst getUsersPermissionsInChannels = (input: Array<UserIdAndChannelId>): Promise<Array<DBUsersChannels>> => {\n  return db\n    .table('usersChannels')\n    .getAll(...input, { index: 'userIdAndChannelId' })\n    .run()\n    .then(data => {\n      if (!data || data.length === 0)\n        return Array.from({ length: input.length }).map((_, index) => ({\n          ...DEFAULT_USER_CHANNEL_PERMISSIONS,\n          userId: input[index][0],\n          channelId: input[index][1],\n        }));\n\n      return data.map((rec, index) => {\n        if (rec) return rec;\n\n        return {\n          ...DEFAULT_USER_CHANNEL_PERMISSIONS,\n          userId: input[index][0],\n          channelId: input[index][1],\n        };\n      });\n    });\n};\n\nconst getUserUsersChannels = (userId: string) => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, 'member'], [userId, 'owner'], [userId, 'moderator'], {\n      index: 'userIdAndRole',\n    })\n    .run();\n};\n\nconst getUserChannelIds = (userId: string) => {\n  return db\n    .table('usersChannels')\n    .getAll([userId, 'member'], [userId, 'owner'], [userId, 'moderator'], {\n      index: 'userIdAndRole',\n    })\n    .map(rec => rec('channelId'))\n    .run();\n};\n\nmodule.exports = {\n  // modify and create\n  removeMembersInChannel,\n  approvePendingUsersInChannel,\n  removeUsersChannelMemberships,\n  // get\n  getMembersInChannel,\n  getModeratorsInChannel,\n  getOwnersInChannel,\n  getUserPermissionsInChannel,\n  getUsersPermissionsInChannels,\n  getUserUsersChannels,\n  getUserChannelIds,\n  // constants\n  DEFAULT_USER_CHANNEL_PERMISSIONS,\n};\n"
  },
  {
    "path": "api/models/usersCommunities.js",
    "content": "// @flow\nconst { db } = require('shared/db');\nimport type { DBUsersCommunities } from 'shared/types';\nimport { decrementMemberCount, setMemberCount } from './community';\n\n/*\n===========================================================\n\n        MODIFYING AND CREATING DATA IN USERSCOMMUNITIES\n\n===========================================================\n*/\n\n// removes all the user relationships to a community. will be invoked when a\n// community is deleted, at which point we don't want any records in the\n// database to show a user relationship to the deleted community\n// prettier-ignore\nexport const removeMembersInCommunity = async (communityId: string): Promise<?Object> => {\n\n  const usersCommunities = await db\n    .table('usersCommunities')\n    .getAll(communityId, { index: 'communityId' })\n    .run()\n\n  if (!usersCommunities || usersCommunities.length === 0) return\n  const leavePromise = await db\n    .table('usersCommunities')\n    .getAll(communityId, { index: 'communityId' })\n    .update({\n      isMember: false,\n      receiveNotifications: false,\n    })\n    .run();\n\n  return await Promise.all([\n    setMemberCount(communityId, 0),\n    leavePromise\n  ])\n};\n\n// invoked when a user is deleting their account or being banned\nexport const removeUsersCommunityMemberships = async (userId: string) => {\n  const memberships = await db\n    .table('usersCommunities')\n    .getAll(userId, { index: 'userId' })\n    .run();\n\n  if (!memberships || memberships.length === 0) return;\n\n  const memberCountPromises = memberships.map(member => {\n    return decrementMemberCount(member.communityId);\n  });\n\n  const removeMembershipsPromise = db\n    .table('usersCommunities')\n    .getAll(userId, { index: 'userId' })\n    .update({\n      isOwner: false,\n      isModerator: false,\n      isMember: false,\n      isPending: false,\n      receiveNotifications: false,\n    })\n    .run();\n\n  return Promise.all([memberCountPromises, removeMembershipsPromise]);\n};\n\n/*\n===========================================================\n\n            GETTING DATA FROM USERSCOMMUNITIES\n\n===========================================================\n*/\n\ntype Options = { first: number, after: number };\n\n// prettier-ignore\nexport const getMembersInCommunity = (communityId: string, options: Options): Promise<Array<string>> => {\n  const { first, after } = options\n  return db\n    .table('usersCommunities')\n    .between([communityId, true, db.minval], [communityId, true, db.maxval], {\n      index: 'communityIdAndIsMemberAndReputation',\n      leftBound: 'open',\n      rightBound: 'open',\n    })\n    .orderBy({ index: db.desc('communityIdAndIsMemberAndReputation') })\n    .skip(after || 0)\n    .limit(first || 25)\n    .map(userCommunity => userCommunity('userId'))\n    .run()\n};\n\n// prettier-ignore\nexport const getModeratorsInCommunity = (communityId: string, options: Options): Promise<Array<string>> => {\n  return (\n    db\n      .table('usersCommunities')\n      .getAll([communityId, true], { index: 'communityIdAndIsModerator' })\n      .skip(options.after || 0)\n      .limit(options.first || 25)\n      .map(userCommunity => userCommunity('userId'))\n      .run()\n  );\n};\n\nexport const getOwnersInCommunity = (\n  communityId: string,\n  options: Options\n): Promise<Array<string>> => {\n  return db\n    .table('usersCommunities')\n    .getAll([communityId, true], { index: 'communityIdAndIsOwner' })\n    .skip(options.after || 0)\n    .limit(options.first || 25)\n    .map(userCommunity => userCommunity('userId'))\n    .run();\n};\n\nexport const getTeamMembersInCommunity = (\n  communityId: string,\n  options: Options\n): Promise<Array<string>> => {\n  return db\n    .table('usersCommunities')\n    .getAll([communityId, true], { index: 'communityIdAndIsTeamMember' })\n    .skip(options.after || 0)\n    .limit(options.first || 25)\n    .map(userCommunity => userCommunity('userId'))\n    .run();\n};\n\nexport const DEFAULT_USER_COMMUNITY_PERMISSIONS = {\n  isOwner: false,\n  isMember: false,\n  isModerator: false,\n  isBlocked: false,\n  isPending: false,\n  receiveNotifications: false,\n  reputation: 0,\n};\n\n// NOTE @BRIAN: DEPRECATED - DONT USE IN THE FUTURE\n// prettier-ignore\nexport const getUserPermissionsInCommunity = (communityId: string, userId: string): Promise<Object> => {\n  return db\n    .table('usersCommunities')\n    .getAll([userId, communityId], {\n      index: 'userIdAndCommunityId',\n    })\n    .run()\n    .then(data => {\n      // if a record exists\n      if (data.length > 0) {\n        return data[0];\n      } else {\n        // if a record doesn't exist, we're creating a new relationship\n        // so default to false for everything\n        return {\n          ...DEFAULT_USER_COMMUNITY_PERMISSIONS,\n          userId,\n          communityId,\n        };\n      }\n    });\n};\n\n// prettier-ignore\nexport const checkUserPermissionsInCommunity = (communityId: string, userId: string): Promise<DBUsersCommunities> => {\n  return db\n    .table('usersCommunities')\n    .getAll([userId, communityId], { index: 'userIdAndCommunityId' })\n    .run();\n};\n\ntype UserIdAndCommunityId = [?string, string];\n\n// prettier-ignore\nexport const getUsersPermissionsInCommunities = (input: Array<UserIdAndCommunityId>) => {\n  return db\n    .table('usersCommunities')\n    .getAll(...input, { index: 'userIdAndCommunityId' })\n    .run()\n    .then(data => {\n      if (!data)\n        return Array.from({ length: input.length }, (_, index) => ({\n          ...DEFAULT_USER_COMMUNITY_PERMISSIONS,\n          userId: input[index][0],\n          communityId: input[index][1],\n        }));\n\n      return data.map(\n        (rec, index) =>\n          rec\n            ? rec\n            : {\n                ...DEFAULT_USER_COMMUNITY_PERMISSIONS,\n                userId: input[index][0],\n                communityId: input[index][1],\n              }\n      );\n    });\n};\n\nexport const getReputationByUser = (userId: string): Promise<Number> => {\n  return db\n    .table('usersCommunities')\n    .getAll([userId, true], { index: 'userIdAndIsMember' })\n    .map(rec => rec('reputation'))\n    .count()\n    .default(0)\n    .run();\n};\n\n// prettier-ignore\nexport const getUsersTotalReputation = (userIds: Array<string>): Promise<Array<number>> => {\n  return db\n    .table('usersCommunities')\n    .getAll(...userIds.map(userId => ([userId, true])), { index: 'userIdAndIsMember' })\n    .group('userId')\n    .map(rec => rec('reputation'))\n    .reduce((l, r) => l.add(r))\n    .default(0)\n    .run()\n    .then(res =>\n      res.map(\n        res =>\n          res && {\n            reputation: res.reduction,\n            userId: res.group,\n          }\n      )\n    );\n};\n"
  },
  {
    "path": "api/models/usersDirectMessageThreads.js",
    "content": "// @flow\nconst { db } = require('shared/db');\n\n/*\n===========================================================\n\n  MODIFYING AND CREATING DATA IN USERSDIRECTMESSAGETHREADS\n\n===========================================================\n*/\n\n// removes a single member from a channel. will be invoked if a user leaves\n// a channel\n// prettier-ignore\nconst removeMemberInDirectMessageThread = (threadId: string, userId: string): Promise<Object> => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(threadId, { index: 'threadId' })\n    .filter({ userId })\n    .delete()\n    .run();\n};\n\n// removes all the user relationships to a dm thread. will be invoked when a\n// dm thread is permanently deleted, at which point we don't want any records in the\n// database to show a user relationship to the deleted thread\n// prettier-ignore\nconst removeMembersInDirectMessageThread = (threadId: string): Promise<Object> => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(threadId, { index: 'threadId' })\n    .delete()\n    .run();\n};\n\n/*\n===========================================================\n\n        GETTING DATA FROM USERSDIRECTMESSAGETHREADS\n\n===========================================================\n*/\n\n// prettier-ignore\nconst getMembersInDirectMessageThread = (threadId: string): Promise<Array<Object>> => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(threadId, { index: 'threadId' })\n    .eqJoin('userId', db.table('users'))\n    .without({ left: ['createdAt'], right: ['id', 'lastSeen'] })\n    .zip()\n    .run();\n};\n\n// for loader\n// prettier-ignore\nconst getMembersInDirectMessageThreads = (threadIds: Array<string>): Promise<Array<Object>> => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(...threadIds, { index: 'threadId' })\n    .eqJoin('userId', db.table('users'))\n    .without({ left: ['createdAt'], right: ['id', 'lastSeen'] })\n    .group(rec => rec('left')('threadId'))\n    .zip()\n    .run();\n};\n\nconst isMemberOfDirectMessageThread = (threadId: string, userId: string) => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(threadId, { index: 'threadId' })('userId')\n    .contains(userId)\n    .run();\n};\n\nconst getDirectMessageThreadRecords = (threadId: string) => {\n  return db\n    .table('usersDirectMessageThreads')\n    .getAll(threadId, { index: 'threadId' })\n    .run();\n};\n\nmodule.exports = {\n  removeMemberInDirectMessageThread,\n  removeMembersInDirectMessageThread,\n  // get\n  getMembersInDirectMessageThread,\n  getMembersInDirectMessageThreads,\n  isMemberOfDirectMessageThread,\n  getDirectMessageThreadRecords,\n};\n"
  },
  {
    "path": "api/models/usersSettings.js",
    "content": "const { db } = require('shared/db');\nimport type { DBUserSettings } from 'shared/types';\n\nexport const createNewUsersSettings = (\n  userId: string\n): Promise<DBUserSettings> => {\n  return db\n    .table('usersSettings')\n    .insert(\n      {\n        userId,\n        notifications: {\n          types: {\n            newMessageInThreads: {\n              email: true,\n            },\n            newMention: {\n              email: true,\n            },\n            newDirectMessage: {\n              email: true,\n            },\n            newThreadCreated: {\n              email: true,\n            },\n            dailyDigest: {\n              email: true,\n            },\n            weeklyDigest: {\n              email: true,\n            },\n          },\n        },\n      },\n      { returnChanges: 'always' }\n    )\n    .run()\n    .then(res => res.changes[0].new_val);\n};\n\nexport const getUsersSettings = (userId: string): Promise<Object> => {\n  return db\n    .table('usersSettings')\n    .getAll(userId, { index: 'userId' })\n    .run()\n    .then(results => {\n      if (results && results.length > 0) {\n        // if the user already has a relationship with the thread we don't need to do anything, return\n        return results[0];\n      } else {\n        return null;\n      }\n    });\n};\n\nexport const disableAllUsersEmailSettings = (userId: string) => {\n  return db\n    .table('usersSettings')\n    .getAll(userId, { index: 'userId' })\n    .update({\n      notifications: {\n        types: {\n          dailyDigest: {\n            email: false,\n          },\n          newDirectMessage: {\n            email: false,\n          },\n          newMention: {\n            email: false,\n          },\n          newMessageInThreads: {\n            email: false,\n          },\n          newThreadCreated: {\n            email: false,\n          },\n          weeklyDigest: {\n            email: false,\n          },\n        },\n      },\n    })\n    .run();\n};\n"
  },
  {
    "path": "api/models/usersThreads.js",
    "content": "// @flow\nimport type { DBUsersThreads } from 'shared/types';\nconst { db } = require('shared/db');\n\n// prettier-ignore\nexport const deleteParticipantInThread = (threadId: string, userId: string): Promise<boolean> => {\n  return db\n    .table('usersThreads')\n    .getAll([userId, threadId], { index: 'userIdAndThreadId' })\n    .delete()\n    .run()\n};\n\n// prettier-ignore\nexport const getParticipantsInThread = (threadId: string): Promise<Array<Object>> => {\n  return db\n    .table('usersThreads')\n    .getAll(threadId, { index: 'threadId' })\n    .filter({ isParticipant: true })\n    .eqJoin('userId', db.table('users'))\n    .without({\n      left: ['createdAt', 'id', 'threadId', 'userId'],\n    })\n    .zip()\n    .run();\n};\n\nexport const getParticipantsInThreads = (threadIds: Array<string>) => {\n  return db\n    .table('usersThreads')\n    .getAll(...threadIds, { index: 'threadId' })\n    .filter({ isParticipant: true })\n    .eqJoin('userId', db.table('users'))\n    .group(rec => rec('left')('threadId'))\n    .without({\n      left: ['createdAt', 'id', 'userId'],\n    })\n    .zip()\n    .run();\n};\n"
  },
  {
    "path": "api/models/utils.js",
    "content": "// @flow\nimport { db } from 'shared/db';\n\nexport type Timeframe = 'daily' | 'weekly' | 'monthly' | 'quarterly';\n\nexport const parseRange = (timeframe?: Timeframe) => {\n  switch (timeframe) {\n    case 'daily': {\n      return { current: 60 * 60 * 24, previous: 60 * 60 * 24 * 2 };\n    }\n    case 'weekly': {\n      return { current: 60 * 60 * 24 * 7, previous: 60 * 60 * 24 * 14 };\n    }\n    case 'monthly': {\n      return { current: 60 * 60 * 24 * 30, previous: 60 * 60 * 24 * 60 };\n    }\n    case 'quarterly': {\n      return { current: 60 * 60 * 24 * 90, previous: 60 * 60 * 24 * 180 };\n    }\n    default: {\n      return { current: 60 * 60 * 24 * 7, previous: 60 * 60 * 24 * 14 };\n    }\n  }\n};\n\nexport const getCount = (table: string, filter: mixed) => {\n  if (filter) {\n    return db\n      .table(table)\n      .filter(filter)\n      .count()\n      .run();\n  }\n\n  return db\n    .table(table)\n    .count()\n    .run();\n};\n"
  },
  {
    "path": "api/mutations/channel/deleteChannel.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport { removeMembersInChannel } from '../../models/usersChannels';\nimport { getChannelById, deleteChannel } from '../../models/channel';\nimport { getThreadsByChannelToDelete, deleteThread } from '../../models/thread';\nimport {\n  isAuthedResolver as requireAuth,\n  canModerateChannel,\n} from '../../utils/permissions';\n\ntype Input = {\n  channelId: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { channelId } = args;\n  const { user, loaders } = ctx;\n\n  if (!(await canModerateChannel(user.id, channelId, loaders))) {\n    return new UserError('You don’t have permission to manage this channel');\n  }\n\n  const channel = await getChannelById(channelId);\n\n  if (channel.slug === 'general') {\n    return new UserError(\"The general channel can't be deleted\");\n  }\n\n  const [allThreadsInChannel] = await Promise.all([\n    getThreadsByChannelToDelete(channelId),\n    deleteChannel(channelId, user.id),\n    removeMembersInChannel(channelId),\n  ]);\n\n  if (allThreadsInChannel.length === 0) return true;\n\n  return allThreadsInChannel.map(\n    async thread => await deleteThread(thread.id, user.id)\n  );\n});\n"
  },
  {
    "path": "api/mutations/channel/editChannel.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { EditChannelInput } from '../../models/channel';\nimport UserError from '../../utils/UserError';\nimport { approvePendingUsersInChannel } from '../../models/usersChannels';\nimport { editChannel } from '../../models/channel';\nimport {\n  isAuthedResolver as requireAuth,\n  canModerateChannel,\n} from '../../utils/permissions';\n\nexport default requireAuth(\n  async (_: any, args: EditChannelInput, ctx: GraphQLContext) => {\n    const { user, loaders } = ctx;\n\n    const channel = await loaders.channel.load(args.input.channelId);\n\n    if (!(await canModerateChannel(user.id, args.input.channelId, loaders))) {\n      return new UserError('You don’t have permission to manage this channel');\n    }\n\n    if (channel.isPrivate && !args.input.isPrivate) {\n      approvePendingUsersInChannel(args.input.channelId);\n    }\n\n    return editChannel(args);\n  }\n);\n"
  },
  {
    "path": "api/mutations/channel/index.js",
    "content": "// @flow\nimport deleteChannel from './deleteChannel';\nimport editChannel from './editChannel';\n\nmodule.exports = {\n  Mutation: {\n    deleteChannel,\n    editChannel,\n  },\n};\n"
  },
  {
    "path": "api/mutations/community/deleteCommunity.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport { removeMembersInCommunity } from '../../models/usersCommunities';\nimport { deleteCommunity } from '../../models/community';\nimport { getChannelsByCommunity, deleteChannel } from '../../models/channel';\nimport { getThreadsByCommunity } from '../../models/thread';\nimport { removeMembersInChannel } from '../../models/usersChannels';\nimport { deleteThread } from '../../models/thread';\nimport {\n  isAuthedResolver as requireAuth,\n  canAdministerCommunity,\n} from '../../utils/permissions';\n\ntype Input = {\n  communityId: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { communityId } = args;\n  const { user, loaders } = ctx;\n\n  const communityToEvaluate = await loaders.community.load(communityId);\n\n  if (!communityToEvaluate || communityToEvaluate.deletedAt) {\n    return new UserError(\"This community doesn't exist.\");\n  }\n\n  if (!(await canAdministerCommunity(user.id, communityId, loaders))) {\n    return new UserError(\n      \"You don't have permission to make changes to this community.\"\n    );\n  }\n\n  const [allChannelsInCommunity, allThreadsInCommunity] = await Promise.all([\n    getChannelsByCommunity(communityId),\n    getThreadsByCommunity(communityId),\n    removeMembersInCommunity(communityId),\n    deleteCommunity(communityId, user.id),\n  ]);\n\n  // after a community has been deleted, we need to mark all the channels\n  // as deleted\n  const removeAllChannels = allChannelsInCommunity.map(channel =>\n    deleteChannel(channel.id, user.id)\n  );\n\n  // and remove all relationships to the deleted channels\n  const removeAllRelationshipsToChannels = allChannelsInCommunity.map(channel =>\n    removeMembersInChannel(channel.id)\n  );\n\n  // and mark all the threads in that community as deleted\n  const removeAllThreadsInCommunity = allThreadsInCommunity.map(thread =>\n    deleteThread(thread.id, user.id)\n  );\n\n  return Promise.all([\n    ...removeAllChannels,\n    ...removeAllRelationshipsToChannels,\n    ...removeAllThreadsInCommunity,\n  ]).then(() => communityToEvaluate);\n});\n"
  },
  {
    "path": "api/mutations/community/editCommunity.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { EditCommunityInput } from '../../models/community';\nimport UserError from '../../utils/UserError';\nimport { editCommunity } from '../../models/community';\nimport {\n  isAuthedResolver as requireAuth,\n  canModerateCommunity,\n} from '../../utils/permissions';\n\nexport default requireAuth(\n  // prettier-ignore\n  async (_: any, args: EditCommunityInput, ctx: GraphQLContext) => {\n    const { user, loaders} = ctx\n    const { communityId } = args.input\n\n    // user must own the community to edit the community\n    if (!await canModerateCommunity(user.id, communityId, loaders)) {\n      return new UserError(\"You don't have permission to edit this community.\");\n    }\n\n    return editCommunity(args, user.id);\n  }\n);\n"
  },
  {
    "path": "api/mutations/community/index.js",
    "content": "// @flow\nimport deleteCommunity from './deleteCommunity';\nimport editCommunity from './editCommunity';\nimport toggleCommunityRedirect from './toggleCommunityRedirect';\nimport toggleCommunityNoindex from './toggleCommunityNoindex.js';\n\nmodule.exports = {\n  Mutation: {\n    deleteCommunity,\n    editCommunity,\n    toggleCommunityRedirect,\n    toggleCommunityNoindex,\n  },\n};\n"
  },
  {
    "path": "api/mutations/community/toggleCommunityNoindex.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../..';\nimport UserError from '../../utils/UserError';\nimport {\n  toggleCommunityNoindex,\n  getCommunityById,\n} from '../../models/community';\nimport {\n  isAuthedResolver as requireAuth,\n  canAdministerCommunity,\n} from '../../utils/permissions';\n\ntype Input = {\n  communityId: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { communityId } = args;\n  const { user, loaders } = ctx;\n\n  if (!(await canAdministerCommunity(user.id, communityId, loaders))) {\n    return new UserError(\"You don't have permission to do this.\");\n  }\n\n  const community = await getCommunityById(communityId);\n\n  if (!community) {\n    return new UserError('This community does not exist.');\n  }\n\n  return toggleCommunityNoindex(communityId);\n});\n"
  },
  {
    "path": "api/mutations/community/toggleCommunityRedirect.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport {\n  toggleCommunityRedirect,\n  getCommunityById,\n} from '../../models/community';\nimport {\n  isAuthedResolver as requireAuth,\n  canAdministerCommunity,\n} from '../../utils/permissions';\n\ntype Input = {\n  communityId: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { communityId } = args;\n  const { user, loaders } = ctx;\n\n  if (!(await canAdministerCommunity(user.id, communityId, loaders))) {\n    return new UserError(\"You don't have permission to do this.\");\n  }\n\n  const community = await getCommunityById(communityId);\n\n  if (!community) {\n    return new UserError('This community does not exist.');\n  }\n\n  return toggleCommunityRedirect(communityId);\n});\n"
  },
  {
    "path": "api/mutations/files/index.js",
    "content": "// @flow\nimport uploadImage from './uploadImage';\n\nmodule.exports = {\n  Mutation: {\n    uploadImage,\n  },\n};\n"
  },
  {
    "path": "api/mutations/files/uploadImage.js",
    "content": "// @flow\nimport { isAuthedResolver } from '../../utils/permissions';\nimport { uploadImage } from '../../utils/file-storage';\nimport type { EntityTypes } from 'shared/types';\nimport type { FileUpload } from 'shared/types';\nimport { signImageUrl } from 'shared/imgix';\n\ntype Args = {\n  input: {\n    image: FileUpload,\n    type: EntityTypes,\n    id?: string,\n  },\n};\n\nexport default isAuthedResolver(async (_: void, { input }: Args) => {\n  const { image, type, id } = input;\n  const url = await uploadImage(image, type, id || 'draft');\n  return await signImageUrl(url);\n});\n"
  },
  {
    "path": "api/mutations/message/deleteMessage.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport {\n  getMessage,\n  deleteMessage,\n  userHasMessagesInThread,\n} from '../../models/message';\nimport { deleteParticipantInThread } from '../../models/usersThreads';\nimport { getUserPermissionsInChannel } from '../../models/usersChannels';\nimport { getUserPermissionsInCommunity } from '../../models/usersCommunities';\nimport { isAuthedResolver as requireAuth } from '../../utils/permissions';\n\ntype Input = {\n  id: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { id } = args;\n  const { user, loaders } = ctx;\n\n  const message = await getMessage(id);\n\n  if (!message) {\n    return new UserError('This message does not exist.');\n  }\n\n  const thread = await loaders.thread.load(message.threadId);\n\n  if (message.senderId !== user.id) {\n    // Only the sender can delete a directMessageThread message\n    if (message.threadType === 'directMessageThread') {\n      return new UserError('You can only delete your own messages.');\n    }\n\n    const [communityPermissions, channelPermissions] = await Promise.all([\n      getUserPermissionsInCommunity(thread.communityId, user.id),\n      getUserPermissionsInChannel(thread.channelId, user.id),\n    ]);\n\n    const canModerate =\n      channelPermissions.isOwner ||\n      communityPermissions.isOwner ||\n      channelPermissions.isModerator ||\n      communityPermissions.isModerator;\n    if (!canModerate) {\n      return new UserError(\"You don't have permission to delete this message.\");\n    }\n  }\n\n  // Delete message and remove participant from thread if it's the only message from that person\n  return deleteMessage(user.id, id)\n    .then(async () => {\n      // We don't need to delete participants of direct message threads\n      if (message.threadType === 'directMessageThread') return true;\n\n      const hasMoreMessages = await userHasMessagesInThread(\n        message.threadId,\n        message.senderId\n      );\n\n      if (hasMoreMessages) return;\n\n      return await deleteParticipantInThread(\n        message.threadId,\n        message.senderId\n      );\n    })\n    .then(() => true);\n});\n"
  },
  {
    "path": "api/mutations/message/index.js",
    "content": "// @flow\nimport deleteMessage from './deleteMessage';\n\nmodule.exports = {\n  Mutation: {\n    deleteMessage,\n  },\n};\n"
  },
  {
    "path": "api/mutations/thread/deleteThread.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport { getUserPermissionsInCommunity } from '../../models/usersCommunities';\nimport { getUserPermissionsInChannel } from '../../models/usersChannels';\nimport { deleteThread, getThreads } from '../../models/thread';\nimport { isAuthedResolver as requireAuth } from '../../utils/permissions';\n\ntype Input = {\n  threadId: string,\n};\n\nexport default requireAuth(async (_: any, args: Input, ctx: GraphQLContext) => {\n  const { user } = ctx;\n  const { threadId } = args;\n\n  // get the thread being locked\n  const threads = await getThreads([threadId]);\n\n  const threadToEvaluate = threads && threads[0];\n\n  // if the thread doesn't exist\n  if (!threadToEvaluate || threadToEvaluate.deletedAt) {\n    return new UserError(\"This thread doesn't exist\");\n  }\n\n  // return the thread, channels and communities\n  const [\n    currentUserChannelPermissions,\n    currentUserCommunityPermissions,\n  ] = await Promise.all([\n    getUserPermissionsInChannel(threadToEvaluate.channelId, user.id),\n    getUserPermissionsInCommunity(threadToEvaluate.communityId, user.id),\n  ]);\n\n  // if the user owns the community or the channel, or they are the original creator, they can delete the thread\n  if (\n    currentUserChannelPermissions.isOwner ||\n    currentUserChannelPermissions.isModerator ||\n    currentUserCommunityPermissions.isOwner ||\n    currentUserCommunityPermissions.isModerator ||\n    threadToEvaluate.creatorId === user.id\n  ) {\n    return await deleteThread(threadId, user.id);\n  }\n\n  // if the user is not a channel or community owner, the thread can't be locked\n  return new UserError(\n    \"You don't have permission to make changes to this thread.\"\n  );\n});\n"
  },
  {
    "path": "api/mutations/thread/index.js",
    "content": "// @flow\nimport deleteThread from './deleteThread';\n\nmodule.exports = {\n  Mutation: {\n    deleteThread,\n  },\n};\n"
  },
  {
    "path": "api/mutations/user/banUser.js",
    "content": "// @flow\nimport { isAuthedResolver, isAdmin } from '../../utils/permissions';\nimport UserError from '../../utils/UserError';\nimport type { GraphQLContext } from '../../';\nimport { banUser } from 'shared/db/queries/user';\n\ntype BanUserInput = {\n  input: {\n    userId: string,\n    reason: string,\n  },\n};\n\nexport default isAuthedResolver(\n  async (_: any, args: BanUserInput, ctx: GraphQLContext) => {\n    const {\n      input: { userId, reason },\n    } = args;\n    const { loaders, user: currentUser } = ctx;\n\n    if (!isAdmin(currentUser.id)) {\n      return new UserError('You don’t have permission to do that.');\n    }\n\n    if (currentUser.id === userId) {\n      return new UserError('You cannot ban yourself.');\n    }\n\n    const reportedUser = await loaders.user.load(userId);\n\n    if (!reportedUser) {\n      return new UserError(`User with ID ${userId} does not exist.`);\n    }\n\n    if (reportedUser.bannedAt) {\n      return new UserError('This user has already been banned');\n    }\n\n    return banUser({\n      userId,\n      reason,\n      currentUserId: currentUser.id,\n    })\n      .then(() => {\n        return true;\n      })\n      .catch(err => new UserError(err.message));\n  }\n);\n"
  },
  {
    "path": "api/mutations/user/deleteCurrentUser.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport { deleteUser } from 'shared/db/queries/user';\nimport { removeUsersCommunityMemberships } from '../../models/usersCommunities';\nimport { removeUsersChannelMemberships } from '../../models/usersChannels';\nimport { disableAllUsersEmailSettings } from '../../models/usersSettings';\nimport { isAuthedResolver as requireAuth } from '../../utils/permissions';\n\nexport default requireAuth(async (_: any, __: any, ctx: GraphQLContext) => {\n  const { user } = ctx;\n\n  return Promise.all([\n    deleteUser(user.id),\n    disableAllUsersEmailSettings(user.id),\n    removeUsersCommunityMemberships(user.id),\n    removeUsersChannelMemberships(user.id),\n  ])\n    .then(() => true)\n    .catch(err => new UserError(err.message));\n});\n"
  },
  {
    "path": "api/mutations/user/editUser.js",
    "content": "// @flow\nimport Raven from 'shared/raven';\nimport type { GraphQLContext } from '../../';\nimport type { EditUserInput } from 'shared/db/queries/user';\nimport UserError from '../../utils/UserError';\nimport {\n  getUserByUsername,\n  editUser,\n  getUsersByEmail,\n  setUserPendingEmail,\n} from 'shared/db/queries/user';\nimport { isAuthedResolver as requireAuth } from '../../utils/permissions';\nimport isEmail from 'validator/lib/isEmail';\n\nexport default requireAuth(\n  async (_: any, args: EditUserInput, ctx: GraphQLContext) => {\n    const { user: currentUser, updateCookieUserData } = ctx;\n    const { input } = args;\n\n    // If the user is trying to change their username check whether there's a person with that username already\n    if (input.username) {\n      if (input.username === 'null' || input.username === 'undefined') {\n        return new UserError('Nice try! 😉');\n      }\n\n      const dbUser = await getUserByUsername(input.username);\n      if (dbUser && dbUser.id !== currentUser.id) {\n        return new UserError(\n          'Looks like that username got swooped! Try another?'\n        );\n      }\n    }\n\n    if (input.email && typeof input.email === 'string') {\n      const pendingEmail = input.email;\n\n      // if user is changing their email, make sure it's not taken by someone else\n      if (pendingEmail !== currentUser.email || !currentUser.email) {\n        if (!isEmail(input.email)) {\n          return new UserError('Please enter a valid email address.');\n        }\n\n        const dbUsers = await getUsersByEmail(pendingEmail);\n        if (dbUsers && dbUsers.length > 0) {\n          return new UserError('Please enter a valid email address.');\n        }\n\n        // the user will have to confirm their email for it to be saved in\n        // order to prevent spoofing your email as someone elses\n        await setUserPendingEmail(currentUser.id, pendingEmail);\n      }\n    }\n\n    const editedUser = await editUser(args, currentUser.id);\n\n    await updateCookieUserData({\n      ...editedUser,\n    }).catch(err => {\n      Raven.captureException(\n        new Error(`Error updating cookie user data: ${err.message}`)\n      );\n      return editedUser;\n    });\n\n    return editedUser;\n  }\n);\n"
  },
  {
    "path": "api/mutations/user/index.js",
    "content": "// @flow\nimport editUser from './editUser';\nimport deleteCurrentUser from './deleteCurrentUser';\nimport banUser from './banUser';\n\nmodule.exports = {\n  Mutation: {\n    editUser,\n    deleteCurrentUser,\n    banUser,\n  },\n};\n"
  },
  {
    "path": "api/package.json",
    "content": "{\n  \"dependencies\": {\n    \"apollo-local-query\": \"^0.3.1\",\n    \"apollo-server-cache-redis\": \"^0.3.1\",\n    \"apollo-server-express\": \"2.5.0-alpha.0\",\n    \"apollo-server-plugin-response-cache\": \"^0.1.0-alpha.0\",\n    \"apollo-upload-client\": \"^9.1.0\",\n    \"aws-sdk\": \"2.200.0\",\n    \"axios\": \"^0.19.0\",\n    \"b2a\": \"^1.0.11\",\n    \"babel-plugin-replace-dynamic-import-runtime\": \"^1.0.2\",\n    \"babel-plugin-styled-components\": \"^1.10.0\",\n    \"babel-plugin-transform-flow-strip-types\": \"^6.22.0\",\n    \"babel-plugin-transform-object-rest-spread\": \"^6.23.0\",\n    \"babel-preset-env\": \"^1.7.0\",\n    \"backpack-core\": \"^0.8.3\",\n    \"body-parser\": \"^1.19.0\",\n    \"casual\": \"^1.6.2\",\n    \"compression\": \"^1.7.4\",\n    \"cookie-parser\": \"^1.4.4\",\n    \"cookie-session\": \"^2.0.0-beta.3\",\n    \"cors\": \"^2.8.5\",\n    \"cryptr\": \"^3.0.0\",\n    \"datadog-metrics\": \"^0.8.1\",\n    \"dataloader\": \"^1.4.0\",\n    \"debounce\": \"^1.2.0\",\n    \"debug\": \"^4.1.1\",\n    \"decode-uri-component\": \"^0.2.0\",\n    \"draft-js\": \"^0.10.5\",\n    \"draft-js-code-editor-plugin\": \"0.2.1\",\n    \"draft-js-drag-n-drop-plugin\": \"2.0.0-rc9\",\n    \"draft-js-embed-plugin\": \"^1.2.0\",\n    \"draft-js-focus-plugin\": \"2.0.0-rc2\",\n    \"draft-js-image-plugin\": \"2.0.0-rc8\",\n    \"draft-js-import-markdown\": \"^1.3.3\",\n    \"draft-js-linkify-plugin\": \"^2.0.0-beta1\",\n    \"draft-js-markdown-plugin\": \"^1.4.4\",\n    \"draft-js-plugins-editor\": \"^2.1.1\",\n    \"draft-js-prism-plugin\": \"0.1.1\",\n    \"draftjs-to-markdown\": \"^0.4.2\",\n    \"emoji-regex\": \"^6.1.1\",\n    \"express\": \"^4.17.1\",\n    \"express-enforces-ssl\": \"^1.1.0\",\n    \"express-hot-shots\": \"^1.0.2\",\n    \"express-session\": \"^1.16.1\",\n    \"faker\": \"^4.1.0\",\n    \"find-with-regex\": \"^1.1.3\",\n    \"flow-typed\": \"^2.5.2\",\n    \"graphql\": \"0.13.x\",\n    \"graphql-cost-analysis\": \"^1.0.3\",\n    \"graphql-date\": \"^1.0.3\",\n    \"graphql-depth-limit\": \"^1.1.0\",\n    \"graphql-log\": \"^0.1.3\",\n    \"graphql-tools\": \"^4.0.4\",\n    \"helmet\": \"^3.18.0\",\n    \"highlight.js\": \"^9.15.8\",\n    \"history\": \"^4.9.0\",\n    \"hoist-non-react-statics\": \"^2.5.5\",\n    \"host-validation\": \"^1.2.0\",\n    \"hot-shots\": \"^5.9.2\",\n    \"hpp\": \"^0.2.2\",\n    \"hsts\": \"^2.2.0\",\n    \"imgix-core-js\": \"^1.3.0\",\n    \"immutability-helper\": \"^2.9.1\",\n    \"ioredis\": \"3.2.2\",\n    \"isomorphic-fetch\": \"^2.2.1\",\n    \"iterall\": \"^1.2.2\",\n    \"jest\": \"^21.2.1\",\n    \"json-stringify-pretty-compact\": \"^1.2.0\",\n    \"jsonwebtoken\": \"^8.5.1\",\n    \"keygrip\": \"^1.1.0\",\n    \"linkify-it\": \"^2.1.0\",\n    \"localstorage-memory\": \"^1.0.3\",\n    \"lodash\": \"^4.17.11\",\n    \"lodash.intersection\": \"^4.4.0\",\n    \"longjohn\": \"^0.2.12\",\n    \"moment\": \"^2.24.0\",\n    \"ms\": \"^2.1.1\",\n    \"node-env-file\": \"^0.1.8\",\n    \"node-localstorage\": \"^1.3.1\",\n    \"now-env\": \"^3.2.0\",\n    \"offline-plugin\": \"^4.9.1\",\n    \"passport\": \"^0.3.2\",\n    \"passport-facebook\": \"^2.1.1\",\n    \"passport-github2\": \"^0.1.10\",\n    \"passport-google-oauth2\": \"^0.1.6\",\n    \"passport-twitter\": \"^1.0.4\",\n    \"pre-commit\": \"^1.2.2\",\n    \"prismjs\": \"^1.16.0\",\n    \"query-string\": \"5.1.1\",\n    \"raven\": \"^2.6.4\",\n    \"react\": \"^15.4.1\",\n    \"react-app-rewire-styled-components\": \"^3.0.2\",\n    \"react-app-rewired\": \"1.6.2\",\n    \"react-dom\": \"^15.4.1\",\n    \"react-helmet\": \"5.x\",\n    \"react-infinite-scroller-with-scroll-element\": \"^1.0.4\",\n    \"react-loadable\": \"5.2.2\",\n    \"react-modal\": \"^3.8.1\",\n    \"react-redux\": \"^5.1.1\",\n    \"react-remarkable\": \"^1.1.1\",\n    \"react-router\": \"4.x\",\n    \"react-router-dom\": \"4.x\",\n    \"react-textarea-autosize\": \"^4.0.5\",\n    \"react-transition-group\": \"^2.9.0\",\n    \"react-trend\": \"^1.2.5\",\n    \"recompose\": \"^0.23.1\",\n    \"redis-tag-cache\": \"^1.2.1\",\n    \"redraft\": \"0.8.0\",\n    \"redux\": \"^3.6.0\",\n    \"redux-thunk\": \"^2.3.0\",\n    \"request-ip\": \"^2.1.3\",\n    \"rethinkdb-changefeed-reconnect\": \"^0.3.2\",\n    \"rethinkdb-inspector\": \"^0.3.3\",\n    \"rethinkdb-migrate\": \"^1.4.0\",\n    \"rethinkhaberdashery\": \"^2.3.32\",\n    \"sanitize-filename\": \"^1.6.1\",\n    \"serialize-javascript\": \"^1.7.0\",\n    \"session-rethinkdb\": \"^2.0.0\",\n    \"slate\": \"^0.44.12\",\n    \"slate-markdown\": \"0.1.0\",\n    \"slugg\": \"^1.1.0\",\n    \"string-replace-to-array\": \"^1.0.3\",\n    \"string-similarity\": \"^1.2.2\",\n    \"striptags\": \"2.x\",\n    \"styled-components\": \"3.1.x\",\n    \"subscriptions-transport-ws\": \"^0.9.16\",\n    \"sw-precache-webpack-plugin\": \"^0.11.5\",\n    \"then-queue\": \"^1.3.0\",\n    \"toobusy-js\": \"^0.5.1\",\n    \"uuid\": \"^3.3.2\",\n    \"validator\": \"^9.4.1\",\n    \"web-push\": \"^3.3.5\"\n  },\n  \"scripts\": {\n    \"start\": \"NODE_ENV=production node main.js\"\n  }\n}\n"
  },
  {
    "path": "api/queries/channel/channelPermissions.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\n\nexport default async (\n  root: DBChannel,\n  _: any,\n  { user, loaders }: GraphQLContext\n) => {\n  const channelId = root.id;\n  const defaultPermissions = {\n    isOwner: false,\n    isMember: false,\n    isModerator: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  };\n\n  if (!channelId || !user) {\n    return defaultPermissions;\n  }\n\n  const permissions = await loaders.userPermissionsInChannel.load([\n    user.id,\n    channelId,\n  ]);\n\n  return permissions || defaultPermissions;\n};\n"
  },
  {
    "path": "api/queries/channel/community.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\nimport { canViewCommunity } from '../../utils/permissions';\n\nexport default async (channel: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { communityId } = channel;\n  const { loaders, user: currentUser } = ctx;\n\n  const community = await loaders.community.load(communityId);\n  if (community.isPrivate) {\n    if (await canViewCommunity(currentUser, community.id, loaders)) {\n      return community;\n    } else {\n      return null;\n    }\n  }\n\n  return community;\n};\n"
  },
  {
    "path": "api/queries/channel/communityPermissions.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\n\nexport default async (\n  root: DBChannel,\n  _: any,\n  { user, loaders }: GraphQLContext\n) => {\n  const communityId = root.id || root.communityId;\n  const defaultPermissions = {\n    isOwner: false,\n    isMember: false,\n    isModerator: false,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: false,\n  };\n\n  if (!communityId || !user) {\n    return defaultPermissions;\n  }\n\n  const permissions = await loaders.userPermissionsInCommunity.load([\n    user.id,\n    communityId,\n  ]);\n  return permissions || defaultPermissions;\n};\n"
  },
  {
    "path": "api/queries/channel/index.js",
    "content": "// @flow\nimport channel from './rootChannel';\n\nimport memberCount from './memberCount';\nimport threadConnection from './threadConnection';\nimport community from './community';\nimport channelPermissions from './channelPermissions';\nimport communityPermissions from './communityPermissions';\nimport memberConnection from './memberConnection';\nimport metaData from './metaData';\nimport moderators from './moderators';\nimport owners from './owners';\nimport isArchived from './isArchived';\nimport joinSettings from './joinSettings';\n\nmodule.exports = {\n  Query: {\n    channel,\n  },\n  Channel: {\n    memberCount,\n    threadConnection,\n    community,\n    channelPermissions,\n    communityPermissions,\n    memberConnection,\n    metaData,\n    moderators,\n    owners,\n    isArchived,\n    joinSettings,\n  },\n};\n"
  },
  {
    "path": "api/queries/channel/isArchived.js",
    "content": "// @flow\nimport type { DBChannel } from 'shared/types';\n\nexport default ({ archivedAt, ...rest }: DBChannel) => {\n  if (archivedAt) return true;\n  return false;\n};\n"
  },
  {
    "path": "api/queries/channel/joinSettings.js",
    "content": "// @flow\nimport type { DBChannel } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { canModerateChannel } from '../../utils/permissions';\n\nexport default async ({ id }: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { user: currentUser, loaders } = ctx;\n\n  if (!currentUser) return null;\n\n  if (!(await canModerateChannel(currentUser.id, id, loaders))) {\n    return null;\n  }\n\n  return loaders.channelSettings.load(id).then(settings => {\n    return settings.joinSettings;\n  });\n};\n"
  },
  {
    "path": "api/queries/channel/memberConnection.js",
    "content": "// @flow\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\nimport { getMembersInChannel } from '../../models/usersChannels';\nimport { encode, decode } from '../../utils/base64';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (\n  channel: DBChannel,\n  { first, after }: PaginationOptions,\n  ctx: GraphQLContext\n) => {\n  const { loaders, user: currentUser } = ctx;\n  const { id, isPrivate } = channel;\n\n  if (isPrivate) {\n    if (!(await canViewChannel(currentUser, id, loaders))) return null;\n  }\n\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastUserIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10);\n\n  // $FlowIssue\n  return getMembersInChannel(id, { first, after: lastUserIndex })\n    .then(users => loaders.user.loadMany(users))\n    .then(result => ({\n      pageInfo: {\n        hasNextPage: result && result.length >= first,\n      },\n      edges: result.filter(Boolean).map((user, index) => ({\n        cursor: encode(`${user.id}-${lastUserIndex + index + 1}`),\n        node: user,\n      })),\n    }));\n};\n"
  },
  {
    "path": "api/queries/channel/memberCount.js",
    "content": "// @flow\nimport type { DBChannel } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (channel: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { id, memberCount, isPrivate } = channel;\n  const { loaders, user: currentUser } = ctx;\n\n  if (isPrivate) {\n    if (!(await canViewChannel(currentUser, id, loaders))) return 0;\n  }\n\n  return memberCount || 1;\n};\n"
  },
  {
    "path": "api/queries/channel/metaData.js",
    "content": "// TODO: Flow type again\nimport Raven from 'shared/raven';\nimport type { DBChannel } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (root: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { user, loaders } = ctx;\n  const { id, memberCount: rootMemberCount } = root;\n\n  if (!(await canViewChannel(user, id, loaders))) {\n    return {\n      members: 0,\n    };\n  }\n\n  if (typeof rootMemberCount === 'number') {\n    return {\n      members: rootMemberCount,\n    };\n  }\n\n  // Fallback if there's no denormalized memberCount, also report to Sentry\n  Raven.captureException(\n    new Error(`Channel with ID \"${id}\" does not have denormalized memberCount.`)\n  );\n  return {\n    members: await loaders.channelMemberCount\n      .load(id)\n      .then(res => (res && res.reduction) || 0),\n  };\n};\n"
  },
  {
    "path": "api/queries/channel/moderators.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\nimport { getModeratorsInChannel } from '../../models/usersChannels';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (channel: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { loaders, user: currentUser } = ctx;\n  const { id, isPrivate } = channel;\n\n  if (isPrivate) {\n    if (!(await canViewChannel(currentUser, id, loaders))) return null;\n  }\n\n  return getModeratorsInChannel(id).then(users => loaders.user.loadMany(users));\n};\n"
  },
  {
    "path": "api/queries/channel/owners.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBChannel } from 'shared/types';\nimport { getOwnersInChannel } from '../../models/usersChannels';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (channel: DBChannel, _: any, ctx: GraphQLContext) => {\n  const { id, isPrivate } = channel;\n  const { loaders, user: currentUser } = ctx;\n\n  if (isPrivate) {\n    if (!(await canViewChannel(currentUser, id, loaders))) return null;\n  }\n\n  return getOwnersInChannel(id).then(users => loaders.user.loadMany(users));\n};\n"
  },
  {
    "path": "api/queries/channel/rootChannel.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { GetChannelArgs } from '../../models/channel';\nimport UserError from '../../utils/UserError';\nimport { getChannelBySlug } from '../../models/channel';\nimport { canViewChannel } from '../../utils/permissions';\n\nexport default async (_: any, args: GetChannelArgs, ctx: GraphQLContext) => {\n  const { loaders, user: currentUser } = ctx;\n\n  if (args.id) {\n    if (!(await canViewChannel(currentUser, args.id, loaders))) return null;\n    return await loaders.channel.load(args.id);\n  }\n\n  if (args.channelSlug && args.communitySlug) {\n    const channel = await getChannelBySlug(\n      args.channelSlug,\n      args.communitySlug\n    );\n    if (!channel) return null;\n    if (!(await canViewChannel(currentUser, channel.id, loaders))) return null;\n    return channel;\n  }\n  return new UserError('We couldn’t find this channel');\n};\n"
  },
  {
    "path": "api/queries/channel/threadConnection.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { getThreadsByChannel } from '../../models/thread';\nimport { encode, decode } from '../../utils/base64';\nimport { canViewChannel } from '../../utils/permissions';\nimport type { DBChannel } from 'shared/types';\n\nexport default async (\n  channel: DBChannel,\n  { first, after }: PaginationOptions,\n  ctx: GraphQLContext\n) => {\n  const { id, isPrivate } = channel;\n  const { loaders, user: currentUser } = ctx;\n\n  if (isPrivate) {\n    if (!(await canViewChannel(currentUser, id, loaders))) return null;\n  }\n\n  // $FlowFixMe\n  return getThreadsByChannel(id, {\n    first,\n    after: after && parseInt(decode(after), 10),\n  }).then(threads => ({\n    pageInfo: {\n      hasNextPage: threads.length >= first,\n    },\n    edges: threads.map(thread => ({\n      cursor: encode(String(thread.lastActive.getTime())),\n      node: thread,\n    })),\n  }));\n};\n"
  },
  {
    "path": "api/queries/community/brandedLogin.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default async (\n  { id }: DBCommunity,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  return await loaders.communitySettings.load(id).then(() => {\n    return { isEnabled: null, message: null };\n  });\n};\n"
  },
  {
    "path": "api/queries/community/channelConnection.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBCommunity } from 'shared/types';\nimport { getChannelsByCommunity } from '../../models/channel';\nimport { canViewCommunity } from '../../utils/permissions';\n\nexport default async ({ id }: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { user, loaders } = ctx;\n\n  if (!(await canViewCommunity(user, id, loaders))) {\n    return {\n      pageInfo: {\n        hasNextPage: false,\n      },\n      edges: [],\n    };\n  }\n\n  return {\n    pageInfo: {\n      hasNextPage: false,\n    },\n    edges: getChannelsByCommunity(id).then(channels =>\n      channels.map(channel => ({\n        node: channel,\n      }))\n    ),\n  };\n};\n"
  },
  {
    "path": "api/queries/community/communityPermissions.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { DEFAULT_USER_COMMUNITY_PERMISSIONS } from '../../models/usersCommunities';\n\nexport default async (\n  { id }: DBCommunity,\n  _: any,\n  { user, loaders }: GraphQLContext\n) => {\n  const defaultPermissions = {\n    ...DEFAULT_USER_COMMUNITY_PERMISSIONS,\n    userId: null,\n    communityId: null,\n  };\n\n  if (!id || !user) return defaultPermissions;\n\n  const permissions = await loaders.userPermissionsInCommunity.load([\n    user.id,\n    id,\n  ]);\n\n  const fallbackPermissions = {\n    ...defaultPermissions,\n    userId: user.id,\n    communityId: id,\n  };\n\n  return permissions || fallbackPermissions;\n};\n"
  },
  {
    "path": "api/queries/community/contextPermissions.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\n(community: DBCommunity, _: any, { loaders }: GraphQLContext, info: any) => {\n  // in some cases we fetch this upstream - e.g. in the case of querying for communitysThreads, we need to fetch contextPermissions before we hit this step as threadIds are not included in the query variables\n  if (community.contextPermissions) return community.contextPermissions;\n\n  const queryName = info.operation.name.value;\n\n  const handleCheck = async () => {\n    switch (queryName) {\n      case 'getUser': {\n        const username = info.variableValues.username;\n        const user = await loaders.userByUsername.load(username);\n        const {\n          isModerator,\n          isOwner,\n        } = await loaders.userPermissionsInCommunity.load([\n          user.id,\n          community.id,\n        ]);\n        return {\n          communityId: community.id,\n          isModerator,\n          isOwner,\n        };\n      }\n    }\n  };\n\n  return handleCheck();\n};\n"
  },
  {
    "path": "api/queries/community/coverPhoto.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBCommunity } from 'shared/types';\nimport { signCommunity } from 'shared/imgix';\n\nexport default (community: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { coverPhoto } = signCommunity(community);\n  return coverPhoto;\n};\n"
  },
  {
    "path": "api/queries/community/index.js",
    "content": "// @flow\n\nimport community from './rootCommunity';\nimport communities from './rootCommunities';\nimport topCommunities from './rootTopCommunities';\nimport recentCommunities from './rootRecentCommunities';\nimport communityPermissions from './communityPermissions';\nimport channelConnection from './channelConnection';\nimport memberConnection from './memberConnection';\nimport members from './members';\nimport pinnedThread from './pinnedThread';\nimport threadConnection from './threadConnection';\nimport metaData from './metaData';\nimport contextPermissions from './contextPermissions';\nimport watercooler from './watercooler';\nimport joinSettings from './joinSettings';\nimport coverPhoto from './coverPhoto';\nimport profilePhoto from './profilePhoto';\n\n// no-op resolvers to transition while removing payments\nimport type { DBCommunity } from 'shared/types';\nconst isPro = () => false;\nconst recurringPayments = () => [];\nconst invoices = () => [];\nconst billingSettings = (community: DBCommunity) => ({\n  pendingAdministratorEmail: null,\n  administratorEmail: community.administratorEmail,\n  sources: [],\n  invoices: [],\n  subscriptions: [],\n});\nconst hasChargeableSource = () => false;\nconst hasFeatures = () => ({ analytics: true, prioritySupport: true });\n\nmodule.exports = {\n  Query: {\n    community,\n    communities,\n    topCommunities,\n    recentCommunities,\n  },\n  Community: {\n    communityPermissions,\n    channelConnection,\n    memberConnection, // deprecated\n    members,\n    pinnedThread,\n    threadConnection,\n    metaData,\n    contextPermissions,\n    watercooler,\n    joinSettings,\n    coverPhoto,\n    profilePhoto,\n\n    invoices,\n    recurringPayments,\n    isPro,\n    billingSettings,\n    hasChargeableSource,\n    hasFeatures,\n  },\n};\n"
  },
  {
    "path": "api/queries/community/joinSettings.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { canModerateCommunity } from '../../utils/permissions';\n\nexport default async ({ id }: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { user: currentUser, loaders } = ctx;\n\n  if (!currentUser) return null;\n\n  if (!(await canModerateCommunity(currentUser.id, id, loaders))) {\n    return null;\n  }\n\n  return loaders.communitySettings.load(id).then(settings => {\n    return settings.joinSettings;\n  });\n};\n"
  },
  {
    "path": "api/queries/community/memberConnection.js",
    "content": "// @flow\n/*\n\n    DEPRECATED 2/3/2018 by @brian\n\n*/\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { encode, decode } from '../../utils/base64';\nconst { getMembersInCommunity } = require('../../models/usersCommunities');\nimport { canViewCommunity } from '../../utils/permissions';\n\ntype MemberConnectionFilterType = {\n  isMember?: boolean,\n  isOwner?: boolean,\n  isModerator?: boolean,\n  isPending?: boolean,\n  isBlocked?: boolean,\n};\n\ntype Args = {\n  ...$Exact<PaginationOptions>,\n  filter: MemberConnectionFilterType,\n};\n\nexport default async (root: DBCommunity, args: Args, ctx: GraphQLContext) => {\n  const { user, loaders } = ctx;\n  const { id } = root;\n\n  if (!await canViewCommunity(user, id, loaders)) {\n    return {\n      pageInfo: {\n        hasNextPage: false,\n      },\n      edges: [],\n    };\n  }\n\n  const { first = 10, after, filter } = args;\n\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastUserIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10);\n\n  // $FlowFixMe\n  return getMembersInCommunity(id, { first, after: lastUserIndex }, filter)\n    .then(users => loaders.user.loadMany(users))\n    .then(result => ({\n      pageInfo: {\n        hasNextPage: result && result.length >= first,\n      },\n      edges: result.filter(Boolean).map((user, index) => ({\n        cursor: encode(`${user.id}-${lastUserIndex + index + 1}`),\n        node: user,\n      })),\n    }));\n};\n"
  },
  {
    "path": "api/queries/community/members.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { encode, decode } from '../../utils/base64';\nimport { canViewCommunity } from '../../utils/permissions';\nimport {\n  getMembersInCommunity,\n  getOwnersInCommunity,\n  getModeratorsInCommunity,\n  getTeamMembersInCommunity,\n} from '../../models/usersCommunities';\n\ntype MembersFilterType = {\n  isMember?: boolean,\n  isOwner?: boolean,\n  isModerator?: boolean,\n  isPending?: boolean,\n  isBlocked?: boolean,\n};\n\ntype Args = {\n  ...$Exact<PaginationOptions>,\n  filter?: MembersFilterType,\n};\n\nexport default async (root: DBCommunity, args: Args, ctx: GraphQLContext) => {\n  const { id } = root;\n  const { user, loaders } = ctx;\n\n  if (!(await canViewCommunity(user, id, loaders))) {\n    return {\n      pageInfo: {\n        hasNextPage: false,\n      },\n      edges: [],\n    };\n  }\n\n  const { first = 10, after, filter = {} } = args;\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastUserIndex =\n    (lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10)) || 0;\n\n  let query;\n  if (filter.isModerator && filter.isOwner) {\n    query = getTeamMembersInCommunity;\n  } else if (filter.isModerator) {\n    query = getModeratorsInCommunity;\n  } else if (filter.isOwner) {\n    query = getOwnersInCommunity;\n  } else {\n    query = getMembersInCommunity;\n  }\n\n  return query(id, { first, after: lastUserIndex })\n    .then(users => {\n      const permissionsArray = users.map(userId => [userId, id]);\n      // $FlowIssue\n      return loaders.userPermissionsInCommunity.loadMany(permissionsArray);\n    })\n    .then(result => ({\n      pageInfo: {\n        hasNextPage: result && result.length >= first,\n      },\n      edges: result.filter(Boolean).map((user, index) => ({\n        cursor: encode(`${user.userId}-${lastUserIndex + index + 1}`),\n        node: user,\n      })),\n    }));\n};\n"
  },
  {
    "path": "api/queries/community/metaData.js",
    "content": "// TODO: Flow type again\n\nexport default async () => {\n  return {\n    channels: 0,\n    members: 0,\n  };\n};\n"
  },
  {
    "path": "api/queries/community/pinnedThread.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBCommunity } from 'shared/types';\nimport { getThreadById } from '../../models/thread';\nimport { canViewCommunity } from '../../utils/permissions';\n\nexport default async (root: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { user, loaders } = ctx;\n  const { pinnedThreadId, id } = root;\n\n  if (!pinnedThreadId) return null;\n\n  if (!await canViewCommunity(user, id, loaders)) {\n    return null;\n  }\n\n  return await getThreadById(pinnedThreadId);\n};\n"
  },
  {
    "path": "api/queries/community/profilePhoto.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBCommunity } from 'shared/types';\nimport { signCommunity } from 'shared/imgix';\n\nexport default (community: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { profilePhoto } = signCommunity(community);\n  return profilePhoto;\n};\n"
  },
  {
    "path": "api/queries/community/rootCommunities.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { getCuratedCommunities } from '../../models/curatedContent';\n\ntype GetCommunitiesByIds = {\n  ids: Array<string>,\n  slugs: void,\n  curatedContentType: void,\n};\n\ntype GetCommunitiesBySlugs = {\n  ids: void,\n  slugs: Array<string>,\n  curatedContentType: void,\n};\n\ntype GetCuratedContent = {\n  ids: void,\n  slugs: void,\n  curatedContentType: string,\n};\n\ntype GetCommunitiesArgs =\n  | GetCommunitiesByIds\n  | GetCommunitiesBySlugs\n  | GetCuratedContent;\n\nexport default (\n  _: any,\n  args: GetCommunitiesArgs,\n  { loaders }: GraphQLContext\n) => {\n  if (args.curatedContentType) {\n    return getCuratedCommunities(args.curatedContentType);\n  }\n  if (args.ids) return loaders.community.loadMany(args.ids);\n  if (args.slugs) return loaders.communityBySlug.loadMany(args.slugs);\n  return null;\n};\n"
  },
  {
    "path": "api/queries/community/rootCommunity.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\n\ntype GetCommunityById = {\n  id: string,\n  slug: void,\n};\n\ntype GetCommunityBySlug = {\n  id: void,\n  slug: string,\n};\n\ntype GetCommunityArgs = GetCommunityById | GetCommunityBySlug;\n\nexport default (\n  _: any,\n  args: GetCommunityArgs,\n  { loaders }: GraphQLContext\n) => {\n  if (args.id) return loaders.community.load(args.id);\n  if (args.slug) return loaders.communityBySlug.load(args.slug);\n\n  return null;\n};\n"
  },
  {
    "path": "api/queries/community/rootRecentCommunities.js",
    "content": "// @flow\nimport { getRecentCommunities } from '../../models/community';\nexport default () => getRecentCommunities();\n"
  },
  {
    "path": "api/queries/community/rootTopCommunities.js",
    "content": "// @flow\nimport { getCuratedCommunities } from '../../models/curatedContent';\nexport default () => getCuratedCommunities('top-communities-by-members');\n"
  },
  {
    "path": "api/queries/community/slackSettings.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport UserError from '../../utils/UserError';\nimport {\n  canModerateCommunity,\n  isAuthedResolver as requireAuth,\n} from '../../utils/permissions';\n\nexport default requireAuth(\n  async ({ id }: DBCommunity, _: any, { user, loaders }: GraphQLContext) => {\n    if (!await canModerateCommunity(user.id, id, loaders)) {\n      return new UserError('You don’t have permission to manage this channel');\n    }\n\n    return await loaders.communitySettings.load(id);\n  }\n);\n"
  },
  {
    "path": "api/queries/community/threadConnection.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport type { GraphQLContext } from '../../';\nimport { encode, decode } from '../../utils/base64';\nimport {\n  getChannelsByUserAndCommunity,\n  getPublicChannelsByCommunity,\n} from '../../models/channel';\nimport { getThreadsByChannels } from '../../models/thread';\nimport { canViewCommunity } from '../../utils/permissions';\n\nexport type CommunityThreadConnectionPaginationOptions = {\n  after: string,\n  first: number,\n  sort: 'latest' | 'trending',\n};\n\n// prettier-ignore\nexport default async (root: DBCommunity, args: CommunityThreadConnectionPaginationOptions, ctx: GraphQLContext) => {\n  const { first = 10, after, sort = 'latest' } = args\n  const { user, loaders } = ctx\n  const { id } = root\n\n  if (!await canViewCommunity(user, id, loaders)) {\n    return {\n      pageInfo: {\n        hasNextPage: false,\n      },\n      edges: []\n    }\n  }\n\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastThreadIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10) || 0;\n  const currentUser = user;\n\n  // if the user is signed in, only return stories for the channels\n  // the user is a member of -> this will ensure that they don't see\n  // stories in private channels that they aren't a member of.\n  // if the user is *not* signed in or not a member, only get threads\n  // from public channels within the community\n  let channels;\n  let isMember = false;\n  if (user) {\n    const permissions = await loaders.userPermissionsInCommunity.load([\n      user.id,\n      id,\n    ]);\n    isMember = permissions && permissions.isMember;\n  }\n  if (user && isMember) {\n    channels = await getChannelsByUserAndCommunity(id, currentUser.id);\n  } else {\n    channels = await getPublicChannelsByCommunity(id);\n  }\n\n  const threads = await getThreadsByChannels(channels, {\n    first,\n    after: lastThreadIndex,\n    sort,\n  });\n\n  return {\n    pageInfo: {\n      hasNextPage: threads && threads.length >= first,\n    },\n    edges: threads.map((thread, index) => ({\n      cursor: encode(`${thread.id}-${lastThreadIndex + index + 1}`),\n      node: thread,\n    })),\n  };\n};\n"
  },
  {
    "path": "api/queries/community/watercooler.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBCommunity } from 'shared/types';\nimport { getThreads } from '../../models/thread';\nimport { canViewCommunity } from '../../utils/permissions';\n\nexport default async (root: DBCommunity, _: any, ctx: GraphQLContext) => {\n  const { watercoolerId, id } = root;\n  const { user, loaders } = ctx;\n  if (!watercoolerId) return null;\n\n  if (!await canViewCommunity(user, id, loaders)) {\n    return null;\n  }\n\n  return await getThreads([watercoolerId]).then(\n    res => (res && res.length > 0 ? res[0] : null)\n  );\n};\n"
  },
  {
    "path": "api/queries/communityMember/index.js",
    "content": "// @flow\nimport communityMember from './rootCommunityMember';\nimport user from './user';\nimport roles from './roles';\n\nmodule.exports = {\n  Query: {\n    communityMember,\n  },\n  CommunityMember: {\n    user,\n    roles,\n  },\n};\n"
  },
  {
    "path": "api/queries/communityMember/roles.js",
    "content": "// @flow\nimport type { DBUsersCommunities } from 'shared/types';\n\nexport default ({\n  isModerator,\n  isOwner,\n  isBlocked,\n  isPending,\n}: DBUsersCommunities) => {\n  const roles = [];\n  if (isModerator) roles.push('moderator');\n  if (isOwner) roles.push('admin');\n  if (isBlocked) roles.push('blocked');\n  if (isPending) roles.push('pending');\n  return roles;\n};\n"
  },
  {
    "path": "api/queries/communityMember/rootCommunityMember.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\n\ntype GetCommunityMemberArgs = {\n  userId: string,\n  communityId: string,\n};\n\nexport default (\n  _: any,\n  args: GetCommunityMemberArgs,\n  { loaders }: GraphQLContext\n) => loaders.userPermissionsInCommunity.load([args.userId, args.communityId]);\n"
  },
  {
    "path": "api/queries/communityMember/user.js",
    "content": "// @flow\nimport type { DBUsersCommunities } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default async (\n  { userId }: DBUsersCommunities,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  if (userId) return await loaders.user.load(userId);\n  return null;\n};\n"
  },
  {
    "path": "api/queries/directMessageThread/index.js",
    "content": "// @flow\nimport directMessageThread from './rootDirectMessageThread';\nimport directMessageThreadByUserIds from './rootDirectMessageThreadByUserIds';\nimport messageConnection from './messageConnection';\nimport participants from './participants';\nimport snippet from './snippet';\n\nmodule.exports = {\n  Query: {\n    directMessageThread,\n    directMessageThreadByUserIds,\n  },\n  DirectMessageThread: {\n    messageConnection,\n    participants,\n    snippet,\n  },\n};\n"
  },
  {
    "path": "api/queries/directMessageThread/messageConnection.js",
    "content": "// @flow\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport type { GraphQLContext } from '../../';\nimport { canViewDMThread } from '../../utils/permissions';\nimport { encode, decode } from '../../utils/base64';\nimport { getMessages } from '../../models/message';\n\nexport default async (\n  { id }: { id: string },\n  { first, after }: PaginationOptions,\n  { user, loaders }: GraphQLContext\n) => {\n  if (!user || !user.id) return null;\n\n  const canViewThread = await canViewDMThread(user.id, id, loaders);\n  if (!canViewThread) return null;\n\n  const cursor = parseInt(decode(after), 10);\n  const messages = await getMessages(id, {\n    // NOTE(@mxstbr): We used to use first/after for reverse DM pagination\n    // so we have to keep it that way for backwards compat, but really this\n    // should be last/before since it's in the other way of time\n    last: first || 30,\n    before: cursor,\n  });\n\n  return {\n    pageInfo: {\n      hasNextPage: messages && messages.length >= first,\n      // NOTE(@mxstbr): For DM threads we just assume there to be a previous page\n      // if the user provided a cursor and there were at least some messages\n      // That way they might get a false positive here if they request the messages before the last message\n      // but since that query returns no messages this will be false and all will be well\n      // (so it essentially just takes 1 “unnecessary” request to figure out whether or not there is a previous page)\n      hasPreviousPage: messages && messages.length > 0 && !!cursor,\n    },\n    edges: messages.map(message => ({\n      cursor: encode(message.timestamp.getTime().toString()),\n      node: message,\n    })),\n  };\n};\n"
  },
  {
    "path": "api/queries/directMessageThread/participants.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { canViewDMThread } from '../../utils/permissions';\nimport { signUser } from 'shared/imgix';\n\nexport default async ({ id }: { id: string }, _: any, ctx: GraphQLContext) => {\n  const { loaders, user } = ctx;\n  if (!user || !user.id) return [];\n\n  const canViewThread = await canViewDMThread(user.id, id, loaders);\n\n  if (!canViewThread) return [];\n\n  return loaders.directMessageParticipants.load(id).then(results => {\n    if (!results || results.length === 0) return [];\n    return results.reduction.map(user => {\n      return signUser(user);\n    });\n  });\n};\n"
  },
  {
    "path": "api/queries/directMessageThread/rootDirectMessageThread.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { canViewDMThread } from '../../utils/permissions';\n\nexport default async (\n  _: any,\n  { id }: { id: string },\n  { user, loaders }: GraphQLContext\n) => {\n  // signed out users should never be able to request a dm thread\n  if (!user || !user.id) return null;\n\n  const canViewThread = await canViewDMThread(user.id, id, loaders);\n\n  if (!canViewThread) return null;\n\n  return loaders.directMessageThread.load(id);\n};\n"
  },
  {
    "path": "api/queries/directMessageThread/rootDirectMessageThreadByUserIds.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { checkForExistingDMThread } from '../../models/directMessageThread';\nimport { isAuthedResolver as requireAuth } from '../../utils/permissions';\n\ntype Args = {\n  userIds: Array<string>,\n};\n\nexport default requireAuth(async (_: any, args: Args, ctx: GraphQLContext) => {\n  // signed out users will never be able to view a dm thread\n  const { user: currentUser, loaders } = ctx;\n  const { userIds } = args;\n\n  const allMemberIds = [...userIds, currentUser.id];\n  const existingThread = await checkForExistingDMThread(allMemberIds);\n\n  if (!existingThread) return null;\n\n  return loaders.directMessageThread.load(existingThread);\n});\n"
  },
  {
    "path": "api/queries/directMessageThread/snippet.js",
    "content": "// @flow\n\nimport type { GraphQLContext } from '../../';\nimport { canViewDMThread } from '../../utils/permissions';\nimport { toPlainText, toState } from 'shared/draft-utils';\nimport { messageTypeObj } from 'shared/draft-utils/process-message-content';\n\nexport default async (\n  { id }: { id: string },\n  _: any,\n  { loaders, user }: GraphQLContext\n) => {\n  if (!user || !user.id) return null;\n\n  const canViewThread = await canViewDMThread(user.id, id, loaders);\n  if (!canViewThread) return null;\n\n  return loaders.directMessageSnippet.load(id).then(message => {\n    if (!message) return 'No messages yet...';\n    if (message.messageType === 'media') return '📷 Photo';\n    return message.messageType === messageTypeObj.draftjs\n      ? toPlainText(toState(JSON.parse(message.content.body)))\n      : message.content.body;\n  });\n};\n"
  },
  {
    "path": "api/queries/message/author.js",
    "content": "// @flow\nimport type { DBMessage } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default async (\n  { senderId, threadId, threadType }: DBMessage,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  // there will be no community to resolve in direct message threads, so we can escape early\n  // and only return the sender\n  if (threadType === 'directMessageThread') {\n    const user = loaders.user.load(senderId);\n    return {\n      user,\n    };\n  }\n\n  const [thread, user] = await Promise.all([\n    loaders.thread.load(threadId),\n    loaders.user.load(senderId),\n  ]);\n\n  if (!thread || !user) return null;\n\n  let [communityPermissions = {}, channelPermissions = {}] = await Promise.all([\n    loaders.userPermissionsInCommunity.load([user.id, thread.communityId]),\n    loaders.userPermissionsInChannel.load([user.id, thread.channelId]),\n  ]);\n\n  if (!communityPermissions) communityPermissions = {};\n  if (!channelPermissions) channelPermissions = {};\n\n  const isMember = communityPermissions.isMember || channelPermissions.isMember;\n  const isOwner = communityPermissions.isOwner;\n  const isModerator =\n    communityPermissions.isModerator || channelPermissions.isModerator;\n  const isBlocked =\n    channelPermissions.isBlocked || communityPermissions.isBlocked;\n\n  const roles = [];\n  if (isModerator) roles.push('moderator');\n  if (isOwner) roles.push('admin');\n  if (isBlocked) roles.push('blocked');\n\n  return {\n    id: communityPermissions.id,\n    user,\n    isOwner,\n    isModerator,\n    isBlocked,\n    isMember,\n    roles,\n  };\n};\n"
  },
  {
    "path": "api/queries/message/content.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBMessage } from 'shared/types';\nimport { signMessage } from 'shared/imgix';\n\nexport default (message: DBMessage, _: any, ctx: GraphQLContext) => {\n  const signedMessage = signMessage(message);\n  return signedMessage.content;\n};\n"
  },
  {
    "path": "api/queries/message/index.js",
    "content": "// @flow\nimport message from './rootMessage';\nimport getMediaMessagesForThread from './rootGetMediaMessagesForThread';\nimport sender from './sender';\nimport author from './author';\nimport thread from './thread';\nimport reactions from './reactions';\nimport parent from './parent';\nimport content from './content';\n\nmodule.exports = {\n  Query: {\n    message,\n    getMediaMessagesForThread,\n  },\n  Message: {\n    author,\n    sender, // deprecated\n    thread,\n    reactions,\n    parent,\n    content,\n  },\n};\n"
  },
  {
    "path": "api/queries/message/parent.js",
    "content": "// @flow\nimport type { DBMessage } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default (\n  { parentId }: DBMessage,\n  _: void,\n  { loaders }: GraphQLContext\n) => {\n  if (!parentId) return null;\n  return loaders.message.load(parentId);\n};\n"
  },
  {
    "path": "api/queries/message/reactions.js",
    "content": "// @flow\nimport type { DBMessage } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default ({ id }: DBMessage, _: any, { user, loaders }: GraphQLContext) =>\n  loaders.messageReaction.load(id).then(result => {\n    if (!result)\n      return {\n        count: 0,\n        hasReacted: false,\n      };\n    const reactions = result.reduction;\n    return {\n      count: reactions.length,\n      hasReacted: user\n        ? reactions.some(reaction => reaction.userId === user.id)\n        : false,\n    };\n  });\n"
  },
  {
    "path": "api/queries/message/rootGetMediaMessagesForThread.js",
    "content": "// @flow\nimport { getMediaMessagesForThread } from '../../models/message';\n\nexport default (_: any, { threadId }: { threadId: string }) =>\n  getMediaMessagesForThread(threadId);\n"
  },
  {
    "path": "api/queries/message/rootMessage.js",
    "content": "// @flow\nimport { getMessage } from '../../models/message';\nimport type { GraphQLContext } from '../../';\n\nexport default (_: any, { id }: { id: string }, { loaders }: GraphQLContext) =>\n  loaders.message.load(id);\n"
  },
  {
    "path": "api/queries/message/sender.js",
    "content": "// @flow\n/*\n\n    DEPRECATED 2/3/2018 by @brian\n\n*/\nimport type { DBMessage } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default async (\n  { senderId, threadId, threadType }: DBMessage,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  // there will be no community to resolve in direct message threads, so we can escape early\n  // and only return the sender\n  if (threadType === 'directMessageThread') {\n    return loaders.user.load(senderId);\n  }\n\n  const [thread, sender] = await Promise.all([\n    loaders.thread.load(threadId),\n    loaders.user.load(senderId),\n  ]);\n\n  if (!thread || !sender) return null;\n\n  const permissions = await loaders.userPermissionsInCommunity.load([\n    senderId,\n    thread.communityId,\n  ]);\n\n  return {\n    ...sender,\n    contextPermission: {\n      communityId: thread.communityId,\n      isModerator: permissions ? permissions.isModerator : false,\n      isOwner: permissions ? permissions.isOwner : false,\n      isBlocked: permissions ? permissions.isBlocked : false,\n    },\n  };\n};\n"
  },
  {
    "path": "api/queries/message/thread.js",
    "content": "// @flow\nimport type { DBMessage } from 'shared/types';\nimport { getThread } from '../../models/thread';\n\nexport default ({ threadId }: DBMessage) => getThread(threadId);\n"
  },
  {
    "path": "api/queries/reaction/index.js",
    "content": "// @flow\nimport reaction from './reaction';\nimport user from './user';\nimport message from './message';\n\nmodule.exports = {\n  Query: {\n    reaction,\n  },\n  Reaction: {\n    user,\n    message,\n  },\n};\n"
  },
  {
    "path": "api/queries/reaction/message.js",
    "content": "// @flow\nimport type { DBReaction } from 'shared/types';\nimport { getMessage } from '../../models/message';\n\nexport default ({ messageId }: DBReaction) => getMessage(messageId);\n"
  },
  {
    "path": "api/queries/reaction/reaction.js",
    "content": "// @flow\nimport { getReaction } from '../../models/reaction';\nexport default (_: any, { id }: { id: string }) => getReaction(id);\n"
  },
  {
    "path": "api/queries/reaction/user.js",
    "content": "// @flow\nimport type { DBReaction } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default ({ userId }: DBReaction, _: any, { loaders }: GraphQLContext) =>\n  loaders.user.load(userId);\n"
  },
  {
    "path": "api/queries/thread/attachments.js",
    "content": "// @flow\n/*\n\nDeprecated Oct 26 2018 by @brian\n\n*/\nimport type { DBThread } from 'shared/types';\n\nexport default () => [];\n"
  },
  {
    "path": "api/queries/thread/author.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default async (\n  { creatorId, communityId, channelId }: DBThread,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  let [\n    user,\n    communityPermissions = {},\n    channelPermissions = {},\n  ] = await Promise.all([\n    loaders.user.load(creatorId),\n    loaders.userPermissionsInCommunity.load([creatorId, communityId]),\n    loaders.userPermissionsInChannel.load([creatorId, channelId]),\n  ]);\n\n  if (!communityPermissions) communityPermissions = {};\n  if (!channelPermissions) channelPermissions = {};\n\n  const isMember = communityPermissions.isMember || channelPermissions.isMember;\n  const isOwner = communityPermissions.isOwner;\n  const isModerator =\n    communityPermissions.isModerator || channelPermissions.isModerator;\n  const isBlocked =\n    channelPermissions.isBlocked || communityPermissions.isBlocked;\n\n  const roles = [];\n  if (isModerator) roles.push('moderator');\n  if (isOwner) roles.push('admin');\n  if (isBlocked) roles.push('blocked');\n\n  return {\n    id: communityPermissions.id,\n    user,\n    isOwner,\n    isModerator,\n    isBlocked,\n    isMember,\n    roles,\n  };\n};\n"
  },
  {
    "path": "api/queries/thread/channel.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default async (root: DBThread, _: any, ctx: GraphQLContext) => {\n  const { channelId, id } = root;\n  const { loaders } = ctx;\n  const channel = await loaders.channel.load(channelId);\n  if (!channel) {\n    console.error(\n      'User queried thread of non-existent/deleted channel: ',\n      channelId\n    );\n    console.error('Thread queried: ', id);\n  }\n  return channel;\n};\n"
  },
  {
    "path": "api/queries/thread/community.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default async (root: DBThread, _: any, ctx: GraphQLContext) => {\n  const { communityId, id } = root;\n  const { loaders } = ctx;\n  const community = await loaders.community.load(communityId);\n  if (!community) {\n    console.error(\n      'User queried thread of non-existent/deleted community: ',\n      communityId\n    );\n    console.error('Thread queried: ', id);\n  }\n  return community;\n};\n"
  },
  {
    "path": "api/queries/thread/content.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\nimport { signThread } from 'shared/imgix';\n\nexport default (thread: DBThread, _: any, ctx: GraphQLContext) => {\n  const signedThread = signThread(thread);\n  return {\n    ...signedThread.content,\n    body: signedThread.content.body,\n  };\n};\n"
  },
  {
    "path": "api/queries/thread/creator.js",
    "content": "// @flow\n/*\n\n    DEPRECATED 2/3/2018 by @brian\n\n*/\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default async (\n  { creatorId, communityId }: DBThread,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  const creator = await loaders.user.load(creatorId);\n\n  const permissions = await loaders.userPermissionsInCommunity.load([\n    creatorId,\n    communityId,\n  ]);\n\n  return {\n    ...creator,\n    contextPermissions: {\n      communityId,\n      isModerator: permissions ? permissions.isModerator : false,\n      isOwner: permissions ? permissions.isOwner : false,\n      isBlocked: permissions ? permissions.isBlocked : false,\n    },\n  };\n};\n"
  },
  {
    "path": "api/queries/thread/editedBy.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default async (\n  { editedBy, communityId, channelId }: DBThread,\n  _: any,\n  { loaders }: GraphQLContext\n) => {\n  if (!editedBy) return null;\n  let [\n    user,\n    communityPermissions = {},\n    channelPermissions = {},\n  ] = await Promise.all([\n    loaders.user.load(editedBy),\n    loaders.userPermissionsInCommunity.load([editedBy, communityId]),\n    loaders.userPermissionsInChannel.load([editedBy, channelId]),\n  ]);\n\n  if (!communityPermissions) communityPermissions = {};\n  if (!channelPermissions) channelPermissions = {};\n\n  const isMember = communityPermissions.isMember || channelPermissions.isMember;\n  const isOwner = communityPermissions.isOwner;\n  const isModerator =\n    communityPermissions.isModerator || channelPermissions.isModerator;\n  const isBlocked =\n    channelPermissions.isBlocked || communityPermissions.isBlocked;\n\n  const roles = [];\n  if (isModerator) roles.push('moderator');\n  if (isOwner) roles.push('admin');\n  if (isBlocked) roles.push('blocked');\n\n  return {\n    id: communityPermissions.id,\n    user,\n    isOwner,\n    isModerator,\n    isBlocked,\n    isMember,\n    roles,\n  };\n};\n"
  },
  {
    "path": "api/queries/thread/index.js",
    "content": "// @flow\nimport thread from './rootThread';\nimport attachments from './attachments';\nimport channel from './channel';\nimport community from './community';\nimport participants from './participants';\nimport isAuthor from './isAuthor';\nimport isCreator from './isCreator'; // deprecated\nimport messageConnection from './messageConnection';\nimport author from './author';\nimport creator from './creator';\nimport content from './content';\nimport reactions from './reactions';\nimport metaImage from './metaImage';\nimport editedBy from './editedBy';\n\nimport type { DBThread } from 'shared/types';\n\nmodule.exports = {\n  Query: {\n    thread,\n  },\n  Thread: {\n    attachments,\n    channel,\n    community,\n    participants,\n    isAuthor,\n    isCreator, // deprcated\n    messageConnection,\n    author,\n    creator, // deprecated\n    content,\n    reactions,\n    metaImage,\n    messageCount: ({ messageCount }: DBThread) => messageCount || 0,\n    editedBy,\n  },\n};\n"
  },
  {
    "path": "api/queries/thread/isAuthor.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default ({ creatorId }: DBThread, _: any, { user }: GraphQLContext) => {\n  if (!creatorId || !user) return false;\n  return user.id === creatorId;\n};\n"
  },
  {
    "path": "api/queries/thread/isCreator.js",
    "content": "// @flow\n/*\n\n    DEPRECATED 2/8/2018 by @brian\n\n*/\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default ({ creatorId }: DBThread, _: any, { user }: GraphQLContext) => {\n  if (!creatorId || !user) return false;\n  return user.id === creatorId;\n};\n"
  },
  {
    "path": "api/queries/thread/messageConnection.js",
    "content": "// @flow\nconst debug = require('debug')('api:thread-message-connection');\nimport type { DBThread } from 'shared/types';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport UserError from '../../utils/UserError';\nimport { encode, decode } from '../../utils/base64';\nimport { getMessages } from '../../models/message';\n\nexport default (\n  { id }: DBThread,\n  {\n    first,\n    after,\n    last,\n    before,\n  }: { ...PaginationOptions, last: number, before: string }\n) => {\n  // Make sure users don't provide bonkers arguments that paginate in both directions at the same time\n  if (\n    (first && last) ||\n    (after && before) ||\n    (first && before) ||\n    (after && last)\n  ) {\n    debug('invalid pagination options provided:');\n    debug(\n      'first:',\n      first,\n      ' last:',\n      last,\n      ' after:',\n      after,\n      ' before:',\n      before\n    );\n    return new UserError(\n      'Cannot paginate back- and forwards at the same time. Please only ask for the first messages after a certain point or the last messages before a certain point.'\n    );\n  }\n\n  debug(`get messages for ${id}`);\n  let cursor = after || before;\n  try {\n    cursor = decode(cursor);\n    if (cursor) cursor = parseInt(cursor, 10);\n  } catch (err) {\n    console.error('❌ Error in job:\\n');\n    console.error(err);\n    return new UserError('Invalid cursor passed to thread.messageConnection.');\n  }\n  if (cursor) debug(`cursor: ${cursor}`);\n\n  let options = {\n    // Default first/last to 25 if their counterparts after/before are provided\n    // so users can query messageConnection(after: \"cursor\") or (before: \"cursor\")\n    // without any more options\n    first: first ? first : after ? 25 : null,\n    last: last ? last : before ? 25 : null,\n    // Set after/before to the cursor depending on which one was requested by the user\n    after: after ? cursor : null,\n    before: before ? cursor : null,\n  };\n\n  // If we didn't get any arguments at all (i.e messageConnection {})\n  // then just fetch the first 25 messages\n  // $FlowIssue\n  if (Object.keys(options).every(key => !options[key])) {\n    options = {\n      first: 25,\n    };\n  }\n\n  debug('pagination options for query:', options);\n\n  // Load one message too much so that we know whether there's\n  // a next or previous page\n  options.first && options.first++;\n  options.last && options.last++;\n\n  return getMessages(id, options).then(result => {\n    let messages = result;\n    // Check if more messages were returned than were requested, which would mean\n    // there's a next/previous page. (depending on the direction of the pagination)\n    const loadedMoreFirst = options.first && result.length > options.first - 1;\n    const loadedMoreLast = options.last && result.length > options.last - 1;\n\n    // Get rid of the extranous message if there is one\n    if (loadedMoreFirst) {\n      debug('not sending extranous message loaded first');\n      messages = result.slice(0, result.length - 1);\n    } else if (loadedMoreLast) {\n      debug('not sending extranous message loaded last');\n      messages = result.reverse().slice(1, result.length);\n    }\n\n    return {\n      pageInfo: {\n        // Use the extranous message that was maybe loaded to figure out whether\n        // there is a next/previous page, otherwise just try and guess based on\n        // if a cursor was provided\n        // $FlowIssue\n        hasNextPage: loadedMoreFirst || !!options.before,\n        // $FlowIssue\n        hasPreviousPage: loadedMoreLast || !!options.after,\n      },\n      edges: messages.map(message => ({\n        cursor: encode(message.timestamp.getTime().toString()),\n        node: message,\n      })),\n    };\n  });\n};\n"
  },
  {
    "path": "api/queries/thread/metaImage.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\nimport generateImageFromText from '../../utils/generate-thread-meta-image-from-text';\nimport { signImageUrl } from 'shared/imgix';\n\nexport default async (thread: DBThread, _: any, ctx: GraphQLContext) => {\n  const { loaders } = ctx;\n  const { watercooler, communityId, content } = thread;\n\n  const community = await loaders.community.load(communityId);\n  if (!community) return null;\n\n  const imageUrl = generateImageFromText({\n    title: watercooler\n      ? `Chat with the ${community.name} community`\n      : content.title,\n    footer: `spectrum.chat/${community.slug}`,\n  });\n\n  if (!imageUrl) return null;\n\n  return signImageUrl(imageUrl);\n};\n"
  },
  {
    "path": "api/queries/thread/participants.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBThread } from 'shared/types';\n\nexport default ({ id }: DBThread, _: any, { loaders }: GraphQLContext) => {\n  return loaders.threadParticipants\n    .load(id)\n    .then(result => (result ? result.reduction : []));\n};\n"
  },
  {
    "path": "api/queries/thread/reactions.js",
    "content": "// @flow\nimport { hasReactedToThread } from 'api/models/threadReaction';\nimport Raven from 'shared/raven';\nimport type { DBThread } from 'shared/types';\nimport type { GraphQLContext } from '../../';\n\nexport default async (root: DBThread, _: any, ctx: GraphQLContext) => {\n  const { user, loaders } = ctx;\n  const { id, reactionCount } = root;\n\n  const getReactionCount = async () => {\n    if (typeof reactionCount === 'number') return reactionCount;\n\n    Raven.captureException(\n      new Error(\n        `Thread with ID \"${id}\" does not have denormalized reactionCount.`\n      )\n    );\n\n    return await loaders.threadReaction.load(id).then(res => {\n      if (res && Array.isArray(res.reduction)) {\n        return res.reduction.length;\n      }\n\n      return 0;\n    });\n  };\n\n  const hasReacted = user ? await hasReactedToThread(user.id, id) : false;\n  const count = await getReactionCount();\n\n  return {\n    hasReacted,\n    count,\n  };\n};\n"
  },
  {
    "path": "api/queries/thread/rootThread.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { canViewThread } from '../../utils/permissions';\n\nexport default async (\n  _: any,\n  { id }: { id: string },\n  { loaders, user }: GraphQLContext\n) => {\n  if (!(await canViewThread(user ? user.id : 'undefined', id, loaders))) {\n    return null;\n  }\n\n  const thread = await loaders.thread.load(id);\n\n  if (!thread) return null;\n\n  return thread;\n};\n"
  },
  {
    "path": "api/queries/user/channelConnection.js",
    "content": "// @flow\nimport type { DBUser } from 'shared/types';\nimport { getChannelsByUser } from '../../models/channel';\n\nexport default (user: DBUser) => ({\n  pageInfo: {\n    hasNextPage: false,\n  },\n  edges: getChannelsByUser(user.id).then(channels =>\n    channels.map(channel => ({\n      node: channel,\n    }))\n  ),\n});\n"
  },
  {
    "path": "api/queries/user/communityConnection.js",
    "content": "// @flow\nimport type { DBUser } from 'shared/types';\nimport {\n  getVisibleCommunitiesByUser,\n  getPublicCommunitiesByUser,\n  getCommunitiesByUser,\n} from '../../models/community';\nimport type { GraphQLContext } from '../../';\n\nexport default async (user: DBUser, _: any, ctx: GraphQLContext) => {\n  const evaluatingUserId = user.id;\n  const { loaders, user: currentUser } = ctx;\n\n  let communities;\n  if (!currentUser || !currentUser.id) {\n    communities = await getPublicCommunitiesByUser(evaluatingUserId);\n  } else if (evaluatingUserId === currentUser.id) {\n    communities = await getCommunitiesByUser(currentUser.id);\n  } else {\n    communities = await getVisibleCommunitiesByUser(\n      evaluatingUserId,\n      currentUser.id\n    );\n  }\n\n  return {\n    pageInfo: {\n      hasNextPage: false,\n    },\n    edges: communities.map(async community => {\n      const permissions = await loaders.userPermissionsInCommunity.load([\n        user.id,\n        community.id,\n      ]);\n\n      return {\n        node: {\n          ...community,\n          contextPermissions: {\n            communityId: community.id,\n            isModerator: permissions ? permissions.isModerator : false,\n            isOwner: permissions ? permissions.isOwner : false,\n          },\n        },\n      };\n    }),\n  };\n};\n"
  },
  {
    "path": "api/queries/user/contextPermissions.js",
    "content": "// @flow\n/*\n\n    DEPRECATED 2/3/2018 by @brian\n\n*/\nimport type { GraphQLContext } from '../../';\nimport { getThread } from '../../models/thread';\nimport { getChannelById } from '../../models/channel';\nimport { getCommunities } from '../../models/community';\n\nexport default (user: any, _: any, { loaders }: GraphQLContext, info: any) => {\n  // in some cases we fetch this upstream - e.g. in the case of querying for usersThreads, we need to fetch contextPermissions before we hit this step as threadIds are not included in the query variables\n  if (user.contextPermissions) return user.contextPermissions;\n  if (!info.operation.name) return null;\n  const queryName = info.operation.name.value;\n  const handleCheck = async () => {\n    switch (queryName) {\n      case 'getThread':\n      case 'getThreadMessages': {\n        const threadId = info.variableValues.id;\n        const { communityId } = await getThread(threadId);\n        const {\n          isModerator,\n          isOwner,\n          isBlocked,\n        } = await loaders.userPermissionsInCommunity.load([\n          user.id,\n          communityId,\n        ]);\n        return {\n          isBlocked,\n          communityId,\n          isModerator,\n          isOwner,\n        };\n      }\n      case 'loadMoreCommunityMembers':\n      case 'getCommunityMembers': {\n        const communityId = info.variableValues.id;\n        const {\n          isOwner,\n          isBlocked,\n          isModerator,\n          isMember,\n        } = await loaders.userPermissionsInCommunity.load([\n          user.id,\n          communityId,\n        ]);\n        return {\n          communityId,\n          isMember,\n          isBlocked,\n          isModerator,\n          isOwner,\n        };\n      }\n      // eslint-disable-next-line\n      case 'loadMoreCommunityMembers':\n      case 'getChannelMembers': {\n        const channelId = info.variableValues.id;\n        const { communityId } = await getChannelById(channelId);\n        const {\n          isModerator,\n          isOwner,\n          isBlocked,\n        } = await loaders.userPermissionsInCommunity.load([\n          user.id,\n          communityId,\n        ]);\n        return {\n          isBlocked,\n          communityId,\n          isModerator,\n          isOwner,\n        };\n      }\n    }\n  };\n\n  return handleCheck();\n};\n"
  },
  {
    "path": "api/queries/user/coverPhoto.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\nimport { signUser } from 'shared/imgix';\n\nexport default (user: DBUser, _: any, ctx: GraphQLContext) => {\n  const { coverPhoto } = signUser(user);\n  return coverPhoto;\n};\n"
  },
  {
    "path": "api/queries/user/directMessageThreadsConnection.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { encode, decode } from '../../utils/base64';\nimport { getDirectMessageThreadsByUser } from '../../models/directMessageThread';\n\nexport default async (\n  _: any,\n  { first = 15, after }: PaginationOptions,\n  { user }: GraphQLContext\n) => {\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastThreadIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10);\n\n  const threads = await getDirectMessageThreadsByUser(user.id, {\n    first,\n    after: lastThreadIndex,\n  });\n\n  return {\n    pageInfo: {\n      hasNextPage: threads && threads.length >= first,\n    },\n    edges: threads.map((thread, index) => ({\n      cursor: encode(`${thread.id}-${lastThreadIndex + index + 1}`),\n      node: thread,\n    })),\n  };\n};\n"
  },
  {
    "path": "api/queries/user/email.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\nimport { isAdmin } from '../../utils/permissions';\n\nexport default async (\n  { id }: DBUser,\n  _: any,\n  { user, loaders }: GraphQLContext\n) => {\n  // Only admins and the user themselves can view the email\n  if (!user || (id !== user.id && !isAdmin(user.id))) return null;\n  const { email } = await loaders.user.load(id);\n  return email;\n};\n"
  },
  {
    "path": "api/queries/user/everything.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { encode, decode } from '../../utils/base64';\nimport { getEverything } from 'shared/db/queries/user';\n\nexport default (\n  _: any,\n  { first, after }: PaginationOptions,\n  { user }: GraphQLContext\n) => {\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastThreadIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10);\n  // $FlowFixMe\n  return getEverything(user.id, {\n    first,\n    after: lastThreadIndex,\n  }).then(result => ({\n    pageInfo: {\n      hasNextPage: result && result.length >= first,\n    },\n    edges: result\n      ? result.map((thread, index) => ({\n          cursor: encode(`${thread.id}-${lastThreadIndex + index + 1}`),\n          node: thread,\n        }))\n      : [],\n  }));\n};\n"
  },
  {
    "path": "api/queries/user/githubProfile.js",
    "content": "// @flow\nimport type { DBUser } from 'shared/types';\n\nexport default ({ githubProviderId, githubUsername }: DBUser) => {\n  if (!githubProviderId || !githubUsername) return null;\n  return {\n    id: githubProviderId,\n    username: githubUsername,\n  };\n};\n"
  },
  {
    "path": "api/queries/user/index.js",
    "content": "// @flow\nimport user from './rootUser';\nimport currentUser from './rootCurrentUser';\n\nimport email from './email';\nimport coverPhoto from './coverPhoto';\nimport profilePhoto from './profilePhoto';\nimport everything from './everything';\nimport communityConnection from './communityConnection';\nimport channelConnection from './channelConnection';\nimport directMessageThreadsConnection from './directMessageThreadsConnection';\nimport threadConnection from './threadConnection';\nimport threadCount from './threadCount';\nimport settings from './settings';\nimport isAdmin from './isAdmin';\nimport contextPermissions from './contextPermissions';\nimport githubProfile from './githubProfile';\n\n// no-op resolvers to transition while removing payments\nimport type { DBUser } from 'shared/types';\nconst isPro = (dbUser: DBUser) => dbUser.betaSupporter;\nconst recurringPayments = () => [];\nconst invoices = () => [];\n\nmodule.exports = {\n  Query: {\n    user,\n    currentUser,\n  },\n  User: {\n    email,\n    coverPhoto,\n    profilePhoto,\n    everything,\n    communityConnection,\n    channelConnection,\n    directMessageThreadsConnection,\n    threadConnection,\n    threadCount,\n    settings,\n    isAdmin,\n    githubProfile,\n    contextPermissions,\n    isPro,\n    recurringPayments,\n    invoices,\n  },\n};\n"
  },
  {
    "path": "api/queries/user/isAdmin.js",
    "content": "// @flow\nimport type { DBUser } from 'shared/types';\nimport { isAdmin } from '../../utils/permissions';\n\nexport default ({ id }: DBUser) => isAdmin(id);\n"
  },
  {
    "path": "api/queries/user/profilePhoto.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\nimport { signUser } from 'shared/imgix';\n\nexport default (user: DBUser, _: any, ctx: GraphQLContext) => {\n  const { profilePhoto } = signUser(user);\n  return profilePhoto;\n};\n"
  },
  {
    "path": "api/queries/user/rootCurrentUser.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport { getUserById } from 'shared/db/queries/user';\n\nexport default async (_: any, __: any, { user }: GraphQLContext) => {\n  if (!user || !user.id) return null;\n  const dbUser = await getUserById(user.id);\n  if (!dbUser || dbUser.bannedAt) return null;\n  return dbUser;\n};\n"
  },
  {
    "path": "api/queries/user/rootUser.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\n\nexport default (\n  _: any,\n  args: { id?: string, username?: string } = {},\n  { loaders }: GraphQLContext\n) => {\n  if (args.id) return loaders.user.load(args.id);\n  if (args.username) return loaders.userByUsername.load(args.username);\n  return null;\n};\n"
  },
  {
    "path": "api/queries/user/settings.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\nimport {\n  getUsersSettings,\n  createNewUsersSettings,\n} from '../../models/usersSettings';\nimport UserError from '../../utils/UserError';\n\nexport default async (_: DBUser, __: any, { user }: GraphQLContext) => {\n  if (!user) return new UserError('You must be signed in to continue.');\n  const settings = await getUsersSettings(user.id);\n  if (settings) return settings;\n  return await createNewUsersSettings(user.id);\n};\n"
  },
  {
    "path": "api/queries/user/threadConnection.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\nimport type { PaginationOptions } from '../../utils/paginate-arrays';\nimport { encode, decode } from '../../utils/base64';\nconst {\n  getViewableThreadsByUser,\n  getPublicThreadsByUser,\n  getPublicParticipantThreadsByUser,\n  getViewableParticipantThreadsByUser,\n} = require('../../models/thread');\n\nexport default (\n  { id }: DBUser,\n  {\n    first,\n    after,\n    kind,\n  }: { ...PaginationOptions, kind: 'creator' | 'participant' },\n  { user }: GraphQLContext\n) => {\n  const currentUser = user;\n  const cursor = decode(after);\n  // Get the index from the encoded cursor, asdf234gsdf-2 => [\"-2\", \"2\"]\n  const lastDigits = cursor.match(/-(\\d+)$/);\n  const lastThreadIndex =\n    lastDigits && lastDigits.length > 0 && parseInt(lastDigits[1], 10);\n  // if a logged in user is viewing the profile, handle logic to get viewable threads\n\n  let getThreads;\n  if (currentUser) {\n    getThreads =\n      kind === 'creator'\n        ? // $FlowIssue\n          getViewableThreadsByUser(id, currentUser.id, {\n            first,\n            after: lastThreadIndex,\n          })\n        : // $FlowIssue\n          getViewableParticipantThreadsByUser(id, currentUser.id, {\n            first,\n            after: lastThreadIndex,\n          });\n  } else {\n    getThreads =\n      kind === 'creator'\n        ? // $FlowIssue\n          getPublicThreadsByUser(id, { first, after: lastThreadIndex })\n        : // $FlowIssue\n          getPublicParticipantThreadsByUser(id, {\n            first,\n            after: lastThreadIndex,\n          });\n  }\n\n  return getThreads.then(result => ({\n    pageInfo: {\n      // $FlowFixMe => super weird\n      hasNextPage: result && result.length >= first,\n    },\n    edges: result.map((thread, index) => ({\n      cursor: encode(`${thread.id}-${lastThreadIndex + index + 1}`),\n      node: thread,\n    })),\n  }));\n};\n"
  },
  {
    "path": "api/queries/user/threadCount.js",
    "content": "// @flow\nimport type { GraphQLContext } from '../../';\nimport type { DBUser } from 'shared/types';\n\nexport default ({ id }: DBUser, _: any, { loaders }: GraphQLContext) => {\n  return loaders.userThreadCount.load(id).then(data => (data ? data.count : 0));\n};\n"
  },
  {
    "path": "api/routes/api/export-user-data.js",
    "content": "// @flow\nimport { Router } from 'express';\nconst userDataRouter = Router();\nimport { getUserById } from 'shared/db/queries/user';\n\nuserDataRouter.get('/', async (req: express$Request, res: express$Response) => {\n  if (!req.user) return res.send('No logged-in user');\n\n  // $FlowIssue\n  const user = await getUserById(req.user.id);\n  if (!user) return res.send('User not found.');\n\n  // This forces the browser to download a .json file instead of rendering it\n  res.setHeader('Content-Type', 'application/octet-stream');\n  return res.send(user);\n});\n\nexport default userDataRouter;\n"
  },
  {
    "path": "api/routes/api/index.js",
    "content": "// @flow\nimport { Router } from 'express';\n\nconst apiRouter = Router();\n\n// import graphiql from './graphiql';\n// // Only allow GraphiQL in development\n// if (process.env.NODE_ENV === 'development') {\n//   apiRouter.use('/graphiql', graphiql);\n// }\n\nimport userExportRouter from './export-user-data';\napiRouter.use('/user.json', userExportRouter);\n\n// import graphql from './graphql';\n// apiRouter.use('/', graphql);\n\nexport default apiRouter;\n"
  },
  {
    "path": "api/routes/auth/create-signin-routes.js",
    "content": "/* @flow\n *\n * A reusable set of routes for signing in with different providers. Handles token-based authentication.\n * Usage:\n *\n * const { main, callbacks } = createSigninRoutes('facebook');\n * facebookRouter.get('/', main);\n * facebookRouter.get('/callback', ...callbacks);\n */\nimport passport from 'passport';\nimport { URL } from 'url';\nimport isSpectrumUrl from '../../utils/is-spectrum-url';\n\nconst IS_PROD = process.env.NODE_ENV === 'production';\nconst FALLBACK_URL = IS_PROD\n  ? 'https://spectrum.chat/home'\n  : 'http://localhost:3000/home';\n\ntype Strategy = 'twitter' | 'facebook' | 'github' | 'google';\n\nexport const createSigninRoutes = (\n  strategy: Strategy,\n  strategyOptions?: Object\n) => {\n  return {\n    // The main route takes care of storing the redirect URL in the session\n    // and passing the right options\n    main: (req: express$Request, ...rest: any) => {\n      let url = FALLBACK_URL;\n      if (typeof req.query.r === 'string' && isSpectrumUrl(req.query.r)) {\n        url = req.query.r;\n      }\n\n      // Attach the redirectURL and authType to the session so we have it in the /auth/twitter/callback route\n      // $FlowIssue\n      req.session.redirectUrl = url;\n\n      return passport.authenticate(strategy, strategyOptions)(req, ...rest);\n    },\n    // The callbacks take care of authenticating, setting the response cookies,\n    // redirecting to the right place and handling tokens\n    callbacks: [\n      passport.authenticate(strategy, {\n        failureRedirect: '/',\n      }),\n      (req: express$Request, res: express$Response) => {\n        // $FlowIssue\n        const redirectUrl = req.session.redirectUrl\n          ? new URL(req.session.redirectUrl)\n          : new URL(FALLBACK_URL);\n        redirectUrl.searchParams.append('authed', 'true');\n        if (req.authInfo && req.authInfo.message) {\n          redirectUrl.searchParams.append(\n            'toastMessage',\n            // $FlowIssue\n            req.authInfo.message\n          );\n          redirectUrl.searchParams.append('toastType', 'error');\n        }\n\n        // Delete the redirectURL from the session again so we don't redirect\n        // to the old URL the next time around\n        // $FlowIssue\n        req.session.redirectUrl = undefined;\n        res.cookie('_now_no_cache', '1', {\n          maxAge: 315569260000, // 10 years\n          sameSite: 'lax',\n          secure: false,\n        });\n        return res.redirect(redirectUrl.href);\n      },\n    ],\n  };\n};\n"
  },
  {
    "path": "api/routes/auth/facebook.js",
    "content": "// @flow\nimport { Router } from 'express';\nimport { createSigninRoutes } from './create-signin-routes';\n\nconst facebookAuthRouter = Router();\nconst { main, callbacks } = createSigninRoutes('facebook', {\n  scope: ['email'],\n});\n\nfacebookAuthRouter.get('/', main);\n\nfacebookAuthRouter.get('/callback', ...callbacks);\n\nexport default facebookAuthRouter;\n"
  },
  {
    "path": "api/routes/auth/github.js",
    "content": "// @flow\nimport { Router } from 'express';\nimport { createSigninRoutes } from './create-signin-routes';\n\nconst githubAuthRouter = Router();\nconst { main, callbacks } = createSigninRoutes('github', {\n  scope: ['read:user,user:email'],\n  state: true,\n});\n\ngithubAuthRouter.get('/', main);\n\ngithubAuthRouter.get('/callback', ...callbacks);\n\nexport default githubAuthRouter;\n"
  },
  {
    "path": "api/routes/auth/google.js",
    "content": "// @flow\nimport { Router } from 'express';\nimport { createSigninRoutes } from './create-signin-routes';\n\nconst googleAuthRouter = Router();\nconst { main, callbacks } = createSigninRoutes('google', {\n  scope: 'profile email',\n});\n\ngoogleAuthRouter.get('/', main);\n\ngoogleAuthRouter.get('/callback', ...callbacks);\n\nexport default googleAuthRouter;\n"
  },
  {
    "path": "api/routes/auth/index.js",
    "content": "// @flow\nimport { Router } from 'express';\nimport twitterAuthRoutes from './twitter';\nimport facebookAuthRoutes from './facebook';\nimport googleAuthRoutes from './google';\nimport githubAuthRoutes from './github';\nimport logoutRoutes from './logout';\n\nconst authRouter = Router();\n\nauthRouter.use('/twitter', twitterAuthRoutes);\nauthRouter.use('/facebook', facebookAuthRoutes);\nauthRouter.use('/google', googleAuthRoutes);\nauthRouter.use('/github', githubAuthRoutes);\nauthRouter.use('/logout', logoutRoutes);\n\nexport default authRouter;\n"
  },
  {
    "path": "api/routes/auth/logout.js",
    "content": "import { Router } from 'express';\nconst debug = require('debug')('api:routes:auth:logout');\nimport { destroySession } from '../../models/session';\n\nconst IS_PROD = process.env.NODE_ENV === 'production';\nconst HOME = IS_PROD ? '/explore' : 'http://localhost:3000/explore';\nconst logoutRouter = Router();\n\nlogoutRouter.get('/', (req, res) => {\n  req.logout();\n  return res.redirect(HOME);\n});\n\nexport default logoutRouter;\n"
  },
  {
    "path": "api/routes/auth/twitter.js",
    "content": "// @flow\nimport { Router } from 'express';\nimport { createSigninRoutes } from './create-signin-routes';\n\nconst twitterAuthRouter = Router();\nconst { main, callbacks } = createSigninRoutes('twitter');\n\ntwitterAuthRouter.get('/', main);\n\ntwitterAuthRouter.get('/callback', ...callbacks);\n\nexport default twitterAuthRouter;\n"
  },
  {
    "path": "api/routes/create-subscription-server.js",
    "content": "// @flow\nimport { SubscriptionServer } from 'subscriptions-transport-ws';\nimport { execute, subscribe } from 'graphql';\n\nimport schema from '../schema';\n\n/**\n * Create a subscription server based on an exisiting express.js server\n */\nconst createSubscriptionsServer = (server: any, path: string) => {\n  // Start subscriptions server\n  return SubscriptionServer.create(\n    {\n      execute,\n      subscribe,\n      schema,\n      keepAlive: 10000,\n    },\n    {\n      server,\n      path,\n    }\n  );\n};\n\nexport default createSubscriptionsServer;\n"
  },
  {
    "path": "api/routes/middlewares/index.js",
    "content": "import { Router } from 'express';\n\nconst middlewares = Router();\n\nimport threadParamRedirect from 'shared/middlewares/thread-param';\nmiddlewares.use(threadParamRedirect);\n\nimport bodyParser from 'body-parser';\nmiddlewares.use(bodyParser.json());\n\nmiddlewares.use((req, res, next) => {\n  if (req.method === 'POST' && req.url !== '/api') console.log('POST', req.url);\n\n  next();\n});\n\nif (process.env.NODE_ENV === 'development') {\n  const logging = require('shared/middlewares/logging');\n  middlewares.use(logging);\n}\n\nif (process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV) {\n  // Raven (Sentry client) needs to come before everything else\n  const raven = require('shared/middlewares/raven').default;\n  middlewares.use(raven);\n}\n\n// Cross origin request support\nimport cors from 'shared/middlewares/cors';\nmiddlewares.use(cors);\nmiddlewares.options('*', cors);\n\nimport cookieParser from 'cookie-parser';\nmiddlewares.use(cookieParser());\n\nimport session from 'shared/middlewares/session';\nmiddlewares.use(session);\n\nimport passport from 'passport';\nmiddlewares.use(passport.initialize());\nmiddlewares.use(passport.session());\n\n// Refresh authenticated users expiry time\nmiddlewares.use((req, res, next) => {\n  if (req.session && req.user) {\n    req.session.lastRequest = Date.now();\n  }\n  next();\n});\n\nconst isSerializedJSON = str => str[0] === '{';\n\n// NOTE(@mxstbr): If a logged-in user with a legacy cookie (just the user ID) sends a request\n// we add all the user data to the cookie (by calling req.login) to move them to the new cookie\n// format.\n// @see #3944\n// @see https://stackoverflow.com/a/24498660\nmiddlewares.use((req, res, next) => {\n  if (\n    req.session &&\n    req.session.passport &&\n    typeof req.session.passport.user === 'string' &&\n    !isSerializedJSON(req.session.passport.user[0]) &&\n    req.user\n  ) {\n    req.login(req.user, () => {\n      next();\n    });\n    return;\n  }\n\n  next();\n});\n\nexport default middlewares;\n"
  },
  {
    "path": "api/schema.js",
    "content": "// @flow\n/**\n * The combined schema out of types and resolvers (queries, mutations and subscriptions)\n */\nconst {\n  makeExecutableSchema,\n  addSchemaLevelResolveFunction,\n} = require('graphql-tools');\nconst debug = require('debug')('api:resolvers');\nconst logExecutions = require('graphql-log')({\n  logger: debug,\n});\nconst { merge } = require('lodash');\nimport UserError from './utils/UserError';\n\nconst scalars = require('./types/scalars');\nconst generalTypes = require('./types/general');\n\nconst Thread = require('./types/Thread');\nconst Channel = require('./types/Channel');\nconst Community = require('./types/Community');\nconst Message = require('./types/Message');\nconst Reaction = require('./types/Reaction');\nconst User = require('./types/User');\nconst DirectMessageThread = require('./types/DirectMessageThread');\nconst Invoice = require('./types/Invoice');\nconst CommunityMember = require('./types/CommunityMember');\nconst ThreadParticipant = require('./types/ThreadParticipant');\n\nconst ThreadQueries = require('./queries/thread');\nconst channelQueries = require('./queries/channel');\nconst communityQueries = require('./queries/community');\nconst messageQueries = require('./queries/message');\nconst userQueries = require('./queries/user');\nconst reactionQueries = require('./queries/reaction');\nconst directMessageThreadQueries = require('./queries/directMessageThread');\nconst communityMemberQueries = require('./queries/communityMember');\n\nconst messageMutations = require('./mutations/message');\nconst threadMutations = require('./mutations/thread');\nconst communityMutations = require('./mutations/community');\nconst channelMutations = require('./mutations/channel');\nconst userMutations = require('./mutations/user');\nconst fileMutations = require('./mutations/files');\n\nconst Root = /* GraphQL */ `\n  # The dummy queries and mutations are necessary because\n  # graphql-js cannot have empty root types and we only extend\n  # these types later on\n  # Ref: apollographql/graphql-tools#293\n  type Query {\n    dummy: String\n  }\n\n  type Mutation {\n    dummy: String\n  }\n\n  type Subscription {\n    dummy: String\n  }\n\n  schema {\n    query: Query\n    mutation: Mutation\n    subscription: Subscription\n  }\n`;\n\nconst resolvers = merge(\n  {},\n  //queries\n  scalars.resolvers,\n  ThreadQueries,\n  channelQueries,\n  communityQueries,\n  messageQueries,\n  userQueries,\n  directMessageThreadQueries,\n  reactionQueries,\n  communityMemberQueries,\n  // mutations\n  messageMutations,\n  threadMutations,\n  communityMutations,\n  channelMutations,\n  userMutations,\n  fileMutations\n);\n\nif (process.env.NODE_ENV === 'development' && debug.enabled) {\n  logExecutions(resolvers);\n}\n\n// Create the final GraphQL schema out of the type definitions\n// and the resolvers\nconst schema = makeExecutableSchema({\n  typeDefs: [\n    scalars.typeDefs,\n    generalTypes,\n    Root,\n    Community,\n    CommunityMember,\n    Channel,\n    Thread,\n    ThreadParticipant,\n    Message,\n    Reaction,\n    User,\n    DirectMessageThread,\n    Invoice,\n  ],\n  resolvers,\n  schemaDirectives: {},\n});\n\nif (process.env.REACT_APP_MAINTENANCE_MODE === 'enabled') {\n  console.error('\\n\\n⚠️ ----MAINTENANCE MODE ENABLED----⚠️\\n\\n');\n  addSchemaLevelResolveFunction(schema, () => {\n    throw new UserError(\n      \"We're currently undergoing planned maintenance. We'll be back soon, please check https://twitter.com/withspectrum for ongoing updates!\"\n    );\n  });\n}\n\nmodule.exports = schema;\n"
  },
  {
    "path": "api/subscriptions/community.js",
    "content": "// @flow\nmodule.exports = {\n  Subscription: {},\n};\n"
  },
  {
    "path": "api/subscriptions/directMessageThread.js",
    "content": "// @flow\nmodule.exports = {\n  Subscription: {},\n};\n"
  },
  {
    "path": "api/subscriptions/message.js",
    "content": "// @flow\nmodule.exports = {\n  Subscription: {},\n};\n"
  },
  {
    "path": "api/subscriptions/notification.js",
    "content": "// @flow\nmodule.exports = {\n  Subscription: {},\n};\n"
  },
  {
    "path": "api/subscriptions/thread.js",
    "content": "// @flow\n\nmodule.exports = {\n  Subscription: {},\n};\n"
  },
  {
    "path": "api/test/__snapshots__/community.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a communities threads 1`] = `\nObject {\n  \"data\": Object {\n    \"community\": Object {\n      \"threadConnection\": Object {\n        \"edges\": Array [\n          Object {\n            \"node\": Object {\n              \"content\": Object {\n                \"title\": \"Yet another thread\",\n              },\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"content\": Object {\n                \"title\": \"Yet another thread\",\n              },\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"content\": Object {\n                \"title\": \"Yet another thread\",\n              },\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"content\": Object {\n                \"title\": \"Another thread\",\n              },\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"content\": Object {\n                \"title\": \"The first thread! 🎉\",\n              },\n            },\n          },\n        ],\n      },\n    },\n  },\n}\n`;\n\nexports[`should fetch a community 1`] = `\nObject {\n  \"data\": Object {\n    \"community\": Object {\n      \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n      \"description\": \"The future of communities\",\n      \"id\": \"1\",\n      \"name\": \"Spectrum\",\n      \"slug\": \"spectrum\",\n      \"website\": \"https://spectrum.chat\",\n    },\n  },\n}\n`;\n\nexports[`should fetch a list of communities 1`] = `\nObject {\n  \"data\": Object {\n    \"communities\": Array [\n      Object {\n        \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n        \"description\": \"The future of communities\",\n        \"id\": \"1\",\n        \"slug\": \"spectrum\",\n        \"website\": \"https://spectrum.chat\",\n      },\n    ],\n  },\n}\n`;\n\nexports[`should fetch a list of community members 1`] = `\nObject {\n  \"data\": Object {\n    \"community\": Object {\n      \"id\": \"1\",\n      \"members\": Object {\n        \"edges\": Array [\n          Object {\n            \"cursor\": \"Mi0x\",\n            \"node\": Object {\n              \"isBlocked\": false,\n              \"isMember\": true,\n              \"isModerator\": false,\n              \"isOwner\": false,\n              \"user\": Object {\n                \"id\": \"2\",\n              },\n            },\n          },\n          Object {\n            \"cursor\": \"My0y\",\n            \"node\": Object {\n              \"isBlocked\": false,\n              \"isMember\": true,\n              \"isModerator\": false,\n              \"isOwner\": false,\n              \"user\": Object {\n                \"id\": \"3\",\n              },\n            },\n          },\n          Object {\n            \"cursor\": \"OC0z\",\n            \"node\": Object {\n              \"isBlocked\": false,\n              \"isMember\": true,\n              \"isModerator\": false,\n              \"isOwner\": false,\n              \"user\": Object {\n                \"id\": \"8\",\n              },\n            },\n          },\n          Object {\n            \"cursor\": \"MS00\",\n            \"node\": Object {\n              \"isBlocked\": false,\n              \"isMember\": true,\n              \"isModerator\": false,\n              \"isOwner\": true,\n              \"user\": Object {\n                \"id\": \"1\",\n              },\n            },\n          },\n        ],\n        \"pageInfo\": Object {\n          \"hasNextPage\": false,\n          \"hasPreviousPage\": null,\n        },\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/__snapshots__/directMessageThread.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`messageConnection should fetch a directMessageThreads messages 1`] = `\nObject {\n  \"data\": Object {\n    \"directMessageThread\": Object {\n      \"messageConnection\": Object {\n        \"edges\": Array [\n          Object {\n            \"node\": Object {\n              \"id\": \"13\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"12\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"11\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"10\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"9\",\n            },\n          },\n        ],\n      },\n    },\n  },\n}\n`;\n\nexports[`should fetch a directMessageThread 1`] = `\nObject {\n  \"data\": Object {\n    \"directMessageThread\": Object {\n      \"id\": \"dm-1\",\n      \"threadLastActive\": \"2016-12-31T23:00:00.000Z\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/__snapshots__/user.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`queries should fetch a user 1`] = `\nObject {\n  \"data\": Object {\n    \"user\": Object {\n      \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n      \"description\": \"Makes styled-components, react-boilerplate and micro-analytics 💅 Speciality coffee geek, skier, traveller ☕\",\n      \"email\": null,\n      \"id\": \"1\",\n      \"name\": \"Max Stoiber\",\n      \"providerId\": \"2451223458\",\n      \"username\": \"mxstbr\",\n      \"website\": \"https://mxstbr.com\",\n    },\n  },\n}\n`;\n\nexports[`queries should fetch a users communities 1`] = `\nObject {\n  \"data\": Object {\n    \"user\": Object {\n      \"communityConnection\": Object {\n        \"edges\": Array [\n          Object {\n            \"node\": Object {\n              \"name\": \"Payments\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"name\": \"Spectrum\",\n            },\n          },\n        ],\n      },\n    },\n  },\n}\n`;\n\nexports[`queries should return null for a non-existent id 1`] = `\nObject {\n  \"data\": Object {\n    \"user\": null,\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/channel/mutations/__snapshots__/createChannel.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should create a channel if user is owner 1`] = `\nObject {\n  \"data\": Object {\n    \"createChannel\": Object {\n      \"description\": \"test description\",\n      \"isPrivate\": false,\n      \"name\": \"test channel\",\n      \"slug\": \"test-channel\",\n    },\n  },\n}\n`;\n\nexports[`should prevent duplicate channel slugs in the same community 1`] = `\nObject {\n  \"data\": Object {\n    \"createChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: A channel with this slug already exists.],\n  ],\n}\n`;\n\nexports[`should prevent moderators from creating a channel 1`] = `\nObject {\n  \"data\": Object {\n    \"createChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to create a channel in this community.],\n  ],\n}\n`;\n\nexports[`should prevent non owners from creating a channel 1`] = `\nObject {\n  \"data\": Object {\n    \"createChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to create a channel in this community.],\n  ],\n}\n`;\n\nexports[`should prevent signed out users from creating a channel 1`] = `\nObject {\n  \"data\": Object {\n    \"createChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to create a new community.],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/channel/mutations/__snapshots__/deleteChannel.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should delete a channel if user is owner 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteChannel\": true,\n  },\n}\n`;\n\nexports[`should delete all threads in the deleted channel 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteChannel\": true,\n  },\n}\n`;\n\nexports[`should not delete a channel if user is not owner 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to make changes to this channel],\n  ],\n}\n`;\n\nexports[`should not delete a channel if user is not signed in 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to make changes to this channel.],\n  ],\n}\n`;\n\nexports[`should not delete the general channel 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: The general channel can't be deleted],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/channel/mutations/__snapshots__/editChannel.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should edit a channel if user is owner 1`] = `\nObject {\n  \"data\": Object {\n    \"editChannel\": Object {\n      \"description\": \"edited description\",\n      \"isPrivate\": false,\n      \"name\": \"edited name\",\n      \"slug\": \"edited-slug\",\n    },\n  },\n}\n`;\n\nexports[`should not edit a channel if user is not owner 1`] = `\nObject {\n  \"data\": Object {\n    \"editChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to make changes to this channel.],\n  ],\n}\n`;\n\nexports[`should not edit a channel if user is not signed in 1`] = `\nObject {\n  \"data\": Object {\n    \"editChannel\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to make changes to this channel.],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/channel/mutations/createChannel.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\n\n// various permissions for Spectrum community\nconst owner = data.users.find(({ username }) => username === 'mxstbr');\nconst moderator = data.users.find(({ username }) => username === 'brian');\nconst noPermissionUser = data.users.find(({ username }) => username === 'bryn');\n\nafterEach(() => {\n  return db\n    .table('channels')\n    .filter({ slug: 'test-channel' })\n    .delete()\n    .run();\n});\n\nconst variables = {\n  input: {\n    name: 'test channel',\n    slug: 'test-channel',\n    description: 'test description',\n    isPrivate: false,\n    isDefault: false,\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n  },\n};\n\nit('should create a channel if user is owner', async () => {\n  const query = /* GraphQL */ `\n    mutation createChannel($input: CreateChannelInput!) {\n      createChannel (input: $input) {\n        name\n        slug\n        description\n        isPrivate\n      }\n    },\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent duplicate channel slugs in the same community', async () => {\n  const query = /* GraphQL */ `\n    mutation createChannel($input: CreateChannelInput!) {\n      createChannel (input: $input) {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    },\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(1);\n  const result = await request(query, {\n    context,\n    variables: {\n      input: {\n        ...variables.input,\n        slug: 'general',\n      },\n    },\n  });\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent signed out users from creating a channel', async () => {\n  const query = /* GraphQL */ `\n    mutation createChannel($input: CreateChannelInput!) {\n      createChannel (input: $input) {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    },\n  `;\n\n  const context = {\n    user: null,\n  };\n\n  expect.assertions(1);\n  const result = await request(query, { context, variables });\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent non owners from creating a channel', async () => {\n  const query = /* GraphQL */ `\n    mutation createChannel($input: CreateChannelInput!) {\n      createChannel (input: $input) {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    },\n  `;\n\n  const context = {\n    user: noPermissionUser,\n  };\n\n  expect.assertions(1);\n  const result = await request(query, { context, variables });\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent moderators from creating a channel', async () => {\n  const query = /* GraphQL */ `\n    mutation createChannel($input: CreateChannelInput!) {\n      createChannel (input: $input) {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    },\n  `;\n\n  const context = {\n    user: moderator,\n  };\n\n  expect.assertions(1);\n  const result = await request(query, { context, variables });\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/channel/mutations/deleteChannel.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\nimport { MAX_ID, BRYN_ID, DATE } from '../../../migrations/seed/default';\n\nconst generalChannelId = data.channels[0].id;\nconst owner = data.users.find(({ username }) => username === 'mxstbr');\nconst noPermissionUser = data.users.find(({ username }) => username === 'bryn');\nconst defaultChannelId = 'ce2b4488-4c75-47e0-8ebc-2539c';\nconst DEFAULT_CHANNELS = [\n  {\n    id: defaultChannelId,\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n    createdAt: new Date(),\n    name: 'Default',\n    description: 'Default chatter',\n    slug: 'default',\n    isPrivate: false,\n    isDefault: true,\n  },\n];\nconst DEFAULT_USERS_CHANNELS = [\n  {\n    createdAt: new Date(),\n    userId: MAX_ID,\n    channelId: defaultChannelId,\n    isOwner: true,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    isPending: false,\n    receiveNotifications: true,\n  },\n  {\n    createdAt: new Date(),\n    userId: BRYN_ID,\n    channelId: defaultChannelId,\n    isOwner: false,\n    isModerator: false,\n    isMember: true,\n    isBlocked: false,\n    receiveNotifications: true,\n  },\n];\nconst DEFAULT_THREADS = [\n  {\n    createdAt: new Date(DATE),\n    creatorId: MAX_ID,\n    channelId: defaultChannelId,\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'The first thread! 🎉',\n      body: '',\n    },\n    edits: [],\n    modifiedAt: new Date(DATE),\n    lastActive: new Date(DATE),\n  },\n  {\n    createdAt: new Date(DATE + 1),\n    creatorId: MAX_ID,\n    channelId: defaultChannelId,\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Another thread',\n      body: '',\n    },\n    edits: [],\n    modifiedAt: new Date(DATE + 1),\n    lastActive: new Date(DATE + 1),\n  },\n  {\n    createdAt: new Date(DATE + 2),\n    creatorId: BRYN_ID,\n    channelId: defaultChannelId,\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n    isPublished: true,\n    isLocked: false,\n    type: 'DRAFTJS',\n    content: {\n      title: 'Yet another thread',\n      body: '',\n    },\n    edits: [],\n    modifiedAt: new Date(DATE + 2),\n    lastActive: new Date(DATE + 2),\n  },\n];\n\nconst cleanTables = () =>\n  Promise.all([\n    db\n      .table('channels')\n      .delete()\n      .run(),\n    db\n      .table('usersChannels')\n      .delete()\n      .run(),\n    db\n      .table('threads')\n      .delete()\n      .run(),\n  ]);\n\nconst populateTables = () =>\n  Promise.all([\n    db\n      .table('channels')\n      .insert([...DEFAULT_CHANNELS, ...data.channels])\n      .run(),\n    db\n      .table('usersChannels')\n      .insert([...DEFAULT_USERS_CHANNELS, ...data.usersChannels])\n      .run(),\n    db\n      .table('threads')\n      .insert([...DEFAULT_THREADS, ...data.threads])\n      .run(),\n  ]);\n\n// after each test just rest the database\nbeforeEach(() => cleanTables().then(() => populateTables()));\nafterEach(() => cleanTables().then(() => populateTables()));\n\nconst variables = {\n  channelId: defaultChannelId,\n};\n\nit('should delete a channel if user is owner', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteChannel($channelId: ID!) {\n      deleteChannel(channelId: $channelId)\n    }\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should not delete a channel if user is not owner', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteChannel($channelId: ID!) {\n      deleteChannel(channelId: $channelId)\n    }\n  `;\n\n  const context = {\n    user: noPermissionUser,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should not delete a channel if user is not signed in', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteChannel($channelId: ID!) {\n      deleteChannel(channelId: $channelId)\n    }\n  `;\n\n  expect.assertions(1);\n\n  const result = await request(query, { variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should not delete the general channel', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteChannel($channelId: ID!) {\n      deleteChannel(channelId: $channelId)\n    }\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, {\n    context,\n    variables: {\n      channelId: generalChannelId,\n    },\n  });\n  expect(result).toMatchSnapshot();\n});\n\nit('should delete all threads in the deleted channel', async () => {\n  const getThreadsInChannel = () =>\n    db\n      .table('threads')\n      .filter({ channelId: defaultChannelId })\n      .run();\n\n  const query = /* GraphQL */ `\n    mutation deleteChannel($channelId: ID!) {\n      deleteChannel(channelId: $channelId)\n    }\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(2);\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n  const threads = await getThreadsInChannel();\n  const filtered = threads.filter(t => t.deletedAt !== null).length;\n  expect(threads).toHaveLength(filtered);\n});\n"
  },
  {
    "path": "api/test/channel/mutations/editChannel.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\n\nconst channel = data.channels[0];\n// various permissions for Spectrum community\nconst owner = data.users.find(({ username }) => username === 'mxstbr');\nconst noPermissionUser = data.users.find(({ username }) => username === 'bryn');\n\nafterEach(() => {\n  return db\n    .table('channels')\n    .filter({ slug: channel.slug })\n    .update({ ...channel })\n    .run();\n});\n\nconst variables = {\n  input: {\n    name: 'edited name',\n    slug: 'edited-slug',\n    description: 'edited description',\n    isPrivate: false,\n    channelId: channel.id,\n  },\n};\n\nit('should edit a channel if user is owner', async () => {\n  const query = /* GraphQL */ `\n    mutation editChannel($input: EditChannelInput!) {\n      editChannel (input: $input) {\n        name\n        slug\n        description\n        isPrivate\n      }\n    },\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(4);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n  expect(result.data.editChannel.name).toEqual(variables.input.name);\n  expect(result.data.editChannel.slug).toEqual(variables.input.slug);\n  expect(result.data.editChannel.description).toEqual(\n    variables.input.description\n  );\n});\n\nit('should not edit a channel if user is not owner', async () => {\n  const query = /* GraphQL */ `\n    mutation editChannel($input: EditChannelInput!) {\n      editChannel (input: $input) {\n        name\n        slug\n        description\n        isPrivate\n      }\n    },\n  `;\n\n  const context = {\n    user: noPermissionUser,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should not edit a channel if user is not signed in', async () => {\n  const query = /* GraphQL */ `\n    mutation editChannel($input: EditChannelInput!) {\n      editChannel (input: $input) {\n        name\n        slug\n        description\n        isPrivate\n      }\n    },\n  `;\n\n  expect.assertions(1);\n\n  const result = await request(query, { variables });\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/channel/queries/__snapshots__/channelSettings.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a private channels token join settings 1`] = `\nObject {\n  \"data\": Object {\n    \"channel\": Object {\n      \"id\": \"1\",\n      \"joinSettings\": Object {\n        \"token\": null,\n        \"tokenJoinEnabled\": false,\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/channel/queries/__snapshots__/memberConnection.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a channels member connection 1`] = `\nObject {\n  \"data\": Object {\n    \"channel\": Object {\n      \"id\": \"1\",\n      \"memberConnection\": Object {\n        \"edges\": Array [\n          Object {\n            \"cursor\": \"My0x\",\n            \"node\": Object {\n              \"contextPermissions\": null,\n              \"id\": \"3\",\n              \"name\": \"Bryn Jackson\",\n            },\n          },\n          Object {\n            \"cursor\": \"OS0y\",\n            \"node\": Object {\n              \"contextPermissions\": null,\n              \"id\": \"9\",\n              \"name\": \"Community moderator\",\n            },\n          },\n          Object {\n            \"cursor\": \"MS0z\",\n            \"node\": Object {\n              \"contextPermissions\": null,\n              \"id\": \"1\",\n              \"name\": \"Max Stoiber\",\n            },\n          },\n          Object {\n            \"cursor\": \"Mi00\",\n            \"node\": Object {\n              \"contextPermissions\": null,\n              \"id\": \"2\",\n              \"name\": \"Brian Lovin\",\n            },\n          },\n          Object {\n            \"cursor\": \"OC01\",\n            \"node\": Object {\n              \"contextPermissions\": null,\n              \"id\": \"8\",\n              \"name\": \"Channel moderator\",\n            },\n          },\n        ],\n        \"pageInfo\": Object {\n          \"hasNextPage\": false,\n          \"hasPreviousPage\": null,\n        },\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/channel/queries/__snapshots__/root.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a channel by id 1`] = `\nObject {\n  \"data\": Object {\n    \"channel\": Object {\n      \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n      \"description\": \"General chatter\",\n      \"id\": \"1\",\n      \"isPrivate\": false,\n      \"name\": \"General\",\n      \"slug\": \"general\",\n    },\n  },\n}\n`;\n\nexports[`should fetch a channel by slug and community slug 1`] = `\nObject {\n  \"data\": Object {\n    \"channel\": Object {\n      \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n      \"description\": \"General chatter\",\n      \"id\": \"1\",\n      \"isPrivate\": false,\n      \"name\": \"General\",\n      \"slug\": \"general\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/channel/queries/channelSettings.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport data from 'shared/testing/data';\nimport {\n  SPECTRUM_GENERAL_CHANNEL_ID,\n  CHANNEL_MODERATOR_USER_ID,\n} from '../../../migrations/seed/default/constants';\n\nconst channelModerator = data.users.find(\n  ({ id }) => id === CHANNEL_MODERATOR_USER_ID\n);\n\nit('should fetch a private channels token join settings', async () => {\n  const query = /* GraphQL */ `\n    {\n      channel(id: \"${SPECTRUM_GENERAL_CHANNEL_ID}\") {\n        id\n        joinSettings {\n          tokenJoinEnabled\n          token\n        }\n      }\n    }\n  `;\n\n  expect.assertions(3);\n  const result = await request(query, { context: { user: channelModerator } });\n  const {\n    data: { channel },\n  } = result;\n\n  expect(channel.joinSettings.tokenJoinEnabled).toEqual(false);\n  expect(channel.joinSettings.token).toEqual(null);\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/channel/queries/memberConnection.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport { SPECTRUM_GENERAL_CHANNEL_ID } from '../../../migrations/seed/default/constants';\n\nit('should fetch a channels member connection', async () => {\n  const query = /* GraphQL */ `\n    {\n      channel(id: \"${SPECTRUM_GENERAL_CHANNEL_ID}\") {\n        id\n        memberConnection(after: null) {\n          pageInfo {\n            hasNextPage\n            hasPreviousPage\n          }\n          edges {\n            cursor\n            node {\n              id\n              name\n              contextPermissions {\n                communityId\n              }\n            }\n          }\n        }\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/channel/queries/root.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport { SPECTRUM_GENERAL_CHANNEL_ID } from '../../../migrations/seed/default/constants';\n\nit('should fetch a channel by id', async () => {\n  const query = /* GraphQL */ `\n    {\n      channel(id: \"${SPECTRUM_GENERAL_CHANNEL_ID}\") {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should fetch a channel by slug and community slug', async () => {\n  const query = /* GraphQL */ `\n    {\n      channel(channelSlug: \"general\", communitySlug: \"spectrum\") {\n        id\n        name\n        slug\n        description\n        isPrivate\n        createdAt\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/community/mutations/__snapshots__/editCommunity.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should edit a community name and description 1`] = `\nObject {\n  \"data\": Object {\n    \"editCommunity\": Object {\n      \"description\": \"new description\",\n      \"name\": \"new name\",\n    },\n  },\n}\n`;\n\nexports[`should prevent community from being edited by a non owner 1`] = `\nObject {\n  \"data\": Object {\n    \"editCommunity\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to make changes to this community.],\n  ],\n}\n`;\n\nexports[`should prevent community from being edited by a non user 1`] = `\nObject {\n  \"data\": Object {\n    \"editCommunity\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to make changes to this community.],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/community/mutations/editCommunity.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\n\n// various permissions for Spectrum community\nconst community = data.communities[0];\nconst owner = data.users.find(({ username }) => username === 'mxstbr');\nconst member = data.users.find(({ username }) => username === 'bryn');\n\nafterEach(() => {\n  return db\n    .table('communities')\n    .filter({ slug: 'spectrum' })\n    .update({\n      name: community.name,\n      description: community.description,\n    })\n    .run();\n});\n\nconst variables = {\n  input: {\n    name: 'new name',\n    description: 'new description',\n    communityId: community.id,\n  },\n};\n\nit('should edit a community name and description', async () => {\n  const query = /* GraphQL */ `\n    mutation editCommunity($input: EditCommunityInput!) {\n      editCommunity (input: $input) {\n        name\n        description\n      }\n    },\n  `;\n\n  const context = { user: owner };\n\n  expect.assertions(3);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n  expect(result.data.editCommunity.name).toEqual(variables.input.name);\n  expect(result.data.editCommunity.description).toEqual(\n    variables.input.description\n  );\n});\n\nit('should prevent community from being edited by a non owner', async () => {\n  const query = /* GraphQL */ `\n    mutation editCommunity($input: EditCommunityInput!) {\n      editCommunity (input: $input) {\n        name\n        description\n      }\n    },\n  `;\n\n  const context = { user: member };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent community from being edited by a non user', async () => {\n  const query = /* GraphQL */ `\n    mutation editCommunity($input: EditCommunityInput!) {\n      editCommunity (input: $input) {\n        name\n        description\n      }\n    },\n  `;\n\n  expect.assertions(1);\n\n  const result = await request(query, { variables });\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/community/queries/__snapshots__/communitySettings.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a communitys settings 1`] = `\nObject {\n  \"data\": Object {\n    \"community\": Object {\n      \"id\": \"1\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/community/queries/communitySettings.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport { SPECTRUM_COMMUNITY_ID } from '../../../migrations/seed/default/constants';\n\nit('should fetch a communitys settings', async () => {\n  const query = /* GraphQL */ `\n    {\n      community(id: \"${SPECTRUM_COMMUNITY_ID}\") {\n        id\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/community.test.js",
    "content": "// @flow\nimport { request } from './utils';\nimport { SPECTRUM_COMMUNITY_ID } from '../migrations/seed/default/constants';\n\nit('should fetch a community', async () => {\n  const query = /* GraphQL */ `\n    {\n      community(id: \"${SPECTRUM_COMMUNITY_ID}\") {\n        id\n        createdAt\n        name\n        slug\n        description\n        website\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should fetch a communities threads', async () => {\n  const query = /* GraphQL */ `\n    {\n      community(id: \"${SPECTRUM_COMMUNITY_ID}\") {\n        threadConnection {\n          edges {\n            node {\n              content {\n                title\n              }\n            }\n          }\n        }\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should fetch a list of communities', async () => {\n  const query = /* GraphQL */ `\n    {\n      communities(slugs: [\"spectrum\"]) {\n        id\n        createdAt\n        slug\n        description\n        website\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should fetch a list of community members', async () => {\n  const query = /* GraphQL */ `\n    {\n      community(id: \"${SPECTRUM_COMMUNITY_ID}\") {\n        id\n        members {\n          pageInfo {\n            hasNextPage\n            hasPreviousPage\n          }\n          edges {\n            cursor\n            node {\n              user {\n                id\n              }\n              isOwner\n              isModerator\n              isMember\n              isBlocked\n            }\n          }\n        }\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/directMessageThread.test.js",
    "content": "// @flow\nimport { request } from './utils';\nimport data from 'shared/testing/data';\nimport { toPlainText, toState } from 'shared/draft-utils';\n\nconst messageToPlainText = message =>\n  toPlainText(toState(JSON.parse(message.content.body)));\n\nconst context = {\n  user: data.users.find(({ username }) => username === 'mxstbr'),\n};\n\n// All the messages in the test DM thread ordered by time, desc\nconst messages = data.messages\n  .filter(({ threadId }) => threadId === 'dm-1')\n  .sort((a, b) => a.timestamp - b.timestamp);\n\nit('should fetch a directMessageThread', async () => {\n  const query = /* GraphQL */ `\n    {\n      directMessageThread(id: \"dm-1\") {\n        id\n        threadLastActive\n      }\n    }\n  `;\n\n  expect.assertions(1);\n  const result = await request(query, { context });\n\n  expect(result).toMatchSnapshot();\n});\n\ndescribe('messageConnection', () => {\n  it('should fetch a directMessageThreads messages', async () => {\n    const query = /* GraphQL */ `\n      {\n        directMessageThread(id: \"dm-1\") {\n          messageConnection(first: 999999) {\n            edges {\n              node {\n                id\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    expect.assertions(1);\n    const result = await request(query, { context });\n\n    expect(result).toMatchSnapshot();\n  });\n\n  it('should fetch the last message first', async () => {\n    const query = /* GraphQL */ `\n      {\n        directMessageThread(id: \"dm-1\") {\n          messageConnection(first: 1) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              node {\n                id\n                content {\n                  body\n                }\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    expect.assertions(2);\n    const result = await request(query, { context });\n\n    expect(result.data.directMessageThread.messageConnection.pageInfo).toEqual({\n      hasNextPage: true,\n      hasPreviousPage: false,\n    });\n\n    expect(\n      messageToPlainText(\n        result.data.directMessageThread.messageConnection.edges[0].node\n      )\n    ).toEqual(messageToPlainText(messages[messages.length - 1]));\n  });\n\n  it('should fetch the second to last message next', async () => {\n    // Get the first message, same as above\n    const query = /* GraphQL */ `\n      {\n        directMessageThread(id: \"dm-1\") {\n          messageConnection(first: 1) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.assertions(3);\n    const result = await request(query, { context });\n\n    // Get the cursor of the first message\n    // Make sure pageInfo is calculated correctly\n    expect(result.data.directMessageThread.messageConnection.pageInfo).toEqual({\n      hasNextPage: true,\n      hasPreviousPage: false,\n    });\n\n    const cursor =\n      result.data.directMessageThread.messageConnection.edges[0].cursor;\n\n    // Generate a query of the first message after the cursor of the last message\n    const nextQuery = /* GraphQL */ `\n      {\n        directMessageThread(id: \"dm-1\") {\n          messageConnection(first: 1, after: \"${cursor}\") {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              node {\n                content {\n                  body\n                }\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    const nextResult = await request(nextQuery, { context });\n\n    expect(\n      nextResult.data.directMessageThread.messageConnection.pageInfo\n    ).toEqual({\n      hasNextPage: true,\n      hasPreviousPage: true,\n    });\n\n    expect(\n      messageToPlainText(\n        nextResult.data.directMessageThread.messageConnection.edges[0].node\n      )\n    ).toEqual(messageToPlainText(messages[messages.length - 2]));\n  });\n});\n"
  },
  {
    "path": "api/test/message/__snapshots__/queries.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`sender should fetch a user 1`] = `\nObject {\n  \"data\": Object {\n    \"message\": Object {\n      \"author\": Object {\n        \"id\": \"1\",\n        \"user\": Object {\n          \"username\": \"mxstbr\",\n        },\n      },\n    },\n  },\n}\n`;\n\nexports[`should fetch a message 1`] = `\nObject {\n  \"data\": Object {\n    \"message\": Object {\n      \"content\": Object {\n        \"body\": \"{\\\\\"blocks\\\\\":[{\\\\\"key\\\\\":\\\\\"9u8bg\\\\\",\\\\\"text\\\\\":\\\\\"This is the first message!\\\\\",\\\\\"type\\\\\":\\\\\"unstyled\\\\\",\\\\\"depth\\\\\":0,\\\\\"inlineStyleRanges\\\\\":[],\\\\\"entityRanges\\\\\":[],\\\\\"data\\\\\":{}}],\\\\\"entityMap\\\\\":{}}\",\n      },\n      \"id\": \"1\",\n      \"messageType\": \"draftjs\",\n      \"timestamp\": \"2016-12-31T23:00:00.000Z\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/message/mutations/addMessage.test.js",
    "content": "// @flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\nimport { fromPlainText, toJSON } from 'shared/draft-utils';\n\nconst query = /* GraphQL */ `\n  mutation sendMessage($message: MessageInput!) {\n    addMessage(message: $message) {\n      content {\n        body\n      }\n    }\n  }\n`;\n\ndescribe('story', () => {\n  // Find a member of a community\n  const userCommunity = data.usersCommunities.find(({ isMember }) => isMember);\n  const user = data.users.find(({ id }) => id === userCommunity.userId);\n  // Find a thread in the community\n  const thread = data.threads.find(\n    ({ communityId }) => communityId === userCommunity.communityId\n  );\n\n  const newMessage = {\n    threadId: thread.id,\n    threadType: 'story',\n    messageType: 'draftjs',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A new message yayzers'))),\n    },\n  };\n\n  afterEach(() => {\n    return Promise.all([\n      db\n        .table('messages')\n        .filter({ content: { body: newMessage.content.body } })\n        .delete()\n        .run(),\n      db\n        .table('threads')\n        .get(thread.id)\n        .update(thread)\n        .run(),\n    ]);\n  });\n\n  it('should add a new message to the database', async () => {\n    const context = { user };\n    const variables = { message: newMessage };\n    expect.hasAssertions();\n    const result = await request(query, { context, variables });\n    expect(result.data.addMessage.content.body).toEqual(\n      newMessage.content.body\n    );\n  });\n\n  it(\"should not allow users who aren't members to send a message\", async () => {\n    const context = { user: null };\n    const variables = { message: newMessage };\n    expect.hasAssertions();\n    const result = await request(query, { context, variables });\n    expect(result.data.addMessage).toEqual(null);\n    expect(result.errors.length).toEqual(1);\n  });\n});\n\ndescribe('directMessageThread', () => {\n  // Find a member of a dm thread\n  const userDmThread = data.usersDirectMessageThreads[0];\n  const user = data.users.find(({ id }) => id === userDmThread.userId);\n  const dmThread = data.directMessageThreads.find(\n    ({ id }) => id === userDmThread.threadId\n  );\n\n  const newMessage = {\n    threadId: userDmThread.threadId,\n    threadType: 'directMessageThread',\n    messageType: 'draftjs',\n    content: {\n      body: JSON.stringify(toJSON(fromPlainText('A new message yayzers'))),\n    },\n  };\n\n  afterEach(() => {\n    return Promise.all([\n      db\n        .table('messages')\n        .filter({ content: { body: newMessage.content.body } })\n        .delete()\n        .run(),\n      db\n        .table('directMessageThreads')\n        .get(userDmThread.threadId)\n        .update(dmThread)\n        .run(),\n    ]);\n  });\n\n  it('should add a new message to the database', async () => {\n    const context = { user };\n    const variables = { message: newMessage };\n    expect.hasAssertions();\n    const result = await request(query, { context, variables });\n    expect(result.data.addMessage.content.body).toEqual(\n      newMessage.content.body\n    );\n  });\n\n  it(\"should not allow users who aren't members to send a message\", async () => {\n    const context = { user: null };\n    const variables = { message: newMessage };\n    expect.hasAssertions();\n    const result = await request(query, { context, variables });\n    expect(result.data.addMessage).toEqual(null);\n    expect(result.errors.length).toEqual(1);\n  });\n});\n"
  },
  {
    "path": "api/test/message/queries.test.js",
    "content": "// @flow\nimport { request } from '../utils';\nimport data from 'shared/testing/data';\n\nit('should fetch a message', async () => {\n  const query = /* GraphQL */ `\n    {\n      message(id: \"${data.messages[0].id}\") {\n        id\n        timestamp\n        content {\n          body\n        }\n        messageType\n      }\n    }\n  `;\n\n  expect.hasAssertions();\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n\ndescribe('sender', () => {\n  it('should fetch a user', async () => {\n    const query = /* GraphQL */ `\n      {\n        message(id: \"${data.messages[0].id}\") {\n          author {\n            id\n            user { \n              username\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    expect(result).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "api/test/thread/mutations/__snapshots__/deleteThread.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should be able to delete self-published thread 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteThread\": true,\n  },\n}\n`;\n\nexports[`should be able to delete thread if user owns community 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteThread\": true,\n  },\n}\n`;\n\nexports[`should not delete thread if user doesn't have permissions 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteThread\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to make changes to this thread.],\n  ],\n}\n`;\n\nexports[`should not delete thread if user is not signed in 1`] = `\nObject {\n  \"data\": Object {\n    \"deleteThread\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to make changes to this thread.],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/thread/mutations/__snapshots__/publishThread.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should create a thread if user has permissions 1`] = `\nObject {\n  \"data\": Object {\n    \"publishThread\": Object {\n      \"content\": Object {\n        \"title\": \"test thread\",\n      },\n      \"isLocked\": false,\n      \"isPublished\": true,\n      \"type\": \"DRAFTJS\",\n    },\n  },\n}\n`;\n\nexports[`should prevent signed out users from publishing a thread 1`] = `\nObject {\n  \"data\": Object {\n    \"publishThread\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You must be signed in to publish a new thread.],\n  ],\n}\n`;\n\nexports[`should prevent thread publish if user has no permissions 1`] = `\nObject {\n  \"data\": Object {\n    \"publishThread\": null,\n  },\n  \"errors\": Array [\n    [GraphQLError: You don't have permission to create threads in this channel.],\n  ],\n}\n`;\n"
  },
  {
    "path": "api/test/thread/mutations/deleteThread.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\n\nconst defaultThread = data.threads[0];\nconst owner = data.users.find(({ username }) => username === 'mxstbr');\nconst member = data.users.find(({ username }) => username === 'brian');\nconst noPermissionUser = data.users.find(\n  ({ username }) => username === 'bad-boy'\n);\n\n// before each test, makre sure the thread exists to test deletion\nbeforeEach(async () => {\n  const threadExists = await db\n    .table('threads')\n    .get(defaultThread.id)\n    .run();\n\n  if (threadExists.deletedAt) {\n    return db\n      .table('threads')\n      .get(defaultThread.id)\n      .update({\n        deletedAt: db.literal(),\n      })\n      .run();\n  }\n});\n\nconst variables = {\n  threadId: defaultThread.id,\n};\n\nit('should be able to delete self-published thread', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteThread($threadId: ID!) {\n      deleteThread (threadId: $threadId)\n    },\n  `;\n\n  const context = {\n    user: member,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should be able to delete thread if user owns community', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteThread($threadId: ID!) {\n      deleteThread (threadId: $threadId)\n    },\n  `;\n\n  const context = {\n    user: owner,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit(\"should not delete thread if user doesn't have permissions\", async () => {\n  const query = /* GraphQL */ `\n    mutation deleteThread($threadId: ID!) {\n      deleteThread (threadId: $threadId)\n    },\n  `;\n\n  const context = {\n    user: noPermissionUser,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should not delete thread if user is not signed in', async () => {\n  const query = /* GraphQL */ `\n    mutation deleteThread($threadId: ID!) {\n      deleteThread (threadId: $threadId)\n    },\n  `;\n\n  const context = {\n    user: null,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/thread/mutations/publishThread.test.js",
    "content": "//@flow\nimport { request } from '../../utils';\nimport db from 'shared/testing/db';\nimport data from 'shared/testing/data';\n\n// various permissions for Spectrum community\nconst member = data.users.find(({ username }) => username === 'mxstbr');\nconst noPermissionUser = data.users.find(\n  ({ username }) => username === 'bad-boy'\n);\n\nafterEach(() => {\n  return db\n    .table('threads')\n    .filter({ content: { title: 'test thread' } })\n    .delete()\n    .run();\n});\n\nconst variables = {\n  thread: {\n    channelId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a192',\n    communityId: 'ce2b4488-4c75-47e0-8ebc-2539c1e6a191',\n    type: 'DRAFTJS',\n    content: {\n      title: 'test thread',\n      body: '',\n    },\n  },\n};\n\nit('should create a thread if user has permissions', async () => {\n  const query = /* GraphQL */ `\n    mutation publishThread($thread: ThreadInput!) {\n      publishThread (thread: $thread) {\n        isPublished\n        isLocked\n        type\n        content {\n          title\n        }\n      }\n    },\n  `;\n\n  const context = {\n    user: member,\n  };\n\n  expect.assertions(1);\n\n  const result = await request(query, { context, variables });\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent thread publish if user has no permissions', async () => {\n  const query = /* GraphQL */ `\n    mutation publishThread($thread: ThreadInput!) {\n      publishThread (thread: $thread) {\n        isPublished\n        isLocked\n        type\n        content {\n          title\n        }\n      }\n    },\n  `;\n\n  const context = {\n    user: noPermissionUser,\n  };\n\n  expect.assertions(1);\n  const result = await request(query, { context, variables });\n\n  expect(result).toMatchSnapshot();\n});\n\nit('should prevent signed out users from publishing a thread', async () => {\n  const query = /* GraphQL */ `\n    mutation publishThread($thread: ThreadInput!) {\n      publishThread (thread: $thread) {\n        isPublished\n        isLocked\n        type\n        content {\n          title\n        }\n      }\n    },\n  `;\n\n  expect.assertions(1);\n  const result = await request(query, { variables });\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/thread/queries/__snapshots__/messageConnection.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`messageConnection should fetch a threads messages 1`] = `\nObject {\n  \"data\": Object {\n    \"thread\": Object {\n      \"messageConnection\": Object {\n        \"edges\": Array [\n          Object {\n            \"node\": Object {\n              \"id\": \"1\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"2\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"3\",\n            },\n          },\n          Object {\n            \"node\": Object {\n              \"id\": \"4\",\n            },\n          },\n        ],\n      },\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/thread/queries/__snapshots__/root.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should fetch a thread 1`] = `\nObject {\n  \"data\": Object {\n    \"thread\": Object {\n      \"content\": Object {\n        \"title\": \"The first thread! 🎉\",\n      },\n      \"createdAt\": \"2016-12-31T23:00:00.000Z\",\n      \"id\": \"thread-1\",\n      \"isLocked\": false,\n      \"isPublished\": true,\n      \"lastActive\": \"2016-12-31T23:00:00.000Z\",\n      \"modifiedAt\": \"2016-12-31T23:00:00.000Z\",\n      \"type\": \"DRAFTJS\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "api/test/thread/queries/messageConnection.test.js",
    "content": "// @flow\nimport { request } from '../../utils';\nimport data from 'shared/testing/data';\nimport { toPlainText, toState } from 'shared/draft-utils';\n\nconst messageToPlainText = message =>\n  toPlainText(toState(JSON.parse(message.content.body)));\n\n// Get all messages in our test thread and sort them by time\nconst messages = data.messages\n  .filter(({ threadId }) => threadId === 'thread-1')\n  .sort((a, b) => a.timestamp - b.timestamp);\n\ndescribe('messageConnection', () => {\n  it('should fetch a threads messages', async () => {\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: 999999) {\n            edges {\n              node {\n                id\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    expect(result.data.thread.messageConnection.edges).toHaveLength(\n      messages.length\n    );\n    expect(result).toMatchSnapshot();\n  });\n\n  it('should fetch the first message first', async () => {\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: 1) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              node {\n                id\n                content {\n                  body\n                }\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n\n    expect(result.data.thread.messageConnection.edges).toHaveLength(1);\n\n    expect(result.data.thread.messageConnection.pageInfo).toEqual({\n      // This is true if there is more messages than this one\n      hasNextPage: messages.length > 1,\n      // This has to be false since it's the first message\n      hasPreviousPage: false,\n    });\n\n    expect(\n      messageToPlainText(result.data.thread.messageConnection.edges[0].node)\n    ).toEqual(messageToPlainText(messages[0]));\n  });\n\n  it('should fetch the second message next', async () => {\n    // Get the cursor of the first message\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: 1) {\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const cursor = result.data.thread.messageConnection.edges[0].cursor;\n\n    // Get one message after the cursor of the first message\n    // i.e. the second message\n    const nextQuery = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: 1, after: \"${cursor}\") {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              node {\n                content {\n                  body\n                }\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    const nextResult = await request(nextQuery);\n\n    expect(nextResult.data.thread.messageConnection.edges).toHaveLength(1);\n\n    expect(nextResult.data.thread.messageConnection.pageInfo).toEqual({\n      hasNextPage: messages.length > 2,\n      // We know this has a previous page\n      hasPreviousPage: true,\n    });\n\n    expect(\n      messageToPlainText(nextResult.data.thread.messageConnection.edges[0].node)\n    ).toEqual(messageToPlainText(messages[1]));\n  });\n\n  it('should correctly set pageInfo when more messages are requested than are available', async () => {\n    // Request more messages than there are\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: ${messages.length + 1}) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const { edges, pageInfo } = result.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(messages.length);\n\n    expect(pageInfo).toEqual({\n      hasNextPage: false,\n      hasPreviousPage: false,\n    });\n  });\n\n  it('should correctly set pageInfo when all messages are requested', async () => {\n    // Request more messages than there are\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: ${messages.length}) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const { edges, pageInfo } = result.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(messages.length);\n\n    expect(pageInfo).toEqual({\n      hasNextPage: false,\n      hasPreviousPage: false,\n    });\n  });\n\n  it('should correctly set pageInfo when more messages are requested than are available after a cursor', async () => {\n    // Get the cursor of the first message\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: 1) {\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const cursor = result.data.thread.messageConnection.edges[0].cursor;\n\n    // Get all messages after the cursor of the first message\n    // but get more than are available\n    const nextQuery = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(first: ${messages.length}, after: \"${cursor}\") {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    const nextResult = await request(nextQuery);\n    const { edges, pageInfo } = nextResult.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(messages.length - 1);\n    expect(pageInfo).toEqual({\n      hasNextPage: false,\n      hasPreviousPage: true,\n    });\n  });\n});\n"
  },
  {
    "path": "api/test/thread/queries/reversePagination.test.js",
    "content": "// @flow\nimport { request } from '../../utils';\nimport data from 'shared/testing/data';\nimport { toPlainText, toState } from 'shared/draft-utils';\n\nconst messageToPlainText = message =>\n  toPlainText(toState(JSON.parse(message.content.body)));\n\n// Get all messages in our test thread and sort them by time\nconst messages = data.messages\n  .filter(({ threadId }) => threadId === 'thread-1')\n  .sort((a, b) => a.timestamp - b.timestamp);\n\ndescribe('reverse pagination', () => {\n  it('should fetch with reverse pagination', async () => {\n    // Get the first three messages\n    const query = /* GraphQL */ `\n        {\n          thread(id: \"thread-1\") {\n            messageConnection(first: 3) {\n              pageInfo {\n                hasNextPage\n                hasPreviousPage\n              }\n              edges {\n                cursor\n                node {\n                  content {\n                    body\n                  }\n                }\n              }\n            }\n          }\n        }\n      `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n\n    // Get the cursor of the first message\n    const { edges, pageInfo } = result.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(3);\n\n    // Make sure pageInfo is calculated correctly\n    expect(pageInfo).toEqual({\n      hasNextPage: messages.length > 3,\n      // We know this can't have a previous page since we fetched the very first one\n      hasPreviousPage: false,\n    });\n\n    // Make sure we got the right messages\n    edges.forEach(({ node }, index) => {\n      expect(messageToPlainText(node)).toEqual(\n        messageToPlainText(messages[index])\n      );\n    });\n\n    // Return the cursor of the last message\n    const cursor = edges[2].cursor;\n\n    // Get one message before the last message of the first page we just got\n    const nextQuery = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(last: 1, before: \"${cursor}\") {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              node {\n                content {\n                  body\n                }\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    const nextResult = await request(nextQuery);\n\n    expect(nextResult.data.thread.messageConnection.pageInfo).toEqual({\n      // We know there's more messages on either side of this one\n      hasNextPage: true,\n      hasPreviousPage: true,\n    });\n\n    expect(\n      messageToPlainText(nextResult.data.thread.messageConnection.edges[0].node)\n    ).toEqual(messageToPlainText(messages[1]));\n  });\n\n  it('should correctly set pageInfo when more messages are requested than are available', async () => {\n    // Request more messages than there are\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(last: ${messages.length + 1}) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const { edges, pageInfo } = result.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(messages.length);\n\n    expect(pageInfo).toEqual({\n      hasNextPage: false,\n      hasPreviousPage: false,\n    });\n  });\n\n  it('should correctly set pageInfo when all messages are requested', async () => {\n    // Request more messages than there are\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(last: ${messages.length}) {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const { edges, pageInfo } = result.data.thread.messageConnection;\n\n    expect(edges).toHaveLength(messages.length);\n\n    expect(pageInfo).toEqual({\n      hasNextPage: false,\n      hasPreviousPage: false,\n    });\n  });\n\n  it('should correctly set pageInfo when more messages are requested than are available after a cursor', async () => {\n    // Get the cursor of the last message\n    const query = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(last: 1) {\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    expect.hasAssertions();\n    const result = await request(query);\n    const cursor = result.data.thread.messageConnection.edges[0].cursor;\n\n    // Get all messages after the cursor of the last message\n    // but get more than are available\n    const nextQuery = /* GraphQL */ `\n      {\n        thread(id: \"thread-1\") {\n          messageConnection(last: ${messages.length}, before: \"${cursor}\") {\n            pageInfo {\n              hasNextPage\n              hasPreviousPage\n            }\n            edges {\n              cursor\n            }\n          }\n        }\n      }\n    `;\n\n    const nextResult = await request(nextQuery);\n    expect(nextResult.data.thread.messageConnection.edges).toHaveLength(\n      messages.length - 1\n    );\n    expect(nextResult.data.thread.messageConnection.pageInfo).toEqual({\n      hasNextPage: true,\n      hasPreviousPage: false,\n    });\n  });\n});\n"
  },
  {
    "path": "api/test/thread/queries/root.test.js",
    "content": "// @flow\nimport { request } from '../../utils';\n\nit('should fetch a thread', async () => {\n  const query = /* GraphQL */ `\n    {\n      thread(id: \"thread-1\") {\n        id\n        createdAt\n        modifiedAt\n        lastActive\n        isPublished\n        isLocked\n        type\n        content {\n          title\n        }\n      }\n    }\n  `;\n\n  expect.hasAssertions();\n  const result = await request(query);\n\n  expect(result).toMatchSnapshot();\n});\n"
  },
  {
    "path": "api/test/user.test.js",
    "content": "// @flow\nimport { request } from './utils';\nimport { MAX_ID } from '../migrations/seed/default/constants';\n\ndescribe('queries', () => {\n  it('should fetch a user', async () => {\n    const query = /* GraphQL */ `\n\t\t\t{\n\t\t\t\tuser(id: \"${MAX_ID}\") {\n          id\n          name\n          description\n          website\n          username\n          email\n          providerId\n          createdAt\n\t\t\t\t}\n\t\t\t}\n\t\t`;\n\n    expect.assertions(1);\n    const result = await request(query);\n\n    expect(result).toMatchSnapshot();\n  });\n\n  it('should return null for a non-existent id', async () => {\n    const query = /* GraphQL */ `\n\t\t\t{\n\t\t\t\tuser(id: \"non-existent\") {\n\t\t\t\t\tid\n          username\n\t\t\t\t}\n\t\t\t}\n\t\t`;\n\n    expect.assertions(1);\n    const result = await request(query);\n\n    expect(result).toMatchSnapshot();\n  });\n\n  it('should fetch a users communities', async () => {\n    const query = /* GraphQL */ `\n      {\n        user(id: \"${MAX_ID}\") {\n          communityConnection {\n            edges {\n              node {\n                name\n              }\n            }\n          }\n        }\n      }\n    `;\n\n    expect.assertions(1);\n    const result = await request(query);\n\n    expect(result).toMatchSnapshot();\n  });\n\n  describe.skip('everything', () => {\n    it('should return the latest thread', async () => {\n      const query = /* GraphQL */ `\n  \t\t\t{\n  \t\t\t\tuser(id: \"${MAX_ID}\") {\n  \t\t\t\t\teverything(first: 1) {\n              pageInfo {\n                hasNextPage\n              }\n              edges {\n                node {\n                  id\n                }\n              }\n            }\n  \t\t\t\t}\n  \t\t\t}\n  \t\t`;\n      expect.assertions(1);\n      const result = await graphql(schema, query);\n\n      expect(result).toMatchSnapshot();\n    });\n\n    it('should paginate based on the after property', async () => {\n      const query = /* GraphQL */ `\n  \t\t\t{\n  \t\t\t\tuser(id: \"${MAX_ID}\") {\n  \t\t\t\t\teverything(first: 1, after: \"c2Vjb25kLXN0b3J5\") {\n              pageInfo {\n                hasNextPage\n              }\n              edges {\n                node {\n                  id\n                }\n              }\n            }\n  \t\t\t\t}\n  \t\t\t}\n  \t\t`;\n      expect.assertions(1);\n      const result = await graphql(schema, query);\n\n      expect(result).toMatchSnapshot();\n    });\n\n    it('should handle first being set to 0 correctly', async () => {\n      const noCursorQuery = /* GraphQL */ `\n  \t\t\t{\n  \t\t\t\tuser(id: \"${MAX_ID}\") {\n  \t\t\t\t\teverything(first: 0) {\n              pageInfo {\n                hasNextPage\n              }\n              edges {\n                node {\n                  id\n                }\n              }\n            }\n  \t\t\t\t}\n  \t\t\t}\n  \t\t`;\n      const cursorQuery = /* GraphQL */ `\n  \t\t\t{\n  \t\t\t\tuser(id: \"${MAX_ID}\") {\n  \t\t\t\t\teverything(first: 0, after: \"Zmlyc3Qtc3Rvcnk=\") {\n              pageInfo {\n                hasNextPage\n              }\n              edges {\n                node {\n                  id\n                }\n              }\n            }\n  \t\t\t\t}\n  \t\t\t}\n  \t\t`;\n      expect.assertions(2);\n      const result = await graphql(schema, noCursorQuery);\n\n      expect(result).toMatchSnapshot();\n\n      const nextResult = await graphql(schema, cursorQuery);\n\n      expect(nextResult).toMatchSnapshot();\n    });\n  });\n});\n"
  },
  {
    "path": "api/test/utils/__mocks__/debug.js",
    "content": "// @flow\n\nconst loggers = {};\n\nfunction makeLogger() {\n  function logger(...args: any[]) {\n    logger.log.push(args.join(' '));\n  }\n  logger.log = [];\n  return logger;\n}\n\nmodule.exports = (namespace: string) => {\n  return (loggers[namespace] = loggers[namespace] || makeLogger());\n};\n"
  },
  {
    "path": "api/test/utils/__snapshots__/create-graphql-error-formatter.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`createGraphQLErrorFormatter logs error path 1`] = `\nArray [\n  \"---GraphQL Error---\",\n  \"Cannot return null for non-nullable field Thread.channel.\n\nGraphQL request (9:15)\n 8:               id\n 9:               channel {\n                  ^\n10:                 id\n\",\n  \"path community.threadConnection.edges[0].node.channel\",\n  \"-------------------\n\",\n]\n`;\n\nexports[`createGraphQLErrorFormatter logs query and variables 1`] = `\nArray [\n  \"---GraphQL Error---\",\n  \"Cannot return null for non-nullable field Thread.channel.\n\nGraphQL request (9:15)\n 8:               id\n 9:               channel {\n                  ^\n10:                 id\n\",\n  \"query getCommunityThreadConnection( $id: ID )\",\n  \"variables {\\\\\"id\\\\\":1}\",\n  \"path community.threadConnection.edges[0].node.channel\",\n  \"-------------------\n\",\n]\n`;\n"
  },
  {
    "path": "api/test/utils/create-graphql-error-formatter.test.js",
    "content": "// @flow\n\nconst debug = require('debug')('api:utils:error-formatter');\n\nimport { graphql, print } from 'graphql';\nimport { makeExecutableSchema } from 'graphql-tools';\n\nimport createErrorFormatter from '../../utils/create-graphql-error-formatter';\n\nconst typeDefs = `\n\ttype Community {\n\t\tid: ID!\n    threadConnection(first: Int = 10, after: String): CommunityThreadsConnection!\n\t}\n\n\ttype CommunityThreadsConnection {\n\t\tedges: [CommunityThreadEdge!]\n\t}\n\n\ttype CommunityThreadEdge {\n\t\tnode: Thread!\n\t}\n\n\ttype Thread {\n\t\tid: ID!\n\t\tchannel: Channel!\n\t}\n\n\ttype Channel {\n\t\tid: ID!\n\t}\n\n\ttype Query {\n\t\tcommunity(id: ID): Community\n\t}\n`;\n\nconst resolvers = {\n  Query: {\n    community: () => ({ id: 1 }),\n  },\n  Community: {\n    threadConnection: () => ({}),\n  },\n  CommunityThreadsConnection: {\n    edges: () => [6],\n  },\n  CommunityThreadEdge: {\n    node: id => ({ id }),\n  },\n  Thread: {\n    channel: () => null,\n  },\n};\n\nconst schema = makeExecutableSchema({ typeDefs, resolvers });\n\nconst query = `\n    query getCommunityThreadConnection( $id: ID ){\n      community( id: $id ) {\n        id\n        threadConnection {\n          edges {\n            node {\n              id\n              channel {\n                id\n              }\n            }\n          }\n        }\n      }\n    }\n    `;\n\nconst variables = { id: 1 };\n\ndescribe('createGraphQLErrorFormatter', () => {\n  const stderrWrite = process.stderr.write;\n\n  afterEach(() => {\n    process.stderr.write = stderrWrite;\n  });\n\n  it('returns function', () => {\n    expect(createErrorFormatter()).toBeInstanceOf(Function);\n  });\n\n  it('logs error path', async () => {\n    debug.log = [];\n\n    const result = await graphql(schema, query, null, null, variables);\n    const formatter = createErrorFormatter();\n    (result.errors || []).forEach(formatter);\n    expect(debug.log).toMatchSnapshot();\n  });\n\n  it('logs query and variables', async () => {\n    debug.log = [];\n\n    const result = await graphql(schema, query, null, null, variables);\n    const formatter = createErrorFormatter({ body: { query, variables } });\n    (result.errors || []).forEach(formatter);\n    expect(debug.log).toMatchSnapshot();\n  });\n});\n"
  },
  {
    "path": "api/test/utils.js",
    "content": "// @flow\nimport { graphql } from 'graphql';\nimport createLoaders from '../loaders';\nimport schema from '../schema';\n\ntype Options = {\n  context?: {\n    user?: ?Object,\n  },\n  variables?: ?Object,\n};\n\n// Nice little helper function for tests\nexport const request = (query: mixed, { context, variables }: Options = {}) => {\n  return graphql(\n    schema,\n    query,\n    undefined,\n    {\n      loaders: createLoaders(),\n      ...context,\n    },\n    variables\n  );\n};\n"
  },
  {
    "path": "api/types/Channel.js",
    "content": "// @flow\nconst Channel = /* GraphQL */ `\n  type ChannelMembersConnection {\n    pageInfo: PageInfo!\n    edges: [ChannelMemberEdge!]\n  }\n\n  type ChannelMemberEdge {\n    cursor: String!\n    node: User!\n  }\n\n  type ChannelThreadsConnection {\n    pageInfo: PageInfo!\n    edges: [ChannelThreadEdge!]\n  }\n\n  type ChannelThreadEdge {\n    cursor: String!\n    node: Thread!\n  }\n\n  type ChannelMetaData {\n    threads: Int\n      @deprecated(reason: \"metaData.threads is deprecated and always returns 0\")\n    members: Int\n  }\n\n  input EditChannelInput {\n    name: String\n    slug: LowercaseString\n    description: String\n    isPrivate: Boolean\n    channelId: ID!\n  }\n\n  type Channel @cacheControl(maxAge: 1200) {\n    id: ID!\n    createdAt: Date!\n    modifiedAt: Date\n    name: String!\n    description: String!\n    slug: LowercaseString!\n    isPrivate: Boolean\n    isDefault: Boolean\n    isArchived: Boolean\n    channelPermissions: ChannelPermissions! @cost(complexity: 1)\n\n    communityPermissions: CommunityPermissions!\n    community: Community! @cost(complexity: 1) @cacheControl(maxAge: 86400)\n    threadConnection(first: Int = 10, after: String): ChannelThreadsConnection!\n      @cost(complexity: 1, multipliers: [\"first\"])\n    memberConnection(first: Int = 10, after: String): ChannelMembersConnection!\n      @cost(complexity: 1, multipliers: [\"first\"])\n    memberCount: Int!\n    metaData: ChannelMetaData @cost(complexity: 1)\n    moderators: [User] @cost(complexity: 3)\n    owners: [User] @cost(complexity: 3)\n    joinSettings: JoinSettings\n  }\n\n  extend type Query {\n    channel(\n      id: ID\n      channelSlug: LowercaseString\n      communitySlug: LowercaseString\n    ): Channel @cost(complexity: 1) @cacheControl(maxAge: 1200)\n  }\n\n  extend type Mutation {\n    editChannel(input: EditChannelInput!): Channel\n    deleteChannel(channelId: ID!): Boolean\n  }\n`;\n\nmodule.exports = Channel;\n"
  },
  {
    "path": "api/types/Community.js",
    "content": "// @flow\nconst Community = /* GraphQL */ `\n  type CommunityChannelsConnection {\n    pageInfo: PageInfo!\n    edges: [CommunityChannelEdge!]\n  }\n\n  type CommunityChannelEdge {\n    node: Channel!\n  }\n\n  type CommunityMembersConnection\n    @deprecated(reason: \"Use the new Community.members type\") {\n    pageInfo: PageInfo!\n    edges: [CommunityMemberEdge!]\n  }\n\n  type CommunityMemberEdge\n    @deprecated(reason: \"Use the new Community.members type\") {\n    cursor: String!\n    node: User!\n  }\n\n  type CommunityMembers {\n    pageInfo: PageInfo!\n    edges: [CommunityMembersEdge!]\n  }\n\n  type CommunityMembersEdge {\n    cursor: String!\n    node: CommunityMember!\n  }\n\n  type CommunityThreadsConnection {\n    pageInfo: PageInfo!\n    edges: [CommunityThreadEdge!]\n  }\n\n  type CommunityThreadEdge {\n    cursor: String!\n    node: Thread!\n  }\n\n  type CommunityMetaData @cacheControl(maxAge: 1800) {\n    members: Int\n    channels: Int\n  }\n\n  enum CommunityThreadConnectionSort {\n    latest\n    trending\n  }\n\n  type Features {\n    analytics: Boolean\n    prioritySupport: Boolean\n  }\n\n  type StripeCard {\n    brand: String\n    exp_month: Int\n    exp_year: Int\n    last4: String\n  }\n\n  type StripeSource {\n    id: ID\n    card: StripeCard\n    isDefault: Boolean\n  }\n\n  type StripeItem {\n    id: ID\n    amount: Int\n    quantity: Int\n    planId: String\n    planName: String\n  }\n\n  type StripeSubscriptionItem {\n    created: Int\n    planId: String\n    planName: String\n    amount: Int\n    quantity: Int\n    id: String\n  }\n\n  type StripeDiscount {\n    amount_off: Int\n    percent_off: Int\n    id: String\n  }\n\n  type StripeSubscription {\n    id: ID\n    created: Int\n    discount: StripeDiscount\n    billing_cycle_anchor: Int\n    current_period_end: Int\n    canceledAt: Int\n    items: [StripeSubscriptionItem]\n    status: String\n  }\n\n  type StripeInvoice {\n    id: ID\n    date: Int\n    items: [StripeItem]\n    total: Int\n  }\n\n  type CommunityBillingSettings {\n    pendingAdministratorEmail: LowercaseString\n    administratorEmail: LowercaseString\n    sources: [StripeSource]\n    invoices: [StripeInvoice]\n    subscriptions: [StripeSubscription]\n  }\n\n  type Community @cacheControl(maxAge: 1200) {\n    id: ID!\n    createdAt: Date\n    name: String!\n    slug: LowercaseString!\n    description: String\n    website: String\n    profilePhoto: String\n    coverPhoto: String\n    pinnedThreadId: String\n    pinnedThread: Thread\n    isPrivate: Boolean\n    redirect: Boolean\n    noindex: Boolean\n    communityPermissions: CommunityPermissions @cost(complexity: 1)\n\n    channelConnection: CommunityChannelsConnection @cost(complexity: 1)\n    members(\n      first: Int = 10\n      after: String\n      filter: MembersFilter\n    ): CommunityMembers @cost(complexity: 5, multipliers: [\"first\"])\n    threadConnection(\n      first: Int = 10\n      after: String\n      sort: CommunityThreadConnectionSort = latest\n    ): CommunityThreadsConnection @cost(complexity: 2, multipliers: [\"first\"])\n    metaData: CommunityMetaData @cost(complexity: 10)\n    watercooler: Thread\n    joinSettings: JoinSettings\n\n    watercoolerId: String\n\n    memberConnection(\n      first: Int = 10\n      after: String\n      filter: MemberConnectionFilter\n    ): CommunityMembersConnection!\n      @deprecated(reason: \"Use the new Community.members type\")\n    contextPermissions: ContextPermissions\n      @deprecated(reason: \"Use the new CommunityMember type to get permissions\")\n\n    hasFeatures: Features @deprecated(reason: \"Payments are no longer used\")\n    hasChargeableSource: Boolean\n      @deprecated(reason: \"Payments are no longer used\")\n    billingSettings: CommunityBillingSettings\n      @deprecated(reason: \"Payments are no longer used\")\n    invoices: [Invoice] @deprecated(reason: \"Payments are no longer used\")\n    recurringPayments: [RecurringPayment]\n      @deprecated(reason: \"Payments are no longer used\")\n    isPro: Boolean @deprecated(reason: \"Payments are no longer used\")\n  }\n\n  extend type Query {\n    community(id: ID, slug: LowercaseString): Community\n      @cacheControl(maxAge: 1200)\n    communities(\n      slugs: [LowercaseString]\n      ids: [ID]\n      curatedContentType: String\n    ): [Community] @cacheControl(maxAge: 1200)\n    topCommunities(amount: Int = 20): [Community!]\n      @cost(complexity: 4, multipliers: [\"amount\"])\n    recentCommunities: [Community!]\n  }\n\n  input MembersFilter {\n    isOwner: Boolean\n    isMember: Boolean\n    isBlocked: Boolean\n    isPending: Boolean\n    isModerator: Boolean\n  }\n\n  input MemberConnectionFilter\n    @deprecated(reason: \"Use the new MembersFilter input type\") {\n    isOwner: Boolean\n    isMember: Boolean\n    isBlocked: Boolean\n    isPending: Boolean\n    isModerator: Boolean\n  }\n\n  input EditCommunityInput {\n    name: String\n    description: String\n    website: String\n    file: Upload\n    coverFile: Upload\n    coverPhoto: String\n    communityId: ID!\n  }\n\n  extend type Mutation {\n    editCommunity(input: EditCommunityInput!): Community\n    deleteCommunity(communityId: ID!): Boolean\n    toggleCommunityRedirect(communityId: ID!): Community\n    toggleCommunityNoindex(communityId: ID!): Community\n  }\n`;\n\nmodule.exports = Community;\n"
  },
  {
    "path": "api/types/CommunityMember.js",
    "content": "// @flow\nconst CommunityMember = /* GraphQL */ `\n  type CommunityMember @cacheControl(maxAge: 600) {\n    id: ID!\n    user: User!\n    roles: [String]\n    isMember: Boolean\n    isModerator: Boolean\n    isOwner: Boolean\n    isBlocked: Boolean\n    isPending: Boolean\n  }\n\n  extend type Query {\n    communityMember(userId: ID!, communityId: ID!): CommunityMember\n  }\n`;\n\nmodule.exports = CommunityMember;\n"
  },
  {
    "path": "api/types/DirectMessageThread.js",
    "content": "// @flow\nconst DirectMessageThread = /* GraphQL */ `\n  type DirectMessagesConnection {\n    pageInfo: PageInfo!\n    edges: [DirectMessageEdge!]\n  }\n\n  type DirectMessageEdge {\n    cursor: String!\n    node: Message!\n  }\n\n  type ParticipantInfo {\n    id: ID!\n    name: String\n    username: String\n    profilePhoto: String\n    userId: ID!\n  }\n\n  type DirectMessageThread {\n    id: ID!\n    messageConnection(\n      first: Int = 20\n      after: String\n    ): DirectMessagesConnection! @cost(complexity: 1, multipliers: [\"first\"])\n    participants: [ParticipantInfo]! @cost(complexity: 1)\n    snippet: String @cost(complexity: 2)\n    threadLastActive: Date!\n  }\n\n  extend type Query {\n    directMessageThread(id: ID!): DirectMessageThread\n    directMessageThreadByUserIds(userIds: [ID!]): DirectMessageThread\n  }\n`;\n\nmodule.exports = DirectMessageThread;\n"
  },
  {
    "path": "api/types/Invoice.js",
    "content": "// @flow\n// deprecated 9/27/2018 while removing payments\nconst Invoice = /* GraphQL */ `\n  type Invoice {\n    id: ID!\n    paidAt: Int\n    amount: Int\n    sourceBrand: String\n    sourceLast4: String\n    planName: String\n  }\n\n  extend type Query {\n    invoice(id: ID): Invoice\n  }\n`;\n\nmodule.exports = Invoice;\n"
  },
  {
    "path": "api/types/Message.js",
    "content": "// @flow\nconst Message = /* GraphQL */ `\n  enum MessageTypes {\n    text\n    media\n    draftjs\n  }\n\n  enum ThreadTypes {\n    story\n    directMessageThread\n  }\n\n  type MessageContent {\n    body: String!\n  }\n\n  type ReactionData {\n    count: Int!\n    hasReacted: Boolean\n  }\n\n  type Message @cacheControl(maxAge: 600) {\n    id: ID!\n    timestamp: Date!\n    thread: Thread\n    content: MessageContent!\n    author: ThreadParticipant! @cost(complexity: 2)\n    reactions: ReactionData @cost(complexity: 1)\n    messageType: MessageTypes!\n    parent: Message\n    modifiedAt: Date\n    bot: Boolean\n    sender: User! @deprecated(reason: \"Use Message.author field instead\")\n  }\n\n  extend type Query {\n    message(id: ID!): Message\n    getMediaMessagesForThread(threadId: ID!): [Message]\n  }\n\n  extend type Mutation {\n    deleteMessage(id: ID!): Boolean\n  }\n`;\n\nmodule.exports = Message;\n"
  },
  {
    "path": "api/types/Reaction.js",
    "content": "// @flow\nconst Reaction = /* GraphQL */ `\n  enum ReactionTypes {\n    like\n  }\n\n  type Reaction @cacheControl(maxAge: 84700) {\n    id: ID!\n    timestamp: Date!\n    message: Message!\n    user: User!\n    type: ReactionTypes!\n  }\n\n  input ReactionInput {\n    messageId: ID!\n    type: ReactionTypes!\n  }\n\n  extend type Query {\n    reaction(id: String!): Reaction\n  }\n`;\n\nmodule.exports = Reaction;\n"
  },
  {
    "path": "api/types/Thread.js",
    "content": "// @flow\nconst Thread = /* GraphQL */ `\n  enum ThreadReactionTypes {\n    like\n  }\n\n  type ThreadReactions {\n    count: Int!\n    hasReacted: Boolean\n  }\n\n  type ThreadMessagesConnection {\n    pageInfo: PageInfo!\n    edges: [ThreadMessageEdge!]\n  }\n\n  type ThreadMessageEdge {\n    cursor: String!\n    node: Message!\n  }\n\n  # The contents of a thread\n  type ThreadContent {\n    title: String\n    body: String\n    media: String\n  }\n\n  type Edit {\n    timestamp: Date!\n    content: ThreadContent!\n    # editedBy: User!\n  }\n\n  enum ThreadType {\n    SLATE\n    DRAFTJS\n    TEXT\n  }\n\n  type Attachment {\n    attachmentType: String\n    data: String\n  }\n\n  type Thread @cacheControl(maxAge: 1200) {\n    id: ID!\n    createdAt: Date!\n    modifiedAt: Date\n    editedBy: ThreadParticipant @cost(complexity: 2)\n    channel: Channel!\n    community: Community! @cost(complexity: 1) @cacheControl(maxAge: 84700)\n    isPublished: Boolean!\n    content: ThreadContent!\n    isLocked: Boolean\n    isAuthor: Boolean\n    lastActive: Date\n    type: ThreadType\n    edits: [Edit!]\n    messageConnection(\n      first: Int\n      after: String\n      last: Int\n      before: String\n    ): ThreadMessagesConnection! @cost(complexity: 1, multipliers: [\"first\"])\n    messageCount: Int @cost(complexity: 1)\n    author: ThreadParticipant! @cost(complexity: 2)\n    watercooler: Boolean\n    reactions: ThreadReactions @cost(complexity: 1)\n    metaImage: String\n\n    attachments: [Attachment]\n      @deprecated(reason: \"Attachments no longer used for link previews\")\n    isCreator: Boolean @deprecated(reason: \"Use Thread.isAuthor instead\")\n\n    creator: User! @deprecated(reason: \"Use Thread.author instead\")\n    participants: [User]\n      @cost(complexity: 1)\n      @deprecated(reason: \"No longer used\")\n  }\n\n  extend type Query {\n    thread(id: ID!): Thread @cacheControl(maxAge: 1200)\n  }\n\n  input AttachmentInput {\n    attachmentType: String\n    data: String\n  }\n\n  input ThreadContentInput {\n    title: String\n    body: String\n  }\n\n  extend type Mutation {\n    deleteThread(threadId: ID!): Boolean\n  }\n`;\n\nmodule.exports = Thread;\n"
  },
  {
    "path": "api/types/ThreadParticipant.js",
    "content": "// @flow\nconst ThreadParticipant = /* GraphQL */ `\n  type ThreadParticipant {\n    id: ID!\n    user: User!\n    roles: [String]\n    isMember: Boolean\n    isModerator: Boolean\n    isOwner: Boolean\n    isBlocked: Boolean\n  }\n`;\n\nmodule.exports = ThreadParticipant;\n"
  },
  {
    "path": "api/types/User.js",
    "content": "// @flow\nconst User = /* GraphQL */ `\n  type UserCommunitiesConnection {\n    pageInfo: PageInfo!\n    edges: [UserCommunityEdge!]\n  }\n\n  type UserCommunityEdge {\n    node: Community!\n  }\n\n  type UserChannelsConnection {\n    pageInfo: PageInfo!\n    edges: [UserChannelEdge!]\n  }\n\n  type UserChannelEdge {\n    node: Channel!\n  }\n\n  type UserDirectMessageThreadsConnection {\n    pageInfo: PageInfo!\n    edges: [DirectMessageThreadEdge]\n  }\n\n  type DirectMessageThreadEdge {\n    cursor: String!\n    node: DirectMessageThread!\n  }\n\n  type UserThreadsConnection {\n    pageInfo: PageInfo!\n    edges: [UserThreadEdge!]\n  }\n\n  type UserThreadEdge {\n    cursor: String!\n    node: Thread!\n  }\n\n  type EverythingThreadsConnection {\n    pageInfo: PageInfo!\n    edges: [EverythingThreadEdge!]\n  }\n\n  type EverythingThreadEdge {\n    cursor: String!\n    node: Thread!\n  }\n\n  type NotificationKindSettings {\n    email: Boolean\n  }\n\n  type NotificationSettingsType {\n    newMessageInThreads: NotificationKindSettings\n    newDirectMessage: NotificationKindSettings\n    newThreadCreated: NotificationKindSettings\n    weeklyDigest: NotificationKindSettings\n    dailyDigest: NotificationKindSettings\n    newMention: NotificationKindSettings\n  }\n\n  type UserNotificationsSettings {\n    types: NotificationSettingsType\n  }\n\n  type UserSettings {\n    notifications: UserNotificationsSettings\n  }\n\n  enum ThreadConnectionType {\n    participant\n    creator\n  }\n\n  type GithubProfile {\n    id: Int\n    username: String\n  }\n\n  type User @cacheControl(maxAge: 600) {\n    id: ID!\n    name: String\n    firstName: String\n    description: String\n    website: String\n    username: LowercaseString\n    profilePhoto: String\n    coverPhoto: String\n    email: LowercaseString\n    providerId: String\n    createdAt: Date!\n    timezone: Int\n    pendingEmail: LowercaseString\n    betaSupporter: Boolean @cacheControl(maxAge: 84700)\n\n    isPro: Boolean @deprecated(reason: \"Use the betaSupporter field instead\")\n    recurringPayments: [RecurringPayment]\n      @deprecated(reason: \"Payments are no longer used\")\n\n    invoices: [Invoice] @deprecated(reason: \"Payments are no longer used\")\n\n    # non-schema fields\n    threadCount: Int @cost(complexity: 1)\n    isAdmin: Boolean\n    communityConnection: UserCommunitiesConnection!\n    channelConnection: UserChannelsConnection!\n    directMessageThreadsConnection(\n      first: Int = 15\n      after: String\n    ): UserDirectMessageThreadsConnection!\n      @cost(complexity: 1, multipliers: [\"first\"])\n    threadConnection(\n      first: Int = 10\n      after: String\n      kind: ThreadConnectionType\n    ): UserThreadsConnection! @cost(complexity: 1, multipliers: [\"first\"])\n\n    everything(first: Int = 10, after: String): EverythingThreadsConnection!\n      @cost(complexity: 1, multipliers: [\"first\"])\n\n    settings: UserSettings @cost(complexity: 1)\n    githubProfile: GithubProfile\n\n    contextPermissions: ContextPermissions\n      @deprecated(reason: \"Use the CommunityMember type to get permissions\")\n  }\n\n  extend type Query {\n    user(id: ID, username: LowercaseString): User @cacheControl(maxAge: 1200)\n    currentUser: User @cacheControl(maxAge: 1200, scope: PRIVATE)\n  }\n\n  input EditUserInput {\n    file: Upload\n    coverFile: Upload\n    name: String\n    description: String\n    website: String\n    username: LowercaseString\n    timezone: Int\n    email: String\n  }\n\n  input BanUserInput {\n    userId: String!\n    reason: String!\n  }\n\n  extend type Mutation {\n    editUser(input: EditUserInput!): User\n    deleteCurrentUser: Boolean\n    banUser(input: BanUserInput!): Boolean\n  }\n`;\n\nmodule.exports = User;\n"
  },
  {
    "path": "api/types/custom-scalars/LowercaseString.js",
    "content": "// @flow\nimport { GraphQLScalarType } from 'graphql';\n// $FlowIssue\nimport { Kind } from 'graphql/language';\n\nconst LowercaseString = new GraphQLScalarType({\n  name: 'LowercaseString',\n  description: 'Returns all strings in lower case',\n  parseValue(value) {\n    return value.toLowerCase();\n  },\n  serialize(value) {\n    return value.toLowerCase();\n  },\n  parseLiteral(ast) {\n    if (ast.kind === Kind.STRING) {\n      return ast.value.toLowerCase();\n    }\n    return null;\n  },\n});\n\nexport default LowercaseString;\n"
  },
  {
    "path": "api/types/general.js",
    "content": "// @flow\n/**\n * General, reusable types\n */\n\nconst general = /* GraphQL */ `\n  type PageInfo {\n    hasNextPage: Boolean\n    hasPreviousPage: Boolean\n  }\n\n  type ChannelPermissions {\n    isMember: Boolean\n    isBlocked: Boolean\n    isPending: Boolean\n    isOwner: Boolean\n    isModerator: Boolean\n    receiveNotifications: Boolean\n  }\n\n  type CommunityPermissions {\n    isMember: Boolean\n    isBlocked: Boolean\n    isOwner: Boolean\n    isModerator: Boolean\n    isPending: Boolean\n    receiveNotifications: Boolean\n  }\n\n  type ContextPermissions\n    @deprecated(\n      reason: \"Use the CommunityMember or ThreadParticipant type to get permissions\"\n    ) {\n    communityId: String\n    isModerator: Boolean\n    isOwner: Boolean\n    isMember: Boolean\n    isBlocked: Boolean\n  }\n\n  input EmailInviteContactInput {\n    email: LowercaseString!\n    firstName: String\n    lastName: String\n  }\n\n  input EmailInvitesInput {\n    id: ID!\n    contacts: [EmailInviteContactInput]\n    customMessage: String\n  }\n\n  type JoinSettings {\n    tokenJoinEnabled: Boolean\n    token: String\n  }\n\n  type RecurringPayment {\n    plan: String\n    amount: String\n    createdAt: String\n    status: String\n  }\n\n  enum EntityTypes {\n    communities\n    channels\n    users\n    threads\n  }\n\n  input UploadImageInput {\n    image: Upload!\n    type: EntityTypes!\n    id: String\n  }\n\n  extend type Mutation {\n    uploadImage(input: UploadImageInput!): String\n  }\n`;\n\nmodule.exports = general;\n"
  },
  {
    "path": "api/types/scalars.js",
    "content": "// @flow\n/**\n * Custom scalars (data types, like Int, String,...) live in this file,\n * both their type definitions and their resolvers\n */\nconst GraphQLDate = require('graphql-date');\n// NOTE(@mxstbr): We can remove this once we stop using makeExecutableSchema\nimport { GraphQLUpload } from 'apollo-server-express';\nimport LowercaseString from './custom-scalars/LowercaseString';\n\nconst typeDefs = /* GraphQL */ `\n  scalar Date\n  scalar Upload\n  scalar LowercaseString\n`;\n\nconst resolvers = {\n  Date: GraphQLDate,\n  Upload: GraphQLUpload,\n  LowercaseString: LowercaseString,\n};\n\nmodule.exports = {\n  typeDefs,\n  resolvers,\n};\n"
  },
  {
    "path": "api/utils/UserError.js",
    "content": "// Taken from https://github.com/kadirahq/graphql-errors\n\nexport const IsUserError = Symbol('IsUserError');\n\nclass UserError extends Error {\n  constructor(...args) {\n    super(...args);\n    this.name = 'Error';\n    this.message = args[0];\n    this[IsUserError] = true;\n    Error.captureStackTrace(this, 'Error');\n  }\n}\n\nexport default UserError;\n"
  },
  {
    "path": "api/utils/base64.js",
    "content": "// @flow\n\n/**\n * Encode a string to base64 (using the Node built-in Buffer)\n *\n * Stolen from http://stackoverflow.com/a/38237610/2115623\n */\nexport const encode = (string: string) =>\n  Buffer.from(string).toString('base64');\n\ntype Base64String = string;\n/**\n * Decode a base64 string (using the Node built-in Buffer)\n *\n * Stolen from http://stackoverflow.com/a/38237610/2115623\n */\nexport const decode = (string?: Base64String) =>\n  (string ? Buffer.from(string, 'base64').toString('ascii') : '');\n"
  },
  {
    "path": "api/utils/create-graphql-error-formatter.js",
    "content": "// @flow\nconst debug = require('debug')('api:utils:error-formatter');\nimport Raven from 'shared/raven';\nimport { IsUserError } from './UserError';\nimport type { GraphQLError } from 'graphql';\n\nconst queryRe = /\\s*(query|mutation)[^{]*/;\n\nconst collectQueries = query => {\n  if (!query) return 'No query';\n  return query\n    .split('\\n')\n    .map(line => {\n      const m = line.match(queryRe);\n      return m ? m[0].trim() : '';\n    })\n    .filter(line => !!line)\n    .join('\\n');\n};\n\nconst errorPath = error => {\n  if (!error.path) return '';\n  return error.path\n    .map((value, index) => {\n      if (!index) return value;\n      return typeof value === 'number' ? `[${value}]` : `.${value}`;\n    })\n    .join('');\n};\n\nconst logGraphQLError = (req, error) => {\n  debug('---GraphQL Error---');\n  debug(error);\n  error &&\n    error.extensions &&\n    error.extensions.exception &&\n    debug(error.extensions.exception.stacktrace.join('\\n'));\n  if (req) {\n    debug(collectQueries(req.body.query));\n    debug('variables', JSON.stringify(req.body.variables || {}));\n  }\n  const path = errorPath(error);\n  path && debug('path', path);\n  debug('-------------------\\n');\n};\n\nconst createGraphQLErrorFormatter = (req?: express$Request) => (\n  error: GraphQLError\n) => {\n  logGraphQLError(req, error);\n\n  const err = error.originalError || error;\n  const isUserError = err[IsUserError];\n\n  let sentryId = 'ID only generated in production';\n  if (!isUserError) {\n    if (process.env.NODE_ENV === 'production') {\n      sentryId = Raven.captureException(\n        error,\n        req && Raven.parsers.parseRequest(req)\n      );\n    }\n  }\n\n  return {\n    message: isUserError ? error.message : `Internal server error: ${sentryId}`,\n    // Hide the stack trace in production mode\n    stack:\n      !process.env.NODE_ENV === 'production' ? error.stack.split('\\n') : null,\n  };\n};\n\nexport default createGraphQLErrorFormatter;\n"
  },
  {
    "path": "api/utils/file-storage.js",
    "content": "// @flow\nrequire('now-env');\n\nimport type { FileUpload, EntityTypes } from 'shared/types';\n\nconst { FILE_STORAGE } = process.env;\n\nconst getUploadImageFn = () => {\n  switch (FILE_STORAGE) {\n    case 'local':\n      return require('./file-system').uploadImage;\n    case 's3':\n    default:\n      return require('./s3').uploadImage;\n  }\n};\n\nconst uploadImageFn = getUploadImageFn();\n\nexport const uploadImage = (\n  file: FileUpload,\n  entity: EntityTypes,\n  id: string\n): Promise<string> =>\n  uploadImageFn(file, entity, id).catch(err => {\n    throw new Error(err);\n  });\n"
  },
  {
    "path": "api/utils/file-system.js",
    "content": "// @flow\nimport uuidv4 from 'uuid/v4';\nimport fs from 'fs';\n\nimport type { FileUpload, EntityTypes } from 'shared/types';\n\nconst STORAGE_DIR = 'public/uploads';\nconst READ_WRITE_MODE = 0o777;\n\nconst dirExists = (path: string): Promise<boolean> =>\n  new Promise(res => fs.access(path, fs.constants.F_OK, err => res(!!!err)));\n\nconst createUploadsDir = (path: string): Promise<void> =>\n  new Promise(res =>\n    fs.mkdir(path, READ_WRITE_MODE, err => {\n      if (err) throw new Error(err);\n      res();\n    })\n  );\n\nexport const uploadImage = async (\n  file: FileUpload,\n  entity: EntityTypes,\n  id: string\n): Promise<string> => {\n  const result = await file;\n\n  if (!(await dirExists(STORAGE_DIR))) {\n    await createUploadsDir(STORAGE_DIR);\n  }\n\n  return new Promise(res => {\n    const filePath = `${uuidv4()}-${entity}-${id}`;\n    const { stream } = result;\n    stream.pipe(fs.createWriteStream(`${STORAGE_DIR}/${filePath}`));\n    stream.on('end', () => {\n      res(encodeURI(`/uploads/${filePath}`));\n    });\n  });\n};\n"
  },
  {
    "path": "api/utils/generate-thread-meta-image-from-text.js",
    "content": "// @flow\n// Generates a meta image which shows a title and a footer text on a nice Spectrum background.\nimport theme from 'shared/theme';\nimport { btoa } from 'b2a';\nimport { stringify } from 'query-string';\n\n// NOTES(@mxstbr):\n// Imgix has a useful ~text endpoint that allows us to add text to any image, but unfortunately that endpoint only allows us to add one piece of text to an image—but we need two!\n// We work around this by generating two images that only contain the text of the title and the footer respectively, nothing else, and then using the blend option to blend the background image with the title image (which only has the title text) and used the mark option to add our footer text as a \"watermark\" to the footer.\n\nconst WIDTH = 1500;\nconst IMGIX_TEXT_ENDPOINT = 'https://assets.imgix.net/~text';\n\nconst TITLE_PARAMS = {\n  w: WIDTH * 0.8, // 10% padding on each side\n  h: 270, // Magic number, clips text after three lines\n  txtsize: 56,\n  txtlead: 16,\n  txtfont: 'Helvetica,Bold',\n  txtalign: 'left,middle',\n  txtcolor: 'ffffff',\n  // NOTE(@mxstbr): txtclip (i.e. ellipsis on overflowing text) only works with single-line text, which titles aren't, so this doesn't do anything rn\n  txtclip: 'end,ellipsis',\n};\n\nconst FOOTER_PARAMS = {\n  h: 64,\n  txtsize: 36,\n  txtcolor: theme.brand.default.replace('#', ''),\n  txtalign: 'right,middle',\n  txtfont: 'Helvetica,Bold',\n};\n\nconst BACKGROUND_URL = `https://spectrum.imgix.net/default_images/twitter-share-card.png`;\n\ntype GetMetaImageInput = {\n  title: string,\n  footer: string,\n};\n\nconst generateImageFromText = ({\n  title,\n  footer,\n}: GetMetaImageInput): ?string => {\n  const base64title = btoa(title);\n  const base64footer = btoa(footer);\n  if (!base64title || !base64footer) return null;\n\n  const titleUrl = `${IMGIX_TEXT_ENDPOINT}?${stringify(\n    { ...TITLE_PARAMS, txt64: base64title.replace(/=/g, '') },\n    { encode: false }\n  )}`;\n  const footerUrl = `${IMGIX_TEXT_ENDPOINT}?${stringify(\n    { ...FOOTER_PARAMS, txt64: base64footer.replace(/=/g, '') },\n    { encode: false }\n  )}`;\n\n  const base64titleurl = btoa(titleUrl);\n  const base64footerurl = btoa(footerUrl);\n\n  if (!base64titleurl || !base64footerurl) return null;\n\n  const BACKGROUND_PARAMS = {\n    w: WIDTH,\n    bm: 'normal', // Blend the title normally, don't change opacity or color or anything, just overlay it\n    by: 170, // Magic numbers that get the position right\n    bx: 170,\n    markalign: 'left,bottom', // Show the footer on the left side\n    markpad: 24, // We overwrite the X pos, so the padding only applies on the y-axis\n    markx: 140,\n    blend64: btoa(titleUrl).replace(/=/g, ''),\n    mark64: btoa(footerUrl).replace(/=/g, ''),\n  };\n\n  return `${BACKGROUND_URL}?${stringify(BACKGROUND_PARAMS, { encode: false })}`;\n};\n\nexport default generateImageFromText;\n"
  },
  {
    "path": "api/utils/get-page-meta.js",
    "content": "const { parse } = require('url');\nconst generateMetaInfo = require('../../shared/generate-meta-info');\n\n// Don't even try if the path is /<value> any of these\n// TODO: Longer, more complete deny list here\nconst PATH_DENY_LIST = ['robots.txt', 'home', 'messages', 'notifications'];\n\ntype Meta = {\n  title: string,\n  description: string,\n  extra: string,\n};\n\nexport default (\n  url: string,\n  request: (query: string) => Promise\n): Promise<Meta> => {\n  const { pathname = '' } = parse(url);\n  const [, first, second, third] = pathname.split('/');\n  if (third || first.length === 0) return Promise.resolve(generateMetaInfo());\n  let promise;\n\n  switch (first) {\n    case 'explore': {\n      promise = Promise.resolve(generateMetaInfo({ type: 'explore' }));\n      break;\n    }\n    case 'thread': {\n      /**\n       * Thread\n       */\n      promise = request(/* GraphQL */ `\n        {\n          thread(id: \"${second}\") {\n            content {\n              title\n              body\n            }\n            type\n            channel {\n              name\n              isPrivate\n            }\n            community {\n              profilePhoto\n            }\n          }\n        }\n      `).then(res => {\n        const {\n          thread: { type, content, channel },\n        } = res.data;\n        return generateMetaInfo({\n          type: 'thread',\n          data: {\n            title: content.title,\n            type,\n            body: content.body,\n            channelName: channel.name,\n            privateChannel: channel.isPrivate,\n            image: community.profilePhoto,\n          },\n        });\n      });\n      break;\n    }\n    case 'users': {\n      /**\n       * User\n       */\n      promise = request(/* GraphQL */ `\n        {\n          user(username: \"${second}\") {\n            name\n            username\n            description\n            profilePhoto\n            # coverPhoto\n          }\n        }\n      `).then(res => {\n        const { user } = res.data;\n        return generateMetaInfo({\n          type: 'user',\n          data: {\n            username: user.username,\n            description: user.description,\n            name: user.name,\n            image: user.profilePhoto,\n          },\n        });\n      });\n      break;\n    }\n    default: {\n      const isDenyListed = PATH_DENY_LIST.includes(first);\n      if (second && !isDenyListed) {\n        /**\n         * Channel\n         */\n        promise = request(/* GraphQL */ `\n          {\n            channel(channelSlug: \"${second}\", communitySlug: \"${first}\") {\n              name\n              description\n              isPrivate\n              community {\n                name\n                profilePhoto\n              }\n            }\n          }\n        `).then(res => {\n          const {\n            channel,\n            channel: { community },\n          } = res.data;\n          return generateMetaInfo({\n            type: 'channel',\n            data: {\n              name: channel.name,\n              description: channel.description,\n              communityName: community.name,\n              private: channel.isPrivate,\n              image: community.profilePhoto,\n            },\n          });\n        });\n      } else if (!isDenyListed) {\n        /**\n         * Community\n         */\n        promise = request(/* GraphQL */ `\n          {\n            community(slug: \"${first}\") {\n              name\n              description\n              profilePhoto\n            }\n          }\n        `).then(res => {\n          const { community } = res.data;\n          return generateMetaInfo({\n            type: 'community',\n            data: {\n              name: community.name,\n              description: community.description,\n              image: community.profilePhoto,\n            },\n          });\n        });\n      }\n      break;\n    }\n  }\n\n  if (!promise) return Promise.resolve(generateMetaInfo());\n\n  return promise.catch(err => {\n    console.error(`⚠️ Failed to load metadata for ${url}! ⚠️`);\n    console.error(err);\n    return generateMetaInfo();\n  });\n};\n"
  },
  {
    "path": "api/utils/get-random-default-photo.js",
    "content": "// @flow\nconst faker = require('faker');\n\n// Helper function to get a random profile and cover photo\nconst PALETTE = [\n  'blue',\n  'blush',\n  'cool',\n  'green',\n  'orange',\n  'peach',\n  'pink',\n  'red',\n  'teal',\n  'violet',\n];\nexport default () => {\n  const color = faker.random.arrayElement(PALETTE);\n  return {\n    profilePhoto: `/default_images/profile-${color}.png`,\n    coverPhoto: `/default_images/cover-${color}.svg`,\n  };\n};\n"
  },
  {
    "path": "api/utils/is-spectrum-url.js",
    "content": "// @flow\nimport { URL } from 'url';\nimport { RELATIVE_URL } from 'shared/regexps';\nconst IS_PROD = process.env.NODE_ENV === 'production';\n\nconst EXPO_URL = /^https:\\/\\/auth\\.expo\\.io\\//;\n\n/**\n * Make a URL string is a spectrum.chat URL\n */\nexport default (url: string): boolean => {\n  if (RELATIVE_URL.test(url)) return true;\n  if (EXPO_URL.test(url)) return true;\n\n  try {\n    const { hostname, protocol } = new URL(url);\n    // hostname might be spectrum.chat or subdomain.spectrum.chat, so we use .endsWith\n    // We don't just check .contains because otherwise folks could make spectrum.chat.mydomain.com\n    const IS_SPECTRUM_URL =\n      hostname === 'spectrum.chat' || hostname === 'alpha.spectrum.chat';\n    const IS_LOCALHOST = hostname === 'localhost';\n    const IS_HTTP = protocol === 'https:' || protocol === 'http:';\n    // Make sure the passed redirect URL is a spectrum.chat one or (in development) localhost\n    if (IS_HTTP && (IS_SPECTRUM_URL || (!IS_PROD && IS_LOCALHOST))) {\n      return true;\n    }\n  } catch (err) {\n    // Swallow URL parsing errors (when an invalid URL is passed) and redirect to the standard one\n    console.error(`Invalid URL (\"${url}\") passed. Full error:`);\n    console.error(err);\n  }\n  return false;\n};\n"
  },
  {
    "path": "api/utils/markdown-linkify.js",
    "content": "const Linkify = require('linkify-it');\r\n\r\nconst linkifier = new Linkify(undefined, {\r\n  fuzzyEmail: false,\r\n});\r\n\r\n/**\r\n * Replace URLs in text with markdown links\r\n * (this is used in a migration script so it has to be Node-compat ES6 only)\r\n */\r\nconst linkify = (text /*: string*/ /*: string*/) => {\r\n  const matches = linkifier.match(text);\r\n  if (!matches) return text;\r\n  let out = text;\r\n  let last = 0;\r\n  const result = [];\r\n  if (matches) {\r\n    matches.forEach(function(match) {\r\n      if (last < match.index) {\r\n        result.push(text.slice(last, match.index));\r\n      }\r\n      result.push(`[${match.text}](${match.url})`);\r\n      last = match.lastIndex;\r\n    });\r\n    if (last < text.length) {\r\n      result.push(text.slice(last));\r\n    }\r\n    out = result.join('');\r\n  }\r\n  return out;\r\n};\r\n\r\nmodule.exports = linkify;\r\n"
  },
  {
    "path": "api/utils/paginate-arrays.js",
    "content": "// @flow\nexport type PaginationOptions = {\n  first: number,\n  after?: string,\n};\n\ntype Input = any;\n\ntype Output = {\n  list: Array<Input>,\n  hasMoreItems: boolean,\n};\n\n/**\n * Paginate an array\n *\n * For more complex value pass a getAfter callback to get the index of the cursor\n */\nexport default (\n  arr: Array<Input>,\n  { first, after }: PaginationOptions,\n  getAfter?: any => mixed\n): Output => {\n  const cursor = getAfter ? arr.findIndex(getAfter) : arr.indexOf(after);\n  const begin = cursor > -1 ? cursor + 1 : 0;\n  const end = begin + first;\n  return {\n    list: arr.slice(begin, end),\n    hasMoreItems: arr.length > end ? true : false,\n  };\n};\n"
  },
  {
    "path": "api/utils/permissions.js",
    "content": "// @flow\nimport UserError from './UserError';\nimport type { GraphQLContext } from '../';\nimport type { DBChannel, DBCommunity, DBUser } from 'shared/types';\nimport {\n  COMMUNITY_SLUG_DENY_LIST,\n  CHANNEL_SLUG_DENY_LIST,\n} from 'shared/slug-deny-lists';\nimport { getThreadById } from '../models/thread';\n\nexport const isAdmin = (id: string): boolean => {\n  const admins = [\n    'gVk5mYwccUOEKiN5vtOouqroGKo1',\n    '01p2A7kDCWUjGj6zQLlMQUOSQL42',\n    'VToKcde16dREgDkXcDl3hhcrFN33',\n  ];\n  return admins.indexOf(id) > -1;\n};\n\nexport const communitySlugIsDenyListed = (slug: string): boolean => {\n  return COMMUNITY_SLUG_DENY_LIST.indexOf(slug) > -1;\n};\n\nexport const channelSlugIsDenyListed = (slug: string): boolean => {\n  return CHANNEL_SLUG_DENY_LIST.indexOf(slug) > -1;\n};\n\n// prettier-ignore\nexport const isAuthedResolver = (resolver: Function) => async (obj: any, args: any, context: GraphQLContext, info: any) => {\n  if (!context.user || !context.user.id) {\n    return new UserError('You must be signed in to do this')\n  }\n\n  const user = await context.loaders.user.load(context.user.id)\n\n  if (!user || user.bannedAt || user.deletedAt) {\n    return new UserError('You must be signed in to do this')\n  }\n\n  return resolver(obj, args, context, info)\n}\n\n// prettier-ignore\nconst channelExists = async (channelId: string, loaders: any): Promise<?DBChannel> => {\n  const channel = await loaders.channel.load(channelId);\n  if (!channel || channel.deletedAt) return null;\n  return channel;\n};\n\n// prettier-ignore\nconst communityExists = async (communityId: string, loaders: any): Promise<?DBCommunity> => {\n  const community = await loaders.community.load(communityId);\n  if (!community || community.deletedAt) return null;\n  return community;\n};\n\n// prettier-ignore\nexport const canAdministerChannel = async (userId: string, channelId: string, loaders: any) => {\n  if (!userId || !channelId) return false;\n\n  const channel = await channelExists(channelId, loaders);\n  if (!channel) return false;\n\n  const [communityPermissions, channelPermissions] = await Promise.all([\n    loaders.userPermissionsInCommunity.load([userId, channel.communityId]),\n    loaders.userPermissionsInChannel.load([userId, channelId]),\n  ]);\n\n  if (!communityPermissions) return false;\n  if (communityPermissions.isOwner || communityPermissions.isModerator)\n    return true;\n  if (!channelPermissions) return false;\n  if (channelPermissions.isOwner) return true;\n\n  return false;\n};\n\n// prettier-ignore\nexport const canModerateChannel = async (userId: string, channelId: string, loaders: any) => {\n  if (!userId || !channelId) return false;\n\n  const channel = await channelExists(channelId, loaders);\n  if (!channel) return false;\n\n  const [communityPermissions, channelPermissions] = await Promise.all([\n    loaders.userPermissionsInCommunity.load([userId, channel.communityId]),\n    loaders.userPermissionsInChannel.load([userId, channelId]),\n  ]);\n\n  if (!communityPermissions) return false;\n  if (communityPermissions.isBlocked) return false\n  if (communityPermissions.isOwner || communityPermissions.isModerator) return true\n\n  if (!channelPermissions) return false;\n  if (channelPermissions.isBlocked) return false\n  return channelPermissions.isOwner || channelPermissions.isModerator\n};\n\n// prettier-ignore\nexport const canAdministerCommunity = async (userId: string, communityId: string, loaders: any) => {\n  if (!userId || !communityId) return false;\n\n  const community = await communityExists(communityId, loaders);\n  if (!community) return false;\n\n  const communityPermissions = await loaders.userPermissionsInCommunity.load([\n    userId,\n    communityId,\n  ]);\n\n  if (!communityPermissions) return false\n  if (communityPermissions.isBlocked) return false\n  return communityPermissions.isOwner\n};\n\n// prettier-igore\nexport const canModerateCommunity = async (\n  userId: string,\n  communityId: string,\n  loaders: any\n) => {\n  if (!userId || !communityId) return false;\n\n  const community = await communityExists(communityId, loaders);\n  if (!community) return false;\n\n  const communityPermissions = await loaders.userPermissionsInCommunity.load([\n    userId,\n    communityId,\n  ]);\n\n  if (!communityPermissions) return false;\n  if (communityPermissions.isBlocked) return false;\n  return communityPermissions.isOwner || communityPermissions.isModerator;\n};\n\n// prettier-ignore\nexport const canViewCommunity = async (user: DBUser, communityId: string, loaders: any) => {\n  if (!communityId) return false;\n\n  const community = await communityExists(communityId, loaders);\n  if (!community) return false;\n\n  if (!user) {\n    if (community.isPrivate) return false\n    return true\n  }\n\n  const communityPermissions = await loaders.userPermissionsInCommunity.load([\n    user.id,\n    communityId,\n  ]);\n\n  if (community.isPrivate && !communityPermissions) return false;\n  if (communityPermissions && communityPermissions.isBlocked) return false\n  if (community.isPrivate && !communityPermissions.isMember) return false\n  \n  return true;\n}\n\nexport const canViewThread = async (\n  userId: string,\n  threadId: string,\n  loaders: any\n) => {\n  const thread = await getThreadById(threadId);\n\n  if (!thread || thread.deletedAt) return false;\n\n  const [\n    channel,\n    community,\n    channelPermissions,\n    communityPermissions,\n  ] = await Promise.all([\n    loaders.channel.load(thread.channelId),\n    loaders.community.load(thread.communityId),\n    loaders.userPermissionsInChannel.load([userId, thread.channelId]),\n    loaders.userPermissionsInCommunity.load([userId, thread.communityId]),\n  ]);\n\n  if (!channel || !community) return false;\n  if (channel.deletedAt || community.deletedAt) return false;\n\n  if (userId) {\n    if (channel.isPrivate) {\n      if (\n        !channelPermissions ||\n        channelPermissions.isBlocked ||\n        !channelPermissions.isMember\n      ) {\n        return false;\n      }\n\n      return true;\n    }\n\n    if (community.isPrivate) {\n      if (\n        !communityPermissions ||\n        communityPermissions.isBlocked ||\n        !communityPermissions.isMember\n      ) {\n        return false;\n      }\n\n      return true;\n    }\n\n    if (communityPermissions) {\n      return !communityPermissions.isBlocked;\n    }\n\n    if (channelPermissions) {\n      return !channelPermissions.isBlocked;\n    }\n  }\n\n  return !channel.isPrivate && !community.isPrivate;\n};\n\nexport const canViewDMThread = async (\n  userId: string,\n  threadId: string,\n  loaders: any\n) => {\n  if (!userId) return false;\n\n  const thread = await loaders.directMessageParticipants.load(threadId);\n\n  if (!thread || !thread.reduction || thread.reduction.length === 0)\n    return false;\n\n  const participants = thread.reduction;\n\n  const ids = participants.map(({ userId }) => userId);\n\n  if (ids.indexOf(userId) === -1) return false;\n\n  return true;\n};\n\n// prettier-ignore\nexport const canViewChannel = async (user: DBUser, channelId: string, loaders: any) => {\n  if (!channelId) return false;\n\n  const channel = await channelExists(channelId, loaders);\n  if (!channel) return false;\n\n  const community = await communityExists(channel.communityId, loaders);\n  if (!community) return false\n  \n  if (!user) {\n    if (!community.isPrivate && !channel.isPrivate) return true\n    return false\n  }\n  \n  const [\n    communityPermissions,\n    channelPermissions\n  ] = await Promise.all([\n    loaders.userPermissionsInCommunity.load([\n      user.id,\n      community.id,\n    ]),\n    loaders.userPermissionsInChannel.load([\n      user.id,\n      channel.id,\n    ])\n  ])\n  \n  if (channel.isPrivate && !channelPermissions) return false\n  if (community.isPrivate && !communityPermissions) return false\n  if (channel.isPrivate && !channelPermissions.isMember) return false\n  if (community.isPrivate && !communityPermissions.isMember) return false\n  if (channelPermissions && channelPermissions.isBlocked) return false\n  if (communityPermissions && communityPermissions.isBlocked) return false\n  \n  return true\n}\n"
  },
  {
    "path": "api/utils/s3.js",
    "content": "// @flow\nrequire('now-env');\nimport AWS from 'aws-sdk';\nimport uuidv4 from 'uuid/v4';\nimport _ from 'lodash';\nimport Raven from 'shared/raven';\nimport sanitize from 'sanitize-filename';\nimport UserError from './UserError';\n\nconst IS_PROD = process.env.NODE_ENV === 'production';\n\nimport type { FileUpload, EntityTypes } from 'shared/types';\n\nlet S3_TOKEN = process.env.S3_TOKEN;\nlet S3_SECRET = process.env.S3_SECRET;\n\nif (!IS_PROD) {\n  S3_TOKEN = S3_TOKEN || 'asdf123';\n  S3_SECRET = S3_SECRET || 'asdf123';\n}\n\nAWS.config.update({\n  accessKeyId: S3_TOKEN,\n  secretAccessKey: S3_SECRET,\n  apiVersions: {\n    s3: 'latest',\n  },\n});\nconst s3 = new AWS.S3();\n\n// remove the bucket name from the url\n// the bucket name is not required since it is automatically bound\n// to our imgix source\nconst generateImageUrl = path => path.replace('spectrum-chat/', '');\n\nexport const uploadImage = async (\n  file: FileUpload,\n  entity: EntityTypes,\n  id: string\n): Promise<string> => {\n  const result = await file;\n  const { filename, stream, mimetype } = result;\n  const sanitized = sanitize(filename);\n  const encoded = encodeURIComponent(sanitized);\n  const validMediaTypes = ['image/gif', 'image/jpeg', 'image/png', 'video/mp4'];\n  return new Promise(res => {\n    // mimetype not in the validMediaType collection\n    if (_.indexOf(validMediaTypes, _.toLower(mimetype)) < 0) {\n      const unsupportedMediaTypeError = new UserError(\n        `We aren’t able to support uploads with the type ${mimetype}. Try uploading another image.`\n      );\n      Raven.captureException(unsupportedMediaTypeError);\n      throw unsupportedMediaTypeError;\n    }\n\n    const path = `spectrum-chat/${entity}/${id}`;\n    const fileKey = `${uuidv4()}-${encoded}`;\n    return s3.upload(\n      {\n        Bucket: path,\n        Key: fileKey,\n        Body: stream,\n      },\n      (err, data) => {\n        if (err) throw new Error(err);\n        if (!data || !data.Key)\n          throw new UserError('Image upload failed. Please try again.');\n        const url = generateImageUrl(data.Key);\n        res(url);\n      }\n    );\n  });\n};\n"
  },
  {
    "path": "api/utils/session-store.js",
    "content": "// @flow\nimport session from 'shared/middlewares/session';\n\nconst ONE_YEAR = 31556952000;\nconst ONE_DAY = 86400000;\n\nconst isSerializedJSON = (str: string) =>\n  str[0] === '{' && str[str.length - 1] === '}';\n\n/**\n * Get the sessions' users' ID of a req manually, needed for websocket authentication\n */\nexport const getUserIdFromReq = (req: any): Promise<?string> =>\n  new Promise((res, rej) => {\n    session(req, {}, err => {\n      if (err) {\n        return rej(err);\n      }\n      if (!req.session || !req.session.passport || !req.session.passport.user) {\n        return res(null);\n      }\n\n      // NOTE(@mxstbr): `req.session.passport.user` used to be just the userID, but is now the full user data\n      // JSON.stringified to avoid having to go to the db on every single request. We have to handle both\n      // cases here to get the ID.\n      if (!isSerializedJSON(req.session.passport.user))\n        return res(req.session.passport.user);\n\n      try {\n        return res(JSON.parse(req.session.passport.user).id);\n      } catch (err) {\n        return res(null);\n      }\n    });\n  });\n"
  },
  {
    "path": "api/utils/validate-draft-js-input.js",
    "content": "// @flow\nexport const validateRawContentState = (input: any) => {\n  if (\n    !input ||\n    !input.blocks ||\n    !Array.isArray(input.blocks) ||\n    !input.entityMap\n  ) {\n    return false;\n  }\n\n  return true;\n};\n"
  },
  {
    "path": "backpack.config.js",
    "content": "const path = require('path');\nconst debug = require('debug')('build:backpack');\n\nconst dir = process.env.DIR;\n\nif (!dir) throw new Error('Define directory to build with the -d option.');\ndebug(\n  `> Building ${dir}, entry: ${dir}/index.js, output: build-${dir}/main.js`\n);\n\nmodule.exports = {\n  webpack: (config, options, webpack) => {\n    config.entry.main = [`./${dir}/index.js`];\n\n    config.output.path = path.join(process.cwd(), `build-${dir}`);\n    const nodePath = (process.env.NODE_PATH || '')\n      .split(path.delimiter)\n      .filter(folder => folder && !path.isAbsolute(folder))\n      .map(folder => path.resolve('./', folder))\n      .join(path.delimiter);\n\n    if (process.env.NODE_ENV !== 'production' && !process.env.SSR) {\n      config.plugins.push(\n        new webpack.WatchIgnorePlugin([\n          path.resolve(__dirname, './src'),\n          path.resolve(__dirname, './build'),\n        ])\n      );\n    }\n    // Tell Sentry which server the errors are coming from\n    config.plugins.push(\n      new webpack.DefinePlugin({\n        'process.env.SENTRY_NAME': JSON.stringify(dir),\n      })\n    );\n    config.resolve.modules.push(nodePath);\n    return config;\n  },\n};\n"
  },
  {
    "path": "config-overrides.js",
    "content": "/**\n * Override things of the default create-react-app configuration here\n *\n * This is using react-app-rewired by @timarney\n */\n\nconst debug = require('debug')('build:config-overrides');\nconst webpack = require('webpack');\nconst { injectBabelPlugin } = require('react-app-rewired');\nconst rewireStyledComponents = require('react-app-rewire-styled-components');\nconst rewireReactHotLoader = require('react-app-rewire-hot-loader');\nconst swPrecachePlugin = require('sw-precache-webpack-plugin');\nconst fs = require('fs');\nconst path = require('path');\nconst match = require('micromatch');\nconst WriteFilePlugin = require('write-file-webpack-plugin');\nconst { ReactLoadablePlugin } = require('react-loadable/webpack');\nconst OfflinePlugin = require('offline-plugin');\nconst { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');\nconst BundleBuddyWebpackPlugin = require('bundle-buddy-webpack-plugin');\nconst CircularDependencyPlugin = require('circular-dependency-plugin');\n\n// Recursively walk a folder and get all file paths\nfunction walkFolder(currentDirPath, callback) {\n  fs.readdirSync(currentDirPath).forEach(name => {\n    // Skip dot files\n    if (name.indexOf('.') === 0) return;\n\n    var filePath = path.join(currentDirPath, name);\n    var stat = fs.statSync(filePath);\n\n    if (stat.isFile()) {\n      callback(filePath, stat);\n    } else if (stat.isDirectory()) {\n      walkFolder(filePath, callback);\n    }\n  });\n}\n\nconst isServiceWorkerPlugin = plugin => plugin instanceof swPrecachePlugin;\n\nconst removeEslint = config => {\n  config.module.rules = config.module.rules.filter(rule => {\n    // Filter the eslint loader based on its options\n    if (rule.use) {\n      return rule.use.every(use => {\n        if (!use.options) return true;\n        return !use.options.eslintPath;\n      });\n    }\n    return true;\n  });\n};\n\n// Make sure webpack transpiles files in the shared folder\nconst transpileShared = config => {\n  config.module.rules.forEach(rule => {\n    if (!rule.oneOf) return;\n\n    rule.oneOf.forEach(loader => {\n      if (!loader.include) return;\n      if (!loader.options) return;\n      // The loader config we're looking for is for JS files,\n      // so we look whether the config has a babelrc option\n      if (!Object.keys(loader.options).includes('babelrc')) return;\n\n      // Add the shared folder to the locations\n      // that should be transpiled\n      loader.include = [loader.include, path.resolve(__dirname, './shared')];\n    });\n  });\n\n  return config;\n};\n\nmodule.exports = function override(config, env) {\n  if (process.env.REACT_APP_MAINTENANCE_MODE === 'enabled') {\n    console.error('\\n\\n⚠️ ----MAINTENANCE MODE ENABLED----⚠️\\n\\n');\n  }\n  if (process.env.NODE_ENV === 'development') {\n    config.output.path = path.join(__dirname, './build');\n    config = rewireReactHotLoader(config, env);\n    config.plugins.push(\n      WriteFilePlugin({\n        log: true,\n        useHashIndex: false,\n      })\n    );\n  }\n  config.plugins.push(\n    new ReactLoadablePlugin({\n      filename: './build/react-loadable.json',\n    })\n  );\n  config = injectBabelPlugin('react-loadable/babel', config);\n  config = transpileShared(config);\n  // Filter the default serviceworker plugin, add offline plugin instead\n  config.plugins = config.plugins.filter(\n    plugin => !isServiceWorkerPlugin(plugin)\n  );\n  // Get all public files so they're cached by the SW\n  let externals = [];\n  walkFolder('./public/', file => {\n    if (file.indexOf('index.html') > -1) return;\n    externals.push(file.replace(/public/, ''));\n  });\n  config.plugins.push(\n    new OfflinePlugin({\n      // We don't want to cache anything\n      caches: {},\n      externals,\n      autoUpdate: true,\n      // NOTE(@mxstbr): Normally this is handled by setting\n      // appShell: './index.html'\n      // but we don't want to serve the app shell for the `/api` and `/auth` routes\n      // which means we have to manually do this and filter any of those routes out\n      cacheMaps: [\n        {\n          match: function() {\n            return false;\n          },\n          requestTypes: ['navigate'],\n        },\n      ],\n      rewrites: arg => arg,\n      ServiceWorker: {\n        entry: './public/push-sw.js',\n        events: true,\n        prefetchRequest: {\n          mode: 'cors',\n          credentials: 'include',\n        },\n      },\n      AppCache: false,\n    })\n  );\n  if (process.env.ANALYZE_BUNDLE === 'true') {\n    debug('Bundle analyzer enabled');\n    config.plugins.push(\n      new BundleAnalyzerPlugin({\n        analyzerMode: 'static',\n        openAnalyzer: false,\n      })\n    );\n  }\n  if (process.env.BUNDLE_BUDDY === 'true') {\n    config.plugins.push(new BundleBuddyWebpackPlugin());\n  }\n  config.plugins.unshift(\n    new webpack.optimize.CommonsChunkPlugin({\n      names: ['bootstrap'],\n      filename: 'static/js/[name].[hash].js',\n      minChunks: Infinity,\n    })\n  );\n  if (process.env.NODE_ENV === 'production') {\n    removeEslint(config);\n    config.plugins.push(new webpack.optimize.ModuleConcatenationPlugin());\n    config.plugins.push(\n      new webpack.DefinePlugin({\n        'process.env': {\n          SENTRY_DSN_CLIENT: `\"${process.env.SENTRY_DSN_CLIENT}\"`,\n        },\n      })\n    );\n    // Remove \"data-cy\" attribute in production\n    config = injectBabelPlugin(\n      ['react-remove-properties', { properties: ['data-cy'] }],\n      config\n    );\n  }\n\n  // NOTE(@mxstbr): This works around an issue where webpack was resolving the \"module\" path of b2a\n  // which breaks when imported on the fronted. We need to import the built version.\n  config.resolve.alias.b2a = path.resolve(\n    __dirname,\n    'node_modules/b2a/lib/index.js'\n  );\n  config.plugins.push(\n    new CircularDependencyPlugin({\n      cwd: process.cwd(),\n      failOnError: true,\n    })\n  );\n  return rewireStyledComponents(config, env, { ssr: true });\n};\n"
  },
  {
    "path": "cypress/fixtures/example.json",
    "content": "{\n  \"name\": \"Using fixtures to represent data\",\n  \"email\": \"hello@cypress.io\",\n  \"body\": \"Fixtures are a great way to mock data for responses to routes\"\n}"
  },
  {
    "path": "cypress/integration/channel/settings/delete_spec.js",
    "content": "import data from '../../../../shared/testing/data';\n\nconst channel = data.channels[0];\nconst privateChannel = data.channels[1];\n\nconst community = data.communities.find(\n  community => community.id === channel.communityId\n);\n\nconst privateCommunity = data.communities.find(\n  community => community.id === privateChannel.communityId\n);\n\nconst { userId: ownerInChannelId } = data.usersChannels.find(\n  ({ channelId, isOwner }) => channelId === channel.id && isOwner\n);\n\nconst { userId: ownerInPrivateChannelId } = data.usersChannels.find(\n  ({ channelId, isOwner }) => channelId === privateChannel.id && isOwner\n);\n\ndescribe('deleting general channel', () => {\n  beforeEach(() => {\n    cy.auth(ownerInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${channel.slug}/settings`)\n    );\n  });\n\n  it('should not allow general channel to be deleted', () => {\n    cy.get('[data-cy=\"channel-overview\"]').should('be.visible');\n\n    cy.get('[data-cy=\"delete-channel-button\"]').should('not.be.visible');\n  });\n});\n\ndescribe('deleting a channel', () => {\n  beforeEach(() => {\n    cy.auth(ownerInPrivateChannelId).then(() =>\n      cy.visit(`/${privateCommunity.slug}/${privateChannel.slug}/settings`)\n    );\n  });\n\n  it('should delete a channel', () => {\n    cy.get('[data-cy=\"channel-overview\"]').should('be.visible');\n\n    cy.get('[data-cy=\"delete-channel-button\"]')\n      .should('be.visible')\n      .click();\n\n    cy.get('[data-cy=\"delete-button\"]').should('be.visible');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/channel/settings/edit_spec.js",
    "content": "import data from '../../../../shared/testing/data';\n\nconst channel = data.channels[0];\n\nconst community = data.communities.find(\n  community => community.id === channel.communityId\n);\n\nconst { userId: ownerInChannelId } = data.usersChannels.find(\n  ({ channelId, isOwner }) => channelId === channel.id && isOwner\n);\n\nconst NEW_NAME = 'General Update';\nconst NEW_DESCRIPTION = 'New description';\n\ndescribe('edit a channel', () => {\n  beforeEach(() => {\n    cy.auth(ownerInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${channel.slug}/settings`)\n    );\n  });\n\n  it('should edit a channel', () => {\n    cy.get('[data-cy=\"channel-overview\"]').should('be.visible');\n    cy.get('[data-cy=\"channel-members\"]').should('be.visible');\n    cy.get('[data-cy=\"channel-name-input\"]')\n      .should('be.visible')\n      .click()\n      .clear()\n      .type(NEW_NAME);\n\n    cy.get('[data-cy=\"channel-description-input\"]')\n      .should('be.visible')\n      .click()\n      .clear()\n      .type(NEW_DESCRIPTION);\n\n    cy.get('[data-cy=\"save-button\"]')\n      .should('be.visible')\n      .click();\n\n    cy.visit(`/${community.slug}/${channel.slug}`);\n    cy.contains(NEW_NAME);\n  });\n});\n"
  },
  {
    "path": "cypress/integration/channel/view/membership_spec.js",
    "content": "import data from '../../../../shared/testing/data';\nimport constants from '../../../../api/migrations/seed/default/constants';\n\nconst publicChannel = data.channels[0];\nconst privateChannel = data.channels[1];\n\nconst community = data.communities.find(\n  community => community.id === publicChannel.communityId\n);\n\nconst { userId: memberInChannelId } = data.usersChannels.find(\n  ({ channelId, isMember, isOwner }) =>\n    channelId === publicChannel.id && isMember && !isOwner\n);\n\nconst { userId: memberInPrivateChannelId } = data.usersChannels.find(\n  ({ channelId, isMember }) => channelId === privateChannel.id && isMember\n);\n\nconst QUIET_USER_ID = constants.QUIET_USER_ID;\n\ndescribe('logged out channel membership', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${publicChannel.slug}`);\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('channel profile as member', () => {\n  beforeEach(() => {\n    cy.auth(memberInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${publicChannel.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('channel profile as non-member', () => {\n  beforeEach(() => {\n    cy.auth(QUIET_USER_ID).then(() =>\n      cy.visit(`/${community.slug}/${publicChannel.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('private channel profile', () => {\n  describe('private channel as member', () => {\n    beforeEach(() => {\n      cy.auth(memberInPrivateChannelId).then(() =>\n        cy.visit(`/${community.slug}/${privateChannel.slug}`)\n      );\n    });\n\n    it('should render profile', () => {\n      cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n    });\n  });\n\n  describe('private channel as non-member', () => {\n    beforeEach(() => {\n      cy.auth(QUIET_USER_ID).then(() =>\n        cy.visit(`/${community.slug}/${privateChannel.slug}`)\n      );\n    });\n\n    it('should render channel not found view', () => {\n      cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/channel/view/profile_spec.js",
    "content": "import data from '../../../../shared/testing/data';\n\nconst publicChannel = data.channels[0];\nconst privateChannel = data.channels[1];\nconst archivedChannel = data.channels.find(c => c.slug === 'archived');\nconst deletedChannel = data.channels.find(c => c.slug === 'deleted');\nconst publicChannelInPrivateCommunity = data.channels.find(\n  c => c.slug === 'private-general'\n);\n\nconst privateCommunity = data.communities.find(\n  community => community.id === publicChannelInPrivateCommunity.communityId\n);\n\nconst community = data.communities.find(\n  community => community.id === publicChannel.communityId\n);\n\nconst bryn = data.users.find(user => user.username === 'bryn');\n\nconst { userId: blockedInChannelId } = data.usersChannels.find(\n  ({ channelId, isBlocked }) => channelId === publicChannel.id && isBlocked\n);\n\nconst { userId: memberInPrivateChannelId } = data.usersChannels.find(\n  ({ channelId, isMember }) => channelId === privateChannel.id && isMember\n);\n\nconst { userId: memberInPrivateCommunityId } = data.usersChannels.find(\n  ({ channelId, isMember }) =>\n    channelId === publicChannelInPrivateCommunity.id && isMember\n);\n\ndescribe('public channel', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${publicChannel.slug}`);\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('public channel in private community signed out', () => {\n  beforeEach(() => {\n    cy.visit(\n      `/${privateCommunity.slug}/${publicChannelInPrivateCommunity.slug}`\n    );\n  });\n\n  it('should render channel not found view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n\ndescribe('public channel in private community with permission', () => {\n  beforeEach(() => {\n    cy.auth(memberInPrivateCommunityId).then(() =>\n      cy.visit(\n        `/${privateCommunity.slug}/${publicChannelInPrivateCommunity.slug}`\n      )\n    );\n  });\n\n  it('should render if user is member of community', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('public channel in private community without permission', () => {\n  beforeEach(() => {\n    cy.auth(bryn.id).then(() =>\n      cy.visit(\n        `/${privateCommunity.slug}/${publicChannelInPrivateCommunity.slug}`\n      )\n    );\n  });\n\n  it('should render channel not found view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n\ndescribe('archived channel', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${archivedChannel.slug}`);\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('deleted channel', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${deletedChannel.slug}`);\n  });\n\n  it('should render error view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n\ndescribe('blocked in public channel', () => {\n  beforeEach(() => {\n    cy.auth(blockedInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${publicChannel.slug}`)\n    );\n  });\n\n  it('should render error view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n\ndescribe('member in private channel', () => {\n  beforeEach(() => {\n    cy.auth(memberInPrivateChannelId).then(() =>\n      cy.visit(`/${community.slug}/${privateChannel.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"channel-view\"]').should('be.visible');\n  });\n});\n\ndescribe('blocked in private channel', () => {\n  beforeEach(() => {\n    cy.auth(blockedInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${privateChannel.slug}`)\n    );\n  });\n\n  it('should render channel not found view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n\ndescribe('is not logged in', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${privateChannel.slug}`);\n  });\n\n  it('should render channel not found view', () => {\n    cy.get('[data-cy=\"channel-view-error\"]').should('be.visible');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/channel/view/threads_spec.js",
    "content": "import data from '../../../../shared/testing/data';\n\nconst channel = data.channels[0];\n\nconst community = data.communities.find(\n  community => community.id === channel.communityId\n);\n\nconst { userId: memberInChannelId } = data.usersChannels.find(\n  ({ channelId, isMember, isOwner }) =>\n    channelId === channel.id && isMember && !isOwner\n);\n\ndescribe('channel threads logged out', () => {\n  beforeEach(() => {\n    cy.visit(`/${community.slug}/${channel.slug}`);\n  });\n\n  it('should render list of threads', () => {\n    data.threads\n      .filter(thread => !thread.deletedAt && thread.channelId === channel.id)\n      .forEach(thread => {\n        cy.contains(thread.content.title);\n      });\n  });\n});\n\ndescribe('channel threads logged in', () => {\n  beforeEach(() => {\n    cy.auth(memberInChannelId).then(() =>\n      cy.visit(`/${community.slug}/${channel.slug}`)\n    );\n  });\n\n  it('should render list of threads', () => {\n    data.threads\n      .filter(thread => !thread.deletedAt && thread.channelId === channel.id)\n      .forEach(thread => {\n        cy.contains(thread.content.title);\n      });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/community/view/profile_spec.js",
    "content": "import data from '../../../../shared/testing/data';\n\nconst publicCommunity = data.communities.find(c => c.slug === 'spectrum');\nconst privateCommunity = data.communities.find(c => c.slug === 'private');\n\nconst publicUsersCommunities = data.usersCommunities\n  .filter(\n    uc =>\n      uc.communityId === publicCommunity.id &&\n      uc.isMember &&\n      (uc.isOwner || uc.isModerator)\n  )\n  .map(uc => uc.userId);\nconst privateUsersCommunities = data.usersCommunities\n  .filter(\n    uc =>\n      uc.communityId === privateCommunity.id &&\n      uc.isMember &&\n      (uc.isOwner || uc.isModerator)\n  )\n  .map(uc => uc.userId);\nconst publicTeamMembers = data.users.filter(\n  u => publicUsersCommunities.indexOf(u.id) >= 0\n);\nconst privateTeamMembers = data.users.filter(\n  u => privateUsersCommunities.indexOf(u.id) >= 0\n);\n\nconst { userId: memberInPublicCommunityId } = data.usersCommunities.find(\n  ({ communityId, isMember }) => communityId === publicCommunity.id && isMember\n);\n\nconst { userId: nonMemberInPublicCommunityId } = data.usersCommunities.find(\n  ({ communityId, isMember, isBlocked }) =>\n    communityId === publicCommunity.id && !isMember && !isBlocked\n);\n\nconst { userId: memberInPrivateCommunityId } = data.usersCommunities.find(\n  ({ communityId, isMember }) => communityId === privateCommunity.id && isMember\n);\n\nconst { userId: nonMemberInPrivateCommunityId } = data.usersCommunities.find(\n  ({ communityId, isMember, isBlocked }) =>\n    communityId === privateCommunity.id && !isMember && !isBlocked\n);\n\ndescribe('public community signed out', () => {\n  beforeEach(() => {\n    cy.visit(`/${publicCommunity.slug}`);\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"community-view\"]').should('be.visible');\n    cy.contains(publicCommunity.description);\n    cy.contains(publicCommunity.name);\n    cy.contains(publicCommunity.website);\n  });\n\n  it('should render threads', () => {\n    cy.get('[data-cy=\"community-view-content\"]')\n      .scrollIntoView()\n      .should('be.visible');\n\n    data.threads\n      .filter(\n        thread => !thread.deletedAt && thread.communityId === publicCommunity.id\n      )\n      .forEach(thread =>\n        cy\n          .contains(thread.content.title)\n          .scrollIntoView()\n          .should('be.visible')\n      );\n  });\n\n  it('should render channels', () => {\n    data.channels\n      .filter(channel => channel.communityId === publicCommunity.id)\n      .filter(channel => !channel.isPrivate)\n      .filter(channel => !channel.deletedAt)\n      .filter(channel => !channel.archivedAt)\n      .forEach(channel => {\n        cy.contains(channel.name)\n          .scrollIntoView()\n          .should('be.visible');\n      });\n  });\n\n  it('should render team', () => {\n    publicTeamMembers.forEach(user => {\n      cy.contains(user.name)\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n});\n\ndescribe('public community signed in without permission', () => {\n  beforeEach(() => {\n    cy.auth(nonMemberInPublicCommunityId).then(() =>\n      cy.visit(`/${publicCommunity.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"community-view\"]').should('be.visible');\n    cy.contains(publicCommunity.description);\n    cy.contains(publicCommunity.name);\n    cy.contains(publicCommunity.website);\n  });\n\n  it('should render threads', () => {\n    cy.get('[data-cy=\"community-view-content\"]')\n      .scrollIntoView()\n      .should('be.visible');\n\n    data.threads\n      .filter(\n        thread => !thread.deletedAt && thread.communityId === publicCommunity.id\n      )\n      .forEach(thread =>\n        cy\n          .contains(thread.content.title)\n          .scrollIntoView()\n          .should('be.visible')\n      );\n  });\n\n  it('should render channels', () => {\n    data.channels\n      .filter(channel => channel.communityId === publicCommunity.id)\n      .filter(channel => !channel.isPrivate)\n      .filter(channel => !channel.deletedAt)\n      .filter(channel => !channel.archivedAt)\n      .forEach(channel => {\n        cy.contains(channel.name)\n          .scrollIntoView()\n          .should('be.visible');\n      });\n  });\n\n  it('should render team', () => {\n    publicTeamMembers.forEach(user => {\n      cy.contains(user.name)\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n});\n\ndescribe('public community signed in with permission', () => {\n  beforeEach(() => {\n    cy.auth(memberInPublicCommunityId).then(() =>\n      cy.visit(`/${publicCommunity.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"community-view\"]').should('be.visible');\n    cy.contains(publicCommunity.description);\n    cy.contains(publicCommunity.name);\n    cy.contains(publicCommunity.website);\n  });\n});\n\ndescribe('private community signed out', () => {\n  beforeEach(() => {\n    cy.visit(`/${privateCommunity.slug}`);\n  });\n});\n\ndescribe('private community signed in without permission', () => {\n  beforeEach(() => {\n    cy.auth(nonMemberInPrivateCommunityId).then(() =>\n      cy.visit(`/${privateCommunity.slug}`)\n    );\n  });\n\n  it('should render the blocked page', () => {\n    cy.get('[data-cy=\"community-view-private\"]').should('be.visible');\n    cy.contains('This community is private');\n  });\n});\n\ndescribe('private community signed in with permissions', () => {\n  beforeEach(() => {\n    cy.auth(memberInPrivateCommunityId).then(() =>\n      cy.visit(`/${privateCommunity.slug}`)\n    );\n  });\n\n  it('should render profile', () => {\n    cy.get('[data-cy=\"community-view\"]').should('be.visible');\n    cy.contains(privateCommunity.description);\n    cy.contains(privateCommunity.name);\n    cy.contains(privateCommunity.website);\n  });\n\n  it('should render threads', () => {\n    cy.get('[data-cy=\"community-view-content\"]')\n      .scrollIntoView()\n      .should('be.visible');\n\n    data.threads\n      .filter(\n        thread =>\n          !thread.deletedAt && thread.communityId === privateCommunity.id\n      )\n      .forEach(thread =>\n        cy.contains(thread.content.title).should('be.visible')\n      );\n  });\n\n  it('should render channels', () => {\n    data.channels\n      .filter(channel => channel.communityId === privateCommunity.id)\n      .filter(channel => !channel.isPrivate)\n      .filter(channel => !channel.deletedAt)\n      .filter(channel => !channel.archivedAt)\n      .forEach(channel => {\n        cy.get('[data-cy=\"channel-list\"]')\n          .contains(channel.name)\n          .scrollIntoView()\n          .should('be.visible');\n      });\n  });\n\n  it('should render team', () => {\n    privateTeamMembers.forEach(user => {\n      cy.contains(user.name)\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/community_settings_members_spec.js",
    "content": "import data from '../../shared/testing/data';\n\nconst community = data.communities[0];\nconst members = data.usersCommunities\n  .filter(\n    ({ communityId, isMember }) => community.id === communityId && isMember\n  )\n  .map(({ userId }) => data.users.find(({ id }) => id === userId));\nconst { userId: ownerId } = data.usersCommunities.find(\n  ({ communityId, isOwner }) => communityId === community.id && isOwner\n);\nconst channels = data.channels.filter(\n  ({ communityId }) => community.id === communityId\n);\n\ndescribe('Community settings members tab', () => {\n  beforeEach(() => {\n    cy.auth(ownerId);\n  });\n\n  it('should have a list of the members', () => {\n    cy.visit(`/${community.slug}/settings`);\n    cy\n      .get(`[href=\"/${community.slug}/settings/members\"]`)\n      .should('be.visible')\n      .click();\n    members.forEach(member => {\n      cy.contains(member.name).should('be.visible');\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/community_settings_overview_spec.js",
    "content": "import data from '../../shared/testing/data';\n\nconst community = data.communities[0];\nconst { userId: ownerId } = data.usersCommunities.find(\n  ({ communityId, isOwner }) => communityId === community.id && isOwner\n);\nconst channels = data.channels\n  .filter(({ communityId }) => community.id === communityId)\n  .filter(c => !c.deletedAt);\n\ndescribe('Community settings overview tab', () => {\n  beforeEach(() => {\n    cy.auth(ownerId).then(() => cy.visit(`/${community.slug}/settings`));\n  });\n\n  it('should render the settings overview and allow editing the community metadata', () => {\n    cy.get('[data-cy=\"community-settings\"]').should('be.visible');\n    cy.contains('Channels');\n    // Make sure all channels are listed and link to their settings\n    channels.forEach(channel => {\n      cy.contains(channel.name);\n      cy.get(`[href*=\"${community.slug}/${channel.slug}/settings\"]`);\n    });\n    // Make sure the subnav is rendered correctly\n    cy.get(`[href*=\"settings/members\"]`).should('be.visible');\n\n    // Editing\n    const name = 'text';\n    const description = 'text';\n    // Change name\n    cy.get('[data-cy=\"community-settings-name-input\"]')\n      .clear()\n      .type(`${name}`);\n    // Change description\n    cy.get('[data-cy=\"community-settings-description-input\"]')\n      .clear()\n      .type(description);\n    const website = 'https://mxstbr.com/bla';\n    // Change website\n    cy.get('[data-cy=\"community-settings-website-input\"]')\n      .clear()\n      .type(website);\n    // Submit changes\n    cy.get('[data-cy=\"community-settings-edit-save-button\"]').click();\n    cy.visit(`/${community.slug}`);\n    cy.location('pathname').should('eq', `/${community.slug}`);\n    // Make sure changes were applied\n    cy.contains(description);\n    cy.contains(name);\n    cy.contains(website);\n    // Revert changes\n    cy.visit(`/${community.slug}/settings`);\n    cy.get('[data-cy=\"community-settings-name-input\"]')\n      .clear()\n      .type(community.name);\n    cy.get('[data-cy=\"community-settings-description-input\"]')\n      .clear()\n      .type(community.description);\n    cy.get('[data-cy=\"community-settings-website-input\"]')\n      .clear()\n      .type(community.website);\n    cy.get('[data-cy=\"community-settings-edit-save-button\"]').click();\n    cy.visit(`/${community.slug}`);\n    cy.location('pathname').should('eq', `/${community.slug}`);\n    cy.contains(community.name);\n    cy.contains(community.description);\n    cy.contains(community.website);\n  });\n});\n"
  },
  {
    "path": "cypress/integration/explore_spec.js",
    "content": "describe('Login View', () => {\n  beforeEach(() => {\n    cy.visit('/explore');\n  });\n\n  it('should render', () => {\n    cy.get('[data-cy=\"explore-page\"]').should('be.visible');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/login_spec.js",
    "content": "describe('Log in', () => {\n  beforeEach(() => {\n    cy.visit('/login');\n  });\n\n  it('should render login methods', () => {\n    cy.get('[data-cy=\"login-page\"]').should('be.visible');\n    cy.get('[href*=\"/auth/twitter\"]').should('be.visible');\n    cy.get('[href*=\"/auth/facebook\"]').should('be.visible');\n    cy.get('[href*=\"/auth/google\"]').should('be.visible');\n    cy.get('[href*=\"/auth/github\"]').should('be.visible');\n\n    cy.get('[href*=\"github.com/withspectrum/code-of-conduct\"]').should(\n      'be.visible'\n    );\n  });\n});\n"
  },
  {
    "path": "cypress/integration/messages_spec.js",
    "content": "import data from '../../shared/testing/data';\n\nconst user = data.users.find(user => user.username === 'brian');\n\ndescribe('/messages', () => {\n  beforeEach(() => {\n    cy.auth(user.id).then(() => cy.visit('/messages'));\n  });\n\n  it('should load list of direct messages', () => {\n    cy.contains('Max Stoiber and Bryn Jackson').should('be.visible');\n    cy.contains('A fifth one').should('be.visible');\n\n    cy.contains('Previous member').should('be.visible');\n    cy.contains('No messages yet...').should('be.visible');\n  });\n\n  it('should select an individual conversation', () => {\n    cy.contains('Max Stoiber and Bryn Jackson')\n      .should('be.visible')\n      .click();\n    cy.get('[data-cy=\"dm-header\"]').should('be.visible');\n    cy.get('[data-cy=\"dm-header\"]').contains('Max Stoiber, Bryn Jackson');\n    cy.get('[data-cy=\"message\"]').should($p => {\n      expect($p).to.have.length(5);\n    });\n  });\n\n  it('should switch conversations', () => {\n    cy.contains('Max Stoiber and Bryn Jackson')\n      .should('be.visible')\n      .click();\n    cy.get('[data-cy=\"dm-header\"]').should('be.visible');\n    cy.get('[data-cy=\"dm-header\"]').contains('Max Stoiber, Bryn Jackson');\n    cy.get('[data-cy=\"message\"]').should($p => {\n      expect($p).to.have.length(5);\n    });\n\n    cy.contains('Previous member')\n      .should('be.visible')\n      .click();\n    cy.get('[data-cy=\"dm-header\"]').should('not.be.visible');\n    cy.get('[data-cy=\"message\"]').should($p => {\n      expect($p).to.have.length(0);\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/modal_routes_spec.js",
    "content": "import data from '../../shared/testing/data';\nconst user = data.users.find(user => user.username === 'brian');\n\nconst pressEscape = () =>\n  cy.get('[data-cy=\"modal-container\"]').trigger('keydown', { keyCode: 27 });\n\nconst communityBeforeUrlIsValid = () =>\n  cy.url().should('eq', 'http://localhost:3000/spectrum?tab=posts');\nconst channelBeforeUrlIsValid = () =>\n  cy.url().should('eq', 'http://localhost:3000/spectrum/general?tab=posts');\n\ndescribe.skip('thread modal route', () => {\n  const threadSlider = () => cy.get('[data-cy=\"modal-container\"]');\n  const threadSliderClose = () => cy.get('[data-cy=\"thread-slider-close\"]');\n\n  it('handles esc key', () => {\n    cy.visit('/spectrum');\n    cy.get('[data-cy=\"thread-card\"]')\n      .first()\n      .click();\n    threadSlider().should('be.visible');\n    cy.url(\n      'eq',\n      'http://localhost:3000/spectrum/private/yet-another-thread~thread-6'\n    );\n\n    pressEscape();\n\n    communityBeforeUrlIsValid();\n    threadSlider().should('not.be.visible');\n  });\n\n  it('handles overlay click', () => {\n    cy.visit('/spectrum');\n    cy.get('[data-cy=\"thread-card\"]')\n      .first()\n      .click();\n    threadSlider().should('be.visible');\n    cy.url(\n      'eq',\n      'http://localhost:3000/spectrum/private/yet-another-thread~thread-6'\n    );\n\n    cy.get('[data-cy=\"overlay\"]').click(200, 200, { force: true });\n\n    communityBeforeUrlIsValid();\n    threadSlider().should('not.be.visible');\n  });\n\n  it('handles close click', () => {\n    cy.visit('/spectrum');\n    cy.get('[data-cy=\"thread-card\"]')\n      .first()\n      .click();\n    threadSlider().should('be.visible');\n    cy.url(\n      'eq',\n      'http://localhost:3000/spectrum/private/yet-another-thread~thread-6'\n    );\n\n    threadSliderClose().click();\n\n    communityBeforeUrlIsValid();\n    threadSlider().should('not.be.visible');\n  });\n\n  it('handles channel feed', () => {\n    cy.visit('/spectrum/general');\n    cy.get('[data-cy=\"thread-card\"]')\n      .first()\n      .click();\n    threadSlider().should('be.visible');\n    cy.url(\n      'eq',\n      'http://localhost:3000/spectrum/spectrum/general/yet-another-thread~thread-9'\n    );\n\n    pressEscape();\n\n    channelBeforeUrlIsValid();\n    threadSlider().should('not.be.visible');\n  });\n\n  it('handles thread attachment', () => {\n    cy.auth(user.id);\n    cy.visit('/spectrum/private/yet-another-thread~thread-6');\n    cy.get('[data-cy=\"thread-attachment\"]')\n      .should('be.visible')\n      .first()\n      .click();\n    threadSlider().should('be.visible');\n    pressEscape();\n    cy.url(\n      'eq',\n      'http://localhost:3000/spectrum/private/yet-another-thread~thread-6'\n    );\n  });\n});\n"
  },
  {
    "path": "cypress/integration/thread/action_bar_spec.js",
    "content": "import data from '../../../shared/testing/data';\nimport constants from '../../../api/migrations/seed/default/constants';\n\nconst publicChannel = data.channels.find(\n  c => c.id === constants.SPECTRUM_GENERAL_CHANNEL_ID\n);\nconst privateChannel = data.channels.find(\n  c => c.id === constants.SPECTRUM_PRIVATE_CHANNEL_ID\n);\n\nconst publicCommunity = data.communities.find(\n  c => c.id === constants.SPECTRUM_COMMUNITY_ID\n);\n\nconst publicThread = data.threads.find(\n  t => t.communityId === publicCommunity.id && t.channelId === publicChannel.id\n);\nconst privateThread = data.threads.find(\n  t => t.communityId === publicCommunity.id && t.channelId === privateChannel.id\n);\n\nconst publicThreadAuthor = data.users.find(\n  u => u.id === publicThread.creatorId\n);\n\nconst nonMemberUser = data.users.find(u => u.id === constants.QUIET_USER_ID);\nconst memberInChannelUser = data.users.find(u => u.id === constants.BRYN_ID);\n\nconst triggerThreadDelete = () => {\n  cy.get('[data-cy=\"thread-dropdown-delete\"]')\n    .first()\n    .click();\n  cy.get('[data-cy=\"delete-button\"]').should('be.visible');\n  cy.get('div.ReactModal__Overlay')\n    .should('be.visible')\n    .click('topLeft');\n};\n\nconst openSettingsDropdown = () => {\n  cy.get('[data-cy=\"thread-actions-dropdown-trigger\"]')\n    .last()\n    .should('be.visible')\n    .click({ force: true });\n};\n\ndescribe('action bar renders', () => {\n  describe('non authed', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${publicThread.id}`);\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      cy.get('[data-cy=\"thread-actions-dropdown-trigger\"]').should(\n        'not.be.visible'\n      );\n    });\n  });\n\n  describe('authed non member', () => {\n    beforeEach(() => {\n      cy.auth(nonMemberUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed member', () => {\n    beforeEach(() => {\n      cy.auth(memberInChannelUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      cy.get('[data-cy=\"thread-actions-dropdown-trigger\"]').should(\n        'not.be.visible'\n      );\n    });\n  });\n\n  describe('authed private channel member', () => {\n    beforeEach(() => {\n      cy.auth(memberInChannelUser.id).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      cy.get('[data-cy=\"thread-actions-dropdown-trigger\"]').should(\n        'not.be.visible'\n      );\n    });\n  });\n\n  describe('thread author', () => {\n    beforeEach(() => {\n      cy.auth(publicThreadAuthor.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      openSettingsDropdown();\n\n      cy.get('[data-cy=\"thread-actions-dropdown\"]').should('be.visible');\n\n      // dropdown controls\n      cy.get('[data-cy=\"thread-dropdown-delete\"]').should('be.visible');\n    });\n\n    it('should lock the thread', () => {\n      cy.auth(publicThreadAuthor.id);\n      openSettingsDropdown();\n    });\n\n    it('should trigger delete thread', () => {\n      cy.auth(publicThreadAuthor.id);\n      openSettingsDropdown();\n      triggerThreadDelete();\n    });\n  });\n\n  describe('channel moderator', () => {\n    beforeEach(() => {\n      cy.auth(constants.CHANNEL_MODERATOR_USER_ID).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      openSettingsDropdown();\n\n      cy.get('[data-cy=\"thread-actions-dropdown\"]').should('be.visible');\n\n      cy.get('[data-cy=\"thread-dropdown-delete\"]').should('be.visible');\n    });\n\n    it('should trigger delete thread', () => {\n      cy.auth(constants.CHANNEL_MODERATOR_USER_ID);\n\n      openSettingsDropdown();\n      triggerThreadDelete();\n    });\n  });\n\n  describe('channel owner', () => {\n    beforeEach(() => {\n      cy.auth(constants.CHANNEL_MODERATOR_USER_ID).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      openSettingsDropdown();\n\n      cy.get('[data-cy=\"thread-actions-dropdown\"]').should('be.visible');\n\n      cy.get('[data-cy=\"thread-dropdown-delete\"]').should('be.visible');\n    });\n\n    it('should trigger delete thread', () => {\n      cy.auth(constants.CHANNEL_MODERATOR_USER_ID);\n\n      openSettingsDropdown();\n      triggerThreadDelete();\n    });\n  });\n\n  describe('community moderator', () => {\n    beforeEach(() => {\n      cy.auth(constants.COMMUNITY_MODERATOR_USER_ID).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      openSettingsDropdown();\n\n      cy.get('[data-cy=\"thread-actions-dropdown\"]').should('be.visible');\n\n      cy.get('[data-cy=\"thread-dropdown-delete\"]').should('be.visible');\n    });\n\n    it('should trigger delete thread', () => {\n      cy.auth(constants.COMMUNITY_MODERATOR_USER_ID);\n\n      openSettingsDropdown();\n      triggerThreadDelete();\n    });\n  });\n\n  describe('community owner', () => {\n    beforeEach(() => {\n      cy.auth(constants.MAX_ID).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      openSettingsDropdown();\n\n      cy.get('[data-cy=\"thread-actions-dropdown\"]').should('be.visible');\n\n      cy.get('[data-cy=\"thread-dropdown-delete\"]').should('be.visible');\n    });\n\n    it('should trigger delete thread', () => {\n      cy.auth(constants.MAX_ID);\n\n      openSettingsDropdown();\n      triggerThreadDelete();\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/thread/view_spec.js",
    "content": "import data from '../../../shared/testing/data';\nimport { toPlainText, toState } from '../../../shared/draft-utils';\nimport constants from '../../../api/migrations/seed/default/constants';\n\nconst publicChannel = data.channels.find(\n  c => c.id === constants.SPECTRUM_GENERAL_CHANNEL_ID\n);\nconst privateChannel = data.channels.find(\n  c => c.id === constants.SPECTRUM_PRIVATE_CHANNEL_ID\n);\n\nconst publicCommunity = data.communities.find(\n  c => c.id === constants.SPECTRUM_COMMUNITY_ID\n);\n\nconst publicThread = data.threads.find(\n  t => t.communityId === publicCommunity.id && t.channelId === publicChannel.id\n);\nconst deletedThread = data.threads.find(t => t.deletedAt);\nconst privateThread = data.threads.find(\n  t => t.communityId === publicCommunity.id && t.channelId === privateChannel.id\n);\n\nconst publicThreadAuthor = data.users.find(\n  u => u.id === publicThread.creatorId\n);\n\nconst nonMemberUser = data.users.find(u => u.id === constants.QUIET_USER_ID);\nconst memberInChannelUser = data.users.find(u => u.id === constants.BRIAN_ID);\nconst blockedChannelUser = data.usersChannels.find(\n  u => u.id === constants.BLOCKED_USER_ID\n);\nconst blockedCommunityUser = data.usersCommunities.find(\n  u => u.id === constants.BLOCKED_USER_ID\n);\n\ndescribe('sidebar components on thread view', () => {\n  describe('non authed', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${publicThread.id}`);\n    });\n\n    it('should render', () => {\n      // loaded community info\n      cy.get('[data-cy=\"community-profile-card\"]')\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n\n  describe('authed non member', () => {\n    beforeEach(() => {\n      cy.auth(nonMemberUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      // loaded community info\n      cy.get('[data-cy=\"community-profile-card\"]')\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n\n  describe('authed member', () => {\n    beforeEach(() => {\n      cy.auth(memberInChannelUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      // loaded community info\n      cy.get('[data-cy=\"community-profile-card\"]')\n        .scrollIntoView()\n        .should('be.visible');\n\n      // loaded join button which directs to login\n      cy.get('[data-cy=\"community-profile-card\"]')\n        .scrollIntoView()\n        .should('be.visible');\n    });\n  });\n});\n\ndescribe('public thread', () => {\n  describe('not authed', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${publicThread.id}`);\n    });\n\n    it('should render', () => {\n      // loaded thread view\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n\n      // thread data loaded\n      cy.contains(publicThread.content.title);\n      cy.contains(\n        toPlainText(toState(JSON.parse(publicThread.content.body))).split(\n          ' '\n        )[0]\n      );\n\n      // thread author info loaded\n      cy.contains(publicThreadAuthor.name);\n      cy.contains(publicThreadAuthor.username);\n      cy.get(`[href*=\"/users/${publicThreadAuthor.username}\"]`).should(\n        'be.visible'\n      );\n    });\n  });\n\n  describe('authed as non member', () => {\n    beforeEach(() => {\n      cy.auth(nonMemberUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      // loaded thread view\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as member', () => {\n    beforeEach(() => {\n      cy.auth(memberInChannelUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as blocked channel user', () => {\n    beforeEach(() => {\n      cy.auth(blockedChannelUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as blocked community user', () => {\n    beforeEach(() => {\n      cy.auth(blockedCommunityUser.id).then(() =>\n        cy.visit(`/thread/${publicThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n});\n\ndescribe('private thread', () => {\n  describe('not authed', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${privateThread.id}`);\n    });\n\n    it('should render', () => {\n      // loaded thread view\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as non member', () => {\n    beforeEach(() => {\n      cy.auth(nonMemberUser.id).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      // loaded thread view\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as member', () => {\n    beforeEach(() => {\n      cy.auth(memberInChannelUser.id).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as blocked channel user', () => {\n    beforeEach(() => {\n      cy.auth(blockedChannelUser.id).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed as blocked community user', () => {\n    beforeEach(() => {\n      cy.auth(blockedCommunityUser.id).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n});\n\ndescribe('deleted thread', () => {\n  describe('not authed', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${deletedThread.id}`);\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('authed', () => {\n    beforeEach(() => {\n      cy.auth(nonMemberUser.id).then(() =>\n        cy.visit(`/thread/${deletedThread.id}`)\n      );\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('not.be.visible');\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/thread_spec.js",
    "content": "import { toPlainText, toState } from '../../shared/draft-utils';\nimport data from '../../shared/testing/data';\nimport {\n  SPECTRUM_PRIVATE_CHANNEL_ID,\n  QUIET_USER_ID,\n} from '../../api/migrations/seed/default/constants';\n\n// Public\nconst thread = data.threads[0];\nconst community = data.communities.find(\n  community => community.id === thread.communityId\n);\nconst moderator = data.usersCommunities\n  .filter(usersCommunity => usersCommunity.communityId === community.id)\n  .find(usersCommunity => usersCommunity.isOwner);\nconst author = data.users.find(user => user.id === thread.creatorId);\nconst messages = data.messages.filter(\n  message => message.threadId === thread.id\n);\n\n// Private\nconst privateThread = data.threads.find(\n  thread => thread.channelId === SPECTRUM_PRIVATE_CHANNEL_ID\n);\nconst privateAuthor = data.users.find(\n  user => user.id === privateThread.creatorId\n);\n\ndescribe('Thread View', () => {\n  describe('Public', () => {\n    beforeEach(() => {\n      cy.visit(`/thread/${thread.id}`);\n    });\n\n    it('should render', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      cy.contains(thread.content.title);\n      cy.contains(\n        toPlainText(toState(JSON.parse(thread.content.body))).split(' ')[0]\n      );\n      cy.contains(author.name);\n      cy.contains(author.username);\n      cy.get(`[href*=\"/users/${author.username}\"]`).should('be.visible');\n      cy.get(`[href*=\"/${community.slug}\"]`).should('be.visible');\n\n      cy.get('[data-cy=\"message-group\"]').should('be.visible');\n      messages.forEach(message => {\n        cy.contains(toPlainText(toState(JSON.parse(message.content.body))));\n      });\n    });\n  });\n\n  describe('Public (authenticated)', () => {\n    beforeEach(() => {\n      cy.auth(author.id).then(() => cy.visit(`/thread/${thread.id}`));\n    });\n  });\n\n  describe('Private', () => {\n    beforeEach(() => {\n      cy.auth(QUIET_USER_ID).then(() =>\n        cy.visit(`/thread/${privateThread.id}`)\n      );\n    });\n\n    it(\"should not allow logged-in users to send private messages if they don't have permission\", () => {\n      cy.get('[data-cy=\"null-thread-view\"]').should('be.visible');\n    });\n  });\n\n  describe('Loading a thread with a message query parameter', () => {\n    beforeEach(() => {\n      cy.auth(author.id).then(() =>\n        cy.visit(`/thread/thread-1?m=MTQ4MzIyNTIwMDAwMQ==`)\n      );\n    });\n\n    it('should load only messages after the selected message', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      // ensure messages have loaded\n      cy.contains('This is the first message!').should('not.be.visible');\n\n      // the first message should be selected\n      cy.get('[data-cy=\"message-selected\"]').should('be.visible');\n\n      // only one message should be selected\n      cy.get('[data-cy=\"message-selected\"]').should($p => {\n        expect($p).to.have.length(1);\n      });\n\n      // the other messages should be unselected\n      cy.get('[data-cy=\"message\"]').should($p => {\n        expect($p).to.have.length(3);\n      });\n    });\n  });\n\n  describe('message timestamp', () => {\n    beforeEach(() => {\n      cy.auth(author.id).then(() => cy.visit(`/thread/${thread.id}`));\n    });\n\n    it('should link the thread with message query param', () => {\n      cy.get('[data-cy=\"thread-view\"]').should('be.visible');\n      // ensure messages have loaded\n      cy.contains('This is the first message!').should('be.visible');\n\n      // click the copy link icon on the first message\n      cy.get('[data-cy=\"message-timestamp\"]')\n        .first()\n        .should('be.visible')\n        .click({ force: true });\n\n      cy.url().should('contain', `?m=MTQ4MzIyNTE5OTk5OQ==`);\n    });\n  });\n\n  describe('delete message as message author', () => {\n    beforeEach(() => {\n      cy.auth(author.id).then(() => cy.visit(`/thread/${thread.id}`));\n    });\n\n    it('should allow a user to delete their own message', () => {\n      // the last message should have delete action in the message action bar\n      cy.get('[data-cy=\"delete-message\"]').should('be.visible');\n      // there should only be one deletable message\n      cy.get('[data-cy=\"delete-message\"]').should($p => {\n        expect($p).to.have.length(1);\n      });\n      // clicking delete message should open double check modal\n      cy.get('[data-cy=\"delete-message\"]')\n        .last()\n        .click({ force: true });\n      // modal should open\n      cy.get('[data-cy=\"delete-button\"]').should('be.visible');\n    });\n  });\n\n  describe('delete message as community moderator', () => {\n    beforeEach(() => {\n      cy.auth(moderator.userId).then(() => cy.visit(`/thread/${thread.id}`));\n    });\n\n    it('should allow a user to delete all messages', () => {\n      // the last message should have delete action in the message action bar\n      cy.get('[data-cy=\"delete-message\"]').should('be.visible');\n      // there should only be one deletable message\n      cy.get('[data-cy=\"delete-message\"]').should($p => {\n        expect($p).to.have.length(4);\n      });\n      // clicking delete message should open double check modal\n      cy.get('[data-cy=\"delete-message\"]')\n        .last()\n        .click({ force: true });\n      // modal should open\n      cy.get('[data-cy=\"delete-button\"]').should('be.visible');\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/integration/toasts_spec.js",
    "content": "import data from '../../shared/testing/data';\nconst user = data.users[0];\n\nconst toastMessage = 'This is a long toast message';\n\ndescribe('Toasts and url query paramaters', () => {\n  beforeEach(() => {\n    cy.auth(user.id);\n  });\n\n  it('should show toast', () => {\n    const url = new URL('http://localhost:3000/me/settings');\n    url.searchParams.append('toastType', 'success');\n    url.searchParams.append('toastMessage', toastMessage);\n    cy.visit(url.toString());\n    cy.get('[data-cy=\"toast-success\"]').contains(toastMessage);\n    cy.url().should('eq', 'http://localhost:3000/users/mxstbr/settings');\n  });\n\n  it('should not show toast if no toastType', () => {\n    const url = new URL('http://localhost:3000/me/settings');\n    url.searchParams.append('toastMessage', toastMessage);\n    cy.visit(url.toString());\n    cy.get('[data-cy=\"toast-success\"]').should('have.length', 0);\n    cy.url().should('eq', 'http://localhost:3000/users/mxstbr/settings');\n  });\n\n  it('should not show toast if no toastMessage', () => {\n    const url = new URL('http://localhost:3000/me/settings');\n    url.searchParams.append('toastType', 'success');\n    cy.visit(url.toString());\n    cy.get('[data-cy=\"toast-success\"]', { timeout: 1 }).should(\n      'have.length',\n      0\n    );\n    cy.url().should('eq', 'http://localhost:3000/users/mxstbr/settings');\n  });\n\n  it('should not show toast if invalid toastType', () => {\n    const url = new URL('http://localhost:3000/me/settings');\n    url.searchParams.append('toastType', 'foo');\n    cy.visit(url.toString());\n    cy.get('[data-cy=\"toast-success\"]', { timeout: 1 }).should(\n      'have.length',\n      0\n    );\n    cy.url().should('eq', 'http://localhost:3000/users/mxstbr/settings');\n  });\n\n  it('should preserve existing query parameters', () => {\n    const url = new URL(\n      'http://localhost:3000/spectrum/general/another-thread~thread-2?m=MTQ4MzIyNTIwMDAwMg=='\n    );\n    url.searchParams.append('toastType', 'success');\n    url.searchParams.append('toastMessage', toastMessage);\n    cy.visit(url.toString());\n    cy.get('[data-cy=\"toast-success\"]', { timeout: 100 }).should(\n      'have.length',\n      1\n    );\n    cy.url().should(\n      'eq',\n      'http://localhost:3000/spectrum/general/another-thread~thread-2?m=MTQ4MzIyNTIwMDAwMg=='\n    );\n  });\n});\n"
  },
  {
    "path": "cypress/integration/user/delete_user_spec.js",
    "content": "import data from '../../../shared/testing/data';\nconst user = data.users[0];\n\ndescribe.skip('can view delete controls in settings', () => {\n  beforeEach(() => {\n    cy.auth(user.id).then(() => cy.visit(`/users/${user.username}/settings`));\n  });\n\n  it('should render delete account section', () => {\n    // scroll to delete account segment\n    cy.get('[data-cy=\"user-settings\"]').should('be.visible');\n\n    cy.get('[data-cy=\"delete-account-container\"]').scrollIntoView();\n\n    cy.get('[data-cy=\"delete-account-container\"]').should('be.visible');\n\n    // should warn about owning communities since users[0] is max\n    cy.get('[data-cy=\"owns-communities-notice\"]').should('be.visible');\n\n    // init delete\n    cy.get('[data-cy=\"delete-account-init-button\"]')\n      .should('be.visible')\n      .click();\n\n    // should see option to confirm or cancel\n    cy.get('[data-cy=\"delete-account-confirm-button\"]').should('be.visible');\n    // click cancel\n    cy.get('[data-cy=\"delete-account-cancel-button\"]')\n      .should('be.visible')\n      .click();\n\n    // after canceling it should reset\n    cy.get('[data-cy=\"delete-account-init-button\"]')\n      .should('be.visible')\n      .click();\n\n    // actually delete the account\n    cy.get('[data-cy=\"delete-account-confirm-button\"]')\n      .should('be.visible')\n      .click();\n\n    // should sign out and go to home page\n    cy.get('[data-cy=\"home-page\"]').should('be.visible');\n\n    // user should be deleted\n    cy.visit(`/users/${user.username}`);\n    cy.get('[data-cy=\"user-not-found\"]').should('be.visible');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/user/edit_user_spec.js",
    "content": "import data from '../../../shared/testing/data';\n\nconst user = data.users[0];\n\nconst NEW_NAME = 'Brian Edited';\nconst NEW_DESCRIPTION = 'Description Edited';\nconst NEW_WEBSITE = 'Website Edited';\n\ndescribe('edit a user', () => {\n  beforeEach(() => {\n    cy.auth(user.id).then(() => cy.visit(`/me/settings`));\n  });\n\n  it('should edit a user', () => {\n    cy.get('[data-cy=\"user-edit-form\"]').should('be.visible');\n\n    cy.get('[data-cy=\"user-name-input\"]')\n      .should('be.visible')\n      .click()\n      .clear()\n      .type(NEW_NAME);\n\n    cy.get('[data-cy=\"user-description-input\"]')\n      .should('be.visible')\n      .click()\n      .clear()\n      .type(NEW_DESCRIPTION);\n\n    cy.get('[data-cy=\"user-email-input\"]').should('be.visible');\n\n    cy.get('[data-cy=\"user-website-input\"]')\n      .should('be.visible')\n      .click()\n      .clear()\n      .type(NEW_WEBSITE);\n\n    cy.get('[data-cy=\"save-button\"]')\n      .should('be.visible')\n      .click();\n\n    cy.visit(`/me`);\n    cy.get('[data-cy=\"user-view\"]').should('be.visible');\n    cy.get('[data-cy=\"user-view\"]').contains(NEW_NAME);\n    cy.get('[data-cy=\"user-view\"]').contains(NEW_DESCRIPTION);\n    cy.get('[data-cy=\"user-view\"]').contains(NEW_WEBSITE);\n  });\n});\n"
  },
  {
    "path": "cypress/integration/user/me_redirect_spec.js",
    "content": "import data from '../../../shared/testing/data';\nconst user = data.users[0];\n\ndescribe('can view current user settings at /me', () => {\n  beforeEach(() => {\n    cy.auth(user.id);\n  });\n\n  it('should render user profile', () => {\n    cy.visit('/me');\n    cy.location('pathname').should('eq', `/users/${user.username}`);\n    cy.get('[data-cy=\"user-view\"]').should('be.visible');\n    cy.contains(user.username);\n    cy.contains(user.name);\n    cy.contains(user.description);\n  });\n});\n\ndescribe('can view current user settings at /me/settings', () => {\n  beforeEach(() => {\n    cy.auth(user.id);\n  });\n\n  it('should render settings', () => {\n    cy.visit('/me/settings');\n    cy.location('pathname').should('eq', `/users/${user.username}/settings`);\n    cy.get('[data-cy=\"user-settings\"]').should('be.visible');\n  });\n});\n\ndescribe('loads login view at /me if no current user', () => {\n  beforeEach(() => {\n    cy.visit(`/me`);\n  });\n\n  it('should render login', () => {\n    cy.get('[data-cy=\"login-page\"]').should('be.visible');\n  });\n});\n"
  },
  {
    "path": "cypress/integration/user_spec.js",
    "content": "import data from '../../shared/testing/data';\nconst user = data.users[1];\nconst communities = data.communities;\nconst channels = data.channels;\nconst threads = data.threads;\nconst publicAuthoredThreads = threads.filter(thread => {\n  const community = communities.find(\n    community => community.id === thread.communityId\n  );\n  const channel = channels.find(channel => channel.id === thread.channelId);\n  return (\n    thread.creatorId === user.id && !community.isPrivate && !channel.isPrivate\n  );\n});\n\ndescribe('User View', () => {\n  it('should render', () => {\n    cy.visit(`/users/${user.username}`);\n    cy.get('[data-cy=\"user-view\"]').should('be.visible');\n    cy.contains(user.username);\n    cy.contains(user.name);\n    cy.contains(user.description);\n    cy.contains(user.website);\n    cy.get('[data-cy=\"thread-feed\"]').should('be.visible');\n    publicAuthoredThreads.forEach(thread => {\n      cy.contains(thread.content.title);\n    });\n  });\n\n  it('should list the public communities a user is a member of, including their rep in that community', () => {\n    cy.visit(`/users/${user.username}`);\n    cy.get('[data-cy=\"user-view\"]').should('be.visible');\n    const usersCommunities = data.usersCommunities.filter(\n      ({ userId }) => userId === user.id\n    );\n    const communityIds = usersCommunities.map(({ communityId }) => communityId);\n    const communities = data.communities.filter(\n      ({ id, isPrivate }) => communityIds.includes(id) && isPrivate !== true\n    );\n    communities.forEach(community => {\n      cy.contains(community.name);\n    });\n  });\n});\n"
  },
  {
    "path": "cypress/plugins/index.js",
    "content": "const browserify = require('@cypress/browserify-preprocessor');\n\nmodule.exports = (on, config) => {\n  const options = browserify.defaultOptions;\n  options.browserifyOptions.transform[1][1].presets.push('@babel/preset-flow');\n  on('file:preprocessor', browserify(options));\n};\n"
  },
  {
    "path": "cypress/support/commands.js",
    "content": "// ***********************************************\n// This example commands.js shows you how to\n// create various custom commands and overwrite\n// existing commands.\n//\n// For more comprehensive examples of custom\n// commands please read more here:\n// https://on.cypress.io/custom-commands\n// ***********************************************\nimport { encode } from '../../api/utils/base64';\nimport data from '../../shared/testing/data';\nconst getUser = userId => data.users.find(user => user.id === userId);\n\nCypress.Commands.add('auth', userId => {\n  const user = getUser(userId);\n\n  return cy.setCookie(\n    'session',\n    encode(JSON.stringify({ passport: { user: user.id } })),\n    {\n      httpOnly: true,\n      secure: false,\n    }\n  );\n});\n\nCypress.Commands.add('resetdb', () => {\n  cy.exec(\n    `node -e \"const teardown = require('./shared/testing/teardown.js')().then(() => process.exit())\"`\n  );\n  cy.exec(\n    `node -e \"const setup = require('./shared/testing/setup.js')().then(() => process.exit())\"`\n  );\n});\n\nCypress.Commands.overwrite('type', (originalFn, $elem, text, options) => {\n  const textarea = $elem[0];\n  // If it's a DraftJS editor, simulate text events\n  if (textarea.attributes.contenteditable) {\n    var textEvent = document.createEvent('TextEvent');\n    textEvent.initTextEvent('textInput', true, true, null, text);\n    textarea.dispatchEvent(textEvent);\n    return Promise.resolve($elem);\n    // Else just use the vanilla .type\n  } else {\n    return originalFn($elem, text, options);\n  }\n});\n"
  },
  {
    "path": "cypress/support/index.js",
    "content": "// ***********************************************************\n// This example support/index.js is processed and\n// loaded automatically before your test files.\n//\n// This is a great place to put global configuration and\n// behavior that modifies Cypress.\n//\n// You can change the location of this file or turn off\n// automatically serving support files with the\n// 'supportFile' configuration option.\n//\n// You can read more here:\n// https://on.cypress.io/configuration\n// ***********************************************************\n\n// Import commands.js using ES2015 syntax:\nimport './commands';\nrequire('cypress-plugin-retries');\n\nbefore(() => {\n  cy.resetdb();\n  cy.clearLocalStorage();\n  cy.clearCookies();\n});\n\nbeforeEach(() => {\n  cy.resetdb();\n  cy.clearLocalStorage();\n  cy.clearCookies();\n});\n"
  },
  {
    "path": "cypress.json",
    "content": "{\n  \"baseUrl\": \"http://localhost:3000\",\n  \"viewportWidth\": 1300,\n  \"defaultCommandTimeout\": 20000,\n  \"env\": {\n    \"DEBUG\": \"src*,testing*,build*\"\n  },\n  \"projectId\": \"6a92uk\"\n}"
  },
  {
    "path": "docker/Dockerfile.api",
    "content": "# Base builder\n#\n#\nFROM node:12 AS builder\nWORKDIR /usr/src/spectrum\nCOPY package.json yarn.lock ./\nRUN yarn\nCOPY . .\n\n# API builder\n#\n#\nFROM builder AS builder-api\nWORKDIR /usr/src/spectrum\nRUN yarn --cwd ./api\nRUN yarn run build:api\nRUN cp -r ./api/node_modules ./build-api\n\n# API image\n#\n#\nFROM node:12 AS api\nCOPY --from=builder-api /usr/src/spectrum/build-api /usr/src/api\nWORKDIR /usr/src/api\nCMD [\"yarn\", \"run\", \"start\"]\n"
  },
  {
    "path": "docker/Dockerfile.hyperion",
    "content": "FROM node:12 AS builder\nWORKDIR /usr/src/spectrum\nCOPY package.json yarn.lock ./\nRUN yarn\nCOPY . .\n\nFROM builder AS builder-hyperion\nRUN yarn --cwd ./hyperion\nRUN yarn run build:hyperion\nRUN yarn --cwd ./build-hyperion\n\nFROM node:12 AS hyperion\nCOPY --from=builder-hyperion /usr/src/spectrum/build-hyperion /usr/src/spectrum-hyperion\nWORKDIR /usr/src/spectrum-hyperion\nCMD [\"yarn\", \"run\", \"start\"]\n"
  },
  {
    "path": "docs/admin/intro.md",
    "content": "[Table of contents](../readme.md)\n\n# Admin\n\nThis directory runs an internal application for viewing core metrics on the platform. While it can be built and run locally, we don't encourage contributors to spend much time here as the dashboard itself will only ever be used internally by the Spectrum team. The code can of course be reviewed for those interested to see what kind of numbers and tools are accessible to our team."
  },
  {
    "path": "docs/api/graphql/fragments.md",
    "content": "[Table of contents](../../readme.md) / [API](../intro.md) / [GraphQL](./intro.md)\n\n# Fragments\n\nFragments help us to always know exactly what kind of data will be returned for a given query and ensure that we are consistent in what data should be returned to any given component.\n\nImagine we wrote two queries like this:\n\n```\n# query 1\nuser {\n  uid\n  displayName\n}\n\n# query 2\nuser {\n  uid\n  username\n}\n```\n\nIf these queries get implemented in different places, for different components, we're going to end up with a confusing mess where we never really know what information we have access to when writing our react components. We might accidentally write `{ user.username }` expecting that data to exist, but alas we wrote the featuring using query 1. Oops.\n\nFragments are an important part of how we query our GraphQL API from the frontend and you'll be using them constantly.\n\n## Example\n\nHere's a real-life example of how you would use fragments to query our API:\n\n```js\nimport { gql } from 'react-apollo';\n\nexport const userInfoFragment = gql`\n  fragment userInfo on User {\n    uid\n    photoURL\n    displayName\n    username\n  }\n`;\n```\n\nAnd here's how that would look in a query file:\n\n```js\nconst getUser = gql`\n  query getUser($username: String, $after: String) {\n    user(username: $username) {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n```\n\nBy using this fragment, we can always ensure we're getting back the data we need and start to build up an internal mental model of what data we have access to regardless of where we're working in the app.\n\nThis is especially useful for when we want to handle some pagination logic. We can just use a fragment to both a) save ourselves the hassle of writing a big query and 2) ensure we haven't forgotten a key field (like `cursor`) during implementation. Like this:\n\n```js\nexport const userCommunitiesFragment = gql`\n  fragment userCommunities on User {\n    communityConnection {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        node {\n          ...communityInfo\n        }\n      }\n    }\n  }\n  ${communityInfoFragment}\n`;\n```\n\nNotice there that we're using a sub-fragment to get the `communityInfo`, too!\n\nThat looks like:\n\n```js\nexport const communityInfoFragment = gql`\n  fragment communityInfo on Community {\n    id\n    name\n    slug\n  }\n`;\n```\n\nAnd now we've saved ourselves time, and ensured that we will always have access to critical data about the communities, even if we are writing a query against the user.\n\n## Structure\n\n![screenshot 2017-05-02 17 06 31](https://cloud.githubusercontent.com/assets/1923260/25644273/b6ac5daa-2f59-11e7-916d-2f985fff6237.png)\n\nThe reason these fragments are so obnoxiously granular is because there are times when you might have circular fragment requirements, which don't play well with webpack at the moment. For example, a user might require a story, which might require a user. So the files are importing each other and it breaks.\n\nTo solve this I've made super granular fragments in individual files. I've found it's somewhat useful from a naming convention point of view, and makes it super clear when importing files and actually using the fragments in a query.\n\n## Performance notes\n\nFragments make it tempting to create really deep queries, but that's a bad idea for performance reasons. Therefore, fragments themselves should be as shallow as possible to combat this, ideally never going more than one level of resources deep. (`story.id` and `story.content.title` are great, `story.community.channels.stories` not so much)\n\nWhen writing the fragments + queries, I tried to think to myself:\n***If I were using this fragment, what data would I absolutely expect to be returned?***\n\nFor example, the `storyInfo` fragment looks like:\n```js\nimport { gql } from 'react-apollo';\nimport { userInfoFragment } from '../user/userInfo';\n\nexport const storyInfoFragment = gql`\n  fragment storyInfo on Story {\n    id\n    messageCount\n    createdAt\n    modifiedAt\n    published\n    deleted\n    locked\n    content {\n      title\n      description\n    }\n    author {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n```\n\nI included the `author` and `...userInfo` fragment on `storyInfo` because I can't think of a single use case we have where we'd want to show a story *without* the author info. However, note that I didn't include any information about the channel this story was posted under. That's because if I'm *viewing that channel* it would be a massively underperforming query to also include channel data with *each story*.\n\nSo instead, if I *do* need the channel data for a story, I add that at the query layer:\n\n```js\nconst getStory = gql`\n  query getStory($id: String) {\n    ...storyInfo\n    channel {\n      ...frequencyInfo\n    }\n  }\n  ${storyInfoFragment}\n  ${frequencyInfoFragment}\n`;\n```\n"
  },
  {
    "path": "docs/api/graphql/intro.md",
    "content": "[Table of contents](../../readme.md) / [API](../intro.md)\r\n\r\n# GraphQL Intro\r\n\r\nWe use [`graphql-tools`](http://dev.apollodata.com/tools/graphql-tools/index.html) which lets us use the GraphQL schema language to design our schema. This schema written in the schema language is then combined with our resolvers (which live somewhere else) using `graphql-tools`, which outputs our finished schema that's then used.\r\n\r\n### Folder Setup\r\n\r\nThis folder setup was inspired by a bunch of open (and some closed) source projects @mxstbr looked at before embarking on the journey of building this. It seems to work well, even for big projects, but nothing here is set in stone and we're always open for new ideas and discussions.\r\n\r\nThis is the current folder structure annotated:\r\n\r\n```sh\r\napi/\r\n├── migrations     # Migrations for seeding the database with some initial data\r\n├── models         # Handle talking to the database\r\n├── mutations      # Mutation     resolvers\r\n├── queries        # Query        resolvers\r\n├── subscriptions  # Subscription resolvers\r\n├── types          # The schema, split up into many smaller parts\r\n│   └── scalars.js # The custom scalars we use in our schema and their resolvers\r\n├── README.md\r\n├── index.js       # Runs the actual servers (GraphQL + WebSocket for subscriptions)\r\n└── schema.js      # Combines the types from types/ and the resolvers together with graphql-tools\r\n```\r\n\r\nLearn more about:\r\n- [Fragments](fragments.md)\r\n- [Pagination](pagination.md)\r\n- [Testing](testing.md)\r\n- [Tips & Tricks](tips-and-tricks.md)"
  },
  {
    "path": "docs/api/graphql/pagination.md",
    "content": "[Table of contents](../../readme.md) / [API](../intro.md) / [GraphQL](./intro.md)\r\n\r\n# Pagination with GraphQL\r\n\r\nEven though there is no specific built-in way to paginate GraphQL queries there is a quasi-standard that most people (including us) follow called [Relay Connections Specification](https://facebook.github.io/relay/graphql/connections.htm). Rather than reading a spec that might not help you in pratical applications we recommend reading these two article to get a grasp of the why and how:\r\n\r\n- [Understanding pagination: REST, GraphQL and Relay](https://dev-blog.apollodata.com/understanding-pagination-rest-graphql-and-relay-b10f835549e7): Get a sense of the issues we're facing with the app and how to solve them\r\n- [Explaining GraphQL Connections](https://dev-blog.apollodata.com/explaining-graphql-connections-c48b7c3d6976): We follow this specific structure to the dot. (with one tiny change in naming)\r\n\r\n## TL;DR\r\n\r\nThe TL;DR of how to use it is:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the messages of a certain thread\r\n    messageConnection {\r\n      pageInfo {\r\n        # Do we have another page to fetch after this\r\n        hasNextPage\r\n      }\r\n      edges {\r\n        # Pass the cursor of the last message to messageConnections\r\n        # to fetch the next page\r\n        cursor\r\n        # The actual message:\r\n        node {\r\n          id\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nThis query would get the first 10 (or less if there's less in total) messages of that thread. To get the next page you have to take the `cursor` of the last message edge and pass that to messageConnections:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the next messages after the last message in the thread\r\n    messageConnection(after: $lastMessageCursor) {\r\n      edges {\r\n        node {\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> Note: The cursor is an opaque data structure, meaning it might refer to something you understand or it might not. It's also not promised to be consistent, especially between sessions, resources, etc. This boils down to **do not use the cursor for anything other than passing it to the query for the next page**, no matter if you want to use it for something else.\r\n\r\nTo specify how many messages you want to load use the `first` parameter:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the first 5 messages after the last message\r\n    messageConnection(first: 5, after: $lastMessageCursor) {\r\n      edges {\r\n        node {\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> Note: The default for `first` is normally 10, but might be changed depending on the resource being fetched. Make sure to check GraphiQL/the types to figure out what the default is.\r\n\r\n## Naming conventions\r\n\r\nConnections and edges have standard names and structures across all resources:\r\n\r\n```GraphQL\r\n# A connection of a story to messages\r\ntype StoryMessagesConnection {\r\n  pageInfo: PageInfo!\r\n  edges: [StoryMessageEdge!]\r\n}\r\n\r\n# An edge from a story to a message\r\ntype StoryMessageEdge {\r\n  cursor: String!\r\n  node: Message!\r\n}\r\n\r\ntype Story {\r\n  messageConnection(first: Int = 10, after: String): StoryMessagesConnection!\r\n}\r\n```\r\n\r\n> Note: This is where we diverge slightly from the article linked above, it recommends naming your edges in plural (`StoryMessagesEdge`) to make it consistent with the connection but we've found that the singular (`StoryMessageEdge`) makes it clear only a single resource is being fetched and think that's more important.\r\n"
  },
  {
    "path": "docs/api/graphql/testing.md",
    "content": "[Table of contents](../../readme.md) / [API](../intro.md) / [GraphQL](./intro.md)\r\n\r\n# Testing\r\n\r\nWe use [Jest](https://facebook.github.io/jest/) for testing. (we recommend reading through the documentation, since it has a lot of great features you might not expect) Most of our tests are \"e2e\". That's in quotes because with GraphQL \"e2e\" tests don't do any network request, they still hit our database though and all that. (which is awesome since it's much faster!)\r\n\r\nWe create a separate database for testing (called `\"testing\"`, surprisingly) that gets populated with some test data that we then verify against. A typical test suite for a certain type might look like this:\r\n\r\n```javascript\r\nimport { graphql } from 'graphql';\r\nimport createLoaders from '../loaders';\r\nimport schema from '../schema';\r\n\r\n// Nice little helper function for tests\r\nconst request = query =>\r\n  graphql(schema, query, undefined, { loaders: createLoaders() });\r\n\r\ndescribe('queries', () => {\r\n  it('should fetch a user', () => {\r\n    // Define your query\r\n    const query = /* GraphQL */ `\r\n      {\r\n        user(id: \"gVk5mYwccUOEKiN5vtOouqroGKo1\") {\r\n          name\r\n          username\r\n          profilePhoto\r\n        }\r\n      }\r\n    `;\r\n\r\n    // Make sure the assertion below is called and we don't run into a race condition\r\n    expect.assertions(1);\r\n    // Return the Promise returned from the request\r\n    return request(query).then(result => {\r\n      // Use Jest snapshot testing for neater tests and easier diffs\r\n      expect(result).toMatchSnapshot();\r\n    });\r\n  });\r\n})\r\n```\r\n"
  },
  {
    "path": "docs/api/graphql/tips-and-tricks.md",
    "content": "[Table of contents](../../readme.md) / [API](../intro.md) / [GraphQL](./intro.md)\r\n\r\n# Tips and Tricks\r\n\r\n## Keep resolvers as small as possible\r\n\r\nWhat we mean by this is that resolvers should (for the most part) only be a mapping between a certain path and the model function that takes care of it. Make sure the least amount of business logic possible lives in resolvers. (these are reminiscent of Controllers in a traditional MVC setup)\r\n\r\n## Error management\r\n\r\nWe mask internal errors in production. (GraphQL schema errors are still visible of course) Instead of seeing \"Database limit exceeded, please upgrade your account xyz.\", the user only sees \"Internal Error: asdf123-asdf-asdf-asdf1235\" (where `\"asdf123-asdf-asdf-asdf1235\"` is the Sentry UUID that helps us reference that error to a stacktrace on Sentry) which means no sensitive information is leaked.\r\n\r\nSometimes you want to show the user an error though, for example for permissions. In that case you have to use the `UserError` util, which will not be masked:\r\n\r\n```javascript\r\nimport UserError from '../utils/UserError';\r\n\r\n// The user will see this full error message\r\nreturn new UserError('You do not have permission to access this!')\r\n```\r\n"
  },
  {
    "path": "docs/api/intro.md",
    "content": "[Table of contents](../readme.md)\n\n# API\n\nThe Spectrum API is a Node.js web server based on Express.js and GraphQL. It's also houses a websocket server for all of our subscription needs.\n\n## Structure\n\nThis server follows a GraphQL-first philosophy. That means we design the GraphQL schema first and then start implementing business logic. This is great because it gives us a clear separation of concerns (business logic vs. schema), and it's how Facebook recommends to use GraphQL.\n\n## GraphQL\n- [Intro](graphql/intro.md)\n  - [Fragments](graphql/fragments.md)\n  - [Pagination](graphql/pagination.md)\n  - [Testing](graphql/testing.md)\n  - [Tips & Tricks](graphql/tips-and-tricks.md)"
  },
  {
    "path": "docs/backend/api/README.md",
    "content": "# `api`: The web server\r\n\r\nAPI is a Node.js web server based on Express.js and GraphQL. It's also houses a websocket server for all of our subscription needs.\r\n\r\n## Structure\r\n\r\nThis server follows a GraphQL-first philosophy. That means we design the GraphQL schema first and then start implementing business logic. This is great because it gives us a clear separation of concerns (business logic vs. schema), and it's how Facebook recommends to use GraphQL.\r\n\r\nWe use [`graphql-tools`](http://dev.apollodata.com/tools/graphql-tools/index.html) which lets us use the GraphQL schema language to design our schema. This schema written in the schema language is then combined with our resolvers (which live somewhere else) using `graphql-tools`, which outputs our finished schema that's then used.\r\n\r\n### Folder Setup\r\n\r\nThis folder setup was inspired by a bunch of open (and some closed) source projects @mxstbr looked at before embarking on the journey of building this. It seems to work well, even for big projects, but nothing here is set in stone and we're always open for new ideas and discussions.\r\n\r\nThis is the current folder structure annotated:\r\n\r\n```sh\r\nserver/\r\n├── migrations     # Migrations for seeding the database with some initial data\r\n├── models         # Handle talking to the database\r\n├── mutations      # Mutation     resolvers\r\n├── queries        # Query        resolvers\r\n├── subscriptions  # Subscription resolvers\r\n├── types          # The schema, split up into many smaller parts\r\n│   └── scalars.js # The custom scalars we use in our schema and their resolvers\r\n├── README.md\r\n├── index.js       # Runs the actual servers (GraphQL + WebSocket for subscriptions)\r\n└── schema.js      # Combines the types from types/ and the resolvers together with graphql-tools\r\n```\r\n"
  },
  {
    "path": "docs/backend/api/fragments.md",
    "content": "# Fragments\n\nFragments help us to always know exactly what kind of data will be returned for a given query and ensure that we are consistent in what data should be returned to any given component.\n\nImagine we wrote two queries like this:\n\n```\n# query 1\nuser {\n  uid\n  displayName\n}\n\n# query 2\nuser {\n  uid\n  username\n}\n```\n\nIf these queries get implemented in different places, for different components, we're going to end up with a confusing mess where we never really know what information we have access to when writing our react components. We might accidentally write `{ user.username }` expecting that data to exist, but alas we wrote the featuring using query 1. Oops.\n\nFragments are an important part of how we query our GraphQL API from the frontend and you'll be using them constantly.\n\n## Example\n\nHere's a real-life example of how you would use fragments to query our API:\n\n```js\nimport { gql } from 'react-apollo';\n\nexport const userInfoFragment = gql`\n  fragment userInfo on User {\n    uid\n    photoURL\n    displayName\n    username\n  }\n`;\n```\n\nAnd here's how that would look in a query file:\n\n```js\nconst getUser = gql`\n  query getUser($username: String, $after: String) {\n    user(username: $username) {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n```\n\nBy using this fragment, we can always ensure we're getting back the data we need and start to build up an internal mental model of what data we have access to regardless of where we're working in the app.\n\nThis is especially useful for when we want to handle some pagination logic. We can just use a fragment to both a) save ourselves the hassle of writing a big query and 2) ensure we haven't forgotten a key field (like `cursor`) during implementation. Like this:\n\n```js\nexport const userCommunitiesFragment = gql`\n  fragment userCommunities on User {\n    communityConnection {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        node {\n          ...communityInfo\n        }\n      }\n    }\n  }\n  ${communityInfoFragment}\n`;\n```\n\nNotice there that we're using a sub-fragment to get the `communityInfo`, too!\n\nThat looks like:\n\n```js\nexport const communityInfoFragment = gql`\n  fragment communityInfo on Community {\n    id\n    name\n    slug\n  }\n`;\n```\n\nAnd now we've saved ourselves time, and ensured that we will always have access to critical data about the communities, even if we are writing a query against the user.\n\n## Structure\n\n![screenshot 2017-05-02 17 06 31](https://cloud.githubusercontent.com/assets/1923260/25644273/b6ac5daa-2f59-11e7-916d-2f985fff6237.png)\n\nThe reason these fragments are so obnoxiously granular is because there are times when you might have circular fragment requirements, which don't play well with webpack at the moment. For example, a user might require a story, which might require a user. So the files are importing each other and it breaks.\n\nTo solve this I've made super granular fragments in individual files. I've found it's somewhat useful from a naming convention point of view, and makes it super clear when importing files and actually using the fragments in a query.\n\n## Performance notes\n\nFragments make it tempting to create really deep queries, but that's a bad idea for performance reasons. Therefore, fragments themselves should be as shallow as possible to combat this, ideally never going more than one level of resources deep. (`story.id` and `story.content.title` are great, `story.community.channels.stories` not so much)\n\nWhen writing the fragments + queries, I tried to think to myself:\n***If I were using this fragment, what data would I absolutely expect to be returned?***\n\nFor example, the `storyInfo` fragment looks like:\n```js\nimport { gql } from 'react-apollo';\nimport { userInfoFragment } from '../user/userInfo';\n\nexport const storyInfoFragment = gql`\n  fragment storyInfo on Story {\n    id\n    messageCount\n    createdAt\n    modifiedAt\n    published\n    deleted\n    locked\n    content {\n      title\n      description\n    }\n    author {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n```\n\nI included the `author` and `...userInfo` fragment on `storyInfo` because I can't think of a single use case we have where we'd want to show a story *without* the author info. However, note that I didn't include any information about the channel this story was posted under. That's because if I'm *viewing that channel* it would be a massively underperforming query to also include channel data with *each story*.\n\nSo instead, if I *do* need the channel data for a story, I add that at the query layer:\n\n```js\nconst getStory = gql`\n  query getStory($id: String) {\n    ...storyInfo\n    channel {\n      ...frequencyInfo\n    }\n  }\n  ${userInfoFragment}\n  ${frequencyInfoFragment}\n`;\n```\n"
  },
  {
    "path": "docs/backend/api/pagination.md",
    "content": "# Pagination with GraphQL\r\n\r\nEven though there is no specific built-in way to paginate GraphQL queries there is a quasi-standard that most people (including us) follow called [Relay Connections Specification](https://facebook.github.io/relay/graphql/connections.htm). Rather than reading a spec that might not help you in pratical applications we recommend reading these two article to get a grasp of the why and how:\r\n\r\n- [Understanding pagination: REST, GraphQL and Relay](https://dev-blog.apollodata.com/understanding-pagination-rest-graphql-and-relay-b10f835549e7): Get a sense of the issues we're facing with the app and how to solve them\r\n- [Explaining GraphQL Connections](https://dev-blog.apollodata.com/explaining-graphql-connections-c48b7c3d6976): We follow this specific structure to the dot. (with one tiny change in naming)\r\n\r\n## TL;DR\r\n\r\nThe TL;DR of how to use it is:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the messages of a certain thread\r\n    messageConnection {\r\n      pageInfo {\r\n        # Do we have another page to fetch after this\r\n        hasNextPage\r\n      }\r\n      edges {\r\n        # Pass the cursor of the last message to messageConnections\r\n        # to fetch the next page\r\n        cursor\r\n        # The actual message:\r\n        node {\r\n          id\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nThis query would get the first 10 (or less if there's less in total) messages of that thread. To get the next page you have to take the `cursor` of the last message edge and pass that to messageConnections:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the next messages after the last message in the thread\r\n    messageConnection(after: $lastMessageCursor) {\r\n      edges {\r\n        node {\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> Note: The cursor is an opaque data structure, meaning it might refer to something you understand or it might not. It's also not promised to be consistent, especially between sessions, resources, etc. This boils down to **do not use the cursor for anything other than passing it to the query for the next page**, no matter if you want to use it for something else.\r\n\r\nTo specify how many messages you want to load use the `first` parameter:\r\n\r\n```GraphQL\r\n{\r\n  thread(id: \"some-thread-id\") {\r\n    # Fetch the first 5 messages after the last message\r\n    messageConnection(first: 5, after: $lastMessageCursor) {\r\n      edges {\r\n        node {\r\n          message {\r\n            content\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n> Note: The default for `first` is normally 10, but might be changed depending on the resource being fetched. Make sure to check GraphiQL/the types to figure out what the default is.\r\n\r\n## Naming conventions\r\n\r\nConnections and edges have standard names and structures across all resources:\r\n\r\n```GraphQL\r\n# A connection of a story to messages\r\ntype StoryMessagesConnection {\r\n  pageInfo: PageInfo!\r\n  edges: [StoryMessageEdge!]\r\n}\r\n\r\n# An edge from a story to a message\r\ntype StoryMessageEdge {\r\n  cursor: String!\r\n  node: Message!\r\n}\r\n\r\ntype Story {\r\n  messageConnection(first: Int = 10, after: String): StoryMessagesConnection!\r\n}\r\n```\r\n\r\n> Note: This is where we diverge slightly from the article linked above, it recommends naming your edges in plural (`StoryMessagesEdge`) to make it consistent with the connection but we've found that the singular (`StoryMessageEdge`) makes it clear only a single resource is being fetched and think that's more important.\r\n"
  },
  {
    "path": "docs/backend/api/testing.md",
    "content": "# Testing\r\n\r\nWe use [Jest](https://facebook.github.io/jest/) for testing. (we recommend reading through the documentation, since it has a lot of great features you might not expect) Most of our tests are \"e2e\". That's in quotes because with GraphQL \"e2e\" tests don't do any network request, they still hit our database though and all that. (which is awesome since it's much faster!)\r\n\r\nWe create a separate database for testing (called `\"testing\"`, surprisingly) that gets populated with some test data that we then verify against. A typical test suite for a certain type might look like this:\r\n\r\n```javascript\r\nimport { graphql } from 'graphql';\r\nimport createLoaders from '../loaders';\r\nimport schema from '../schema';\r\n\r\n// Nice little helper function for tests\r\nconst request = query =>\r\n  graphql(schema, query, undefined, { loaders: createLoaders() });\r\n\r\ndescribe('queries', () => {\r\n  it('should fetch a user', () => {\r\n    // Define your query\r\n    const query = /* GraphQL */ `\r\n      {\r\n        user(id: \"gVk5mYwccUOEKiN5vtOouqroGKo1\") {\r\n          name\r\n          username\r\n          profilePhoto\r\n        }\r\n      }\r\n    `;\r\n\r\n    // Make sure the assertion below is called and we don't run into a race condition\r\n    expect.assertions(1);\r\n    // Return the Promise returned from the request\r\n    return request(query).then(result => {\r\n      // Use Jest snapshot testing for neater tests and easier diffs\r\n      expect(result).toMatchSnapshot();\r\n    });\r\n  });\r\n})\r\n```\r\n"
  },
  {
    "path": "docs/backend/api/tips-and-tricks.md",
    "content": "# Tips and Tricks\r\n\r\n## Keep resolvers as small as possible\r\n\r\nWhat we mean by this is that resolvers should (for the most part) only be a mapping between a certain path and the model function that takes care of it. Make sure the least amount of business logic possible lives in resolvers. (these are reminiscent of Controllers in a traditional MVC setup)\r\n\r\n## Error management\r\n\r\nWe mask internal errors in production. (GraphQL schema errors are still visible of course) Instead of seeing \"Database limit exceeded, please upgrade your account xyz.\", the user only sees \"Internal Error: asdf123-asdf-asdf-asdf1235\" (where `\"asdf123-asdf-asdf-asdf1235\"` is the Sentry UUID that helps us reference that error to a stacktrace on Sentry) which means no sensitive information is leaked.\r\n\r\nSometimes you want to show the user an error though, for example for permissions. In that case you have to use the `UserError` util, which will not be masked:\r\n\r\n```javascript\r\nimport UserError from '../utils/UserError';\r\n\r\n// The user will see this full error message\r\nreturn new UserError('You do not have permission to access this!')\r\n```\r\n"
  },
  {
    "path": "docs/deployments.md",
    "content": "[Table of contents](./readme.md)\n\n# Deployments\n\nWe use [`now`](https://now.sh) by Vercel for all of our deployments.\n\n### Installation\n\nWe recommend installing the [now desktop app](http://vercel.co/download) as it'll keep the command line tool up to date automatically!\n\nIf you'd rather not install an app (or are using Windows Substem for Linux) you can also install now with npm:\n\n```\nnpm install -g now\n```\n\n### Naming scheme\n\nAll our workers are aliased to `<workername>.workers.spectrum.chat`, with the one exception being the API (the API server) which runs at `api.spectrum.chat`.\n\n#### Path aliases\n\n[Now's path alias feature](https://vercel.co/docs/features/path-aliases) takes care of routing requests to the right workers. To see our current production aliases check the `rules.json` file in the root of the project.\n\nTo deploy new rules, simply run the following command: (assuming `rules.json` has the changes)\n\n```sh\nnow alias spectrum.chat -r rules.json\n```\n\nThe same command with a different URL and slightly adapted rules can also be used to create an alpha/beta/staging/... version of the site.\n\n### Frontend and Hyperion\n\nSince the frontend is the part that changes the most often the repo is set up such that typing `now` in the root directory will deploy the frontend with hyperion. (the server-side rendering worker)\n\n#### Deploying\n\nFirst, make sure you're in the Space Program `now` team:\n\n```\nnow switch spaceprogram\n```\n\n> Note: If you haven't been added to the now team yet ask one of your coworkers to add you!\n\nSecond, deploy a new version of the app:\n\n```\nnow\n```\n\nThis will do an _immutable deploy_ of the hyperion and will return a unique URL that this specific version is accessible at. (something like `spectrum-grtertb34.now.sh`)\n\nThird, test that version of the app to make sure the new feature(s) work(s) as expected in production. Note that nobody except for people will access to the unique URL from the last step can access it at this point.\n\nFourth, if you're happy with the new feature(s) alias your unique URL to `hyperion.workers.spectrum.chat` to make it immediately available to all users:\n\n```\nnow alias spectrum-grtertb34.now.sh hyperion.workers.spectrum.chat\n```\n\nAnd that's it, you've now deployed a new version of hyperion and the frontend!\n\n### Other workers\n\nWe use [`backpack`](https://github.com/palmerhq/backpack) to get a nice development setup and build process in place for our workers. Since this is a mono-repo and `now` doesn't have any special functionality to handle monorepos we have to deploy the _built_ version of the workers. (compared to the frontend deploy where you deploy the raw code which gets built on the server)\n\n#### Deploying\n\nFirst, build the worker you want to deploy to get a bundle with the newest code rather than deploying a stale version:\n\n```sh\nyarn run build:<workername>\n```\n\n> Note: Replace `<workername>` with the name of the worker you want to deploy\n\nThen deploy the `build-<workername>` folder with `now`:\n\n```sh\nnow build-<workername>\n```\n\nAs an example, to deploy `athena` I'd run these commands:\n\n```sh\n# First:  Build the worker\nyarn run build:athena\n# Second: Deploy the built bundle\nnow build-athena\n```\n\nThis will give you an immutable deploy with a unique URL of this worker, something like `https://build-athena-ahsgut23sdyf.now.sh`.\n\n#### Replacing the old deploy\n\nSince we want to keep the workers alive even if nobody sends a request to their healthcheck endpoints we alias them to `<workername>.workers.spectrum.chat`. This ensures `now` overrides the older deploy and only the newest code is running.\n\nTo alias your deploy run `now alias`:\n\n```sh\nnow alias <uniqueurl>.now.sh <workername>.workers.spectrum.chat\n```\n\nFor example, for our `athena` deploy from above this would be:\n\n```sh\nnow alias build-athena-ahsgut23sdyf.now.sh athena.workers.spectrum.chat\n```\n"
  },
  {
    "path": "docs/hyperion (server side rendering)/development.md",
    "content": "[Table of contents](../readme.md) / [Hyperion](./intro.md)\n\n# Hyperion development\n\n### Normal development workflow\n\nWhen you develop Spectrum you're running two processes, `yarn run dev:web` for the frontend and `yarn run dev:api` for API, the GraphQL API. This means in your browser you access `localhost:3000`, which is a fully client-side React app, and that then fetches data from `localhost:3001/api`.\n\nIn production, the client-side app is bundled and server-side rendered by Hyperion.\n\nThis means we get the best development experience locally with hot module reloading etc, and in production we have single server responsible for serving files, rendering and the API.\n\n### When developing SSR \n\n**DO NOT USE THIS UNLESS YOU'RE DEVELOPING SSR**\n\nTo test server-side rendering locally run the client and the API locally, and then start Hyperion with `yarn run dev:hyperion`. Open Hyperion's URL, `http://localhost:3006` (instead of `:3000`), which will request the server-side rendered HTML from Hyperion rather than `webpack-dev-server`.\n\nThe downside is that when you're testing SSR and changing the frontend those changes won't be reflected immediately. To get changes from the frontend when you're requesting `localhost:3001` you have to:\n\n1. Stop the `yarn run dev:web` process\n2. Run `yarn run dev:web`\n3. Wait for the first compilation to complete\n4. Restart the `yarn run dev:hyperion` process by stopping and then starting it again\n\n## When doing all other client development\n\nJust stick to the normal workflow of `yarn run dev:web` and enjoy the hot reloading at `localhost:3000`!\n"
  },
  {
    "path": "docs/hyperion (server side rendering)/intro.md",
    "content": "[Table of contents](../readme.md)\n\n# Hyperion\n\n*Hyperion: (/haɪˈpɪəriən/) is one of the twelve Titan children of Gaia and Uranus.*\n\nHyperion is the server responsible for server-side rendering the front end. In production, Hyperion does an initial render of a requested view on the server and responds with static HTML. The static HTML is then rehydrated with our JS bundle.\n\nLearn more about [development with Hyperion](development.md)\n\n"
  },
  {
    "path": "docs/operations/hourly-backups.md",
    "content": "# Hourly Off-site Backups\n\nIn order to avoid more data loss we implemented hourly off-site backups in [#5150](https://github.com/withspectrum/spectrum/pull/5150). While the implementation is simple, it should cover us well enough.\n\nIt works by running two cron jobs:\n\n1. Runs at 30 minutes past every hour and triggers an \"on-demand backup\" with our database host (Compose)\n2. Runs at 0 minutes past every hour, fetches the latest \"on-demand backup\" from our database host and uploads it to our S3 bucket\n\nTo access the latest hourly backup you can either go to the Compose dashboard (app.compose.com), navigate to the RethinkDB deployment and download the newest on-demand backup, or open our S3 bucket and download the latest one from there.\n"
  },
  {
    "path": "docs/operations/importing-rethinkdb-backups.md",
    "content": "[Table of contents](../readme.md) / [Operations](./index.md)\n\n# Importing production data locally\n\nSometimes it's useful to have production data running locally in rethinkdb for debugging and testing. To get production data running locally, follow these steps:\n\n1. Go to http://localhost:8080/#tables and delete the local 'spectrum' table\n2. Log in to the Space Program AWS console\n3. Go to S3 > Spectrum Backups > Hourly\n4. Download the latest backup .tar.gz\n5. Unzip that backup onto your desktop\n6. Rename the unzipped directory to 'prod-backup'\n6. In your terminal, run: `cd ~/Desktop && rethinkdb import -d prod-backup`\n7. The import will take a couple hours, at which point you can clear localstorage at localhost:3000 to re-authenticate\n"
  },
  {
    "path": "docs/operations/intro.md",
    "content": "# Operations\n\nThis directory is for docs related to operating the Spectrum platform. Common questions about how to perform non-code-related tasks should go here.\n\nLearn more about:\n- [Banning users](banning-users.md)\n- [Deleting users](deleting-users.md)\n- [Importing a RethinkDB backup locally](importing-rethinkdb-backups.md)"
  },
  {
    "path": "docs/readme.md",
    "content": "## Table of Contents\n\n- [Deployments](deployments.md)\n- [Admin](admin/intro.md)\n- [API](api/intro.md)\n  - [GraphQL](api/graphql/intro.md)\n    - [Fragments](api/graphql/fragments.md)\n    - [Pagination](api/graphql/pagination.md)\n    - [Testing](api/graphql/testing.md)\n    - [Tips & Tricks](api/graphql/tips-and-tricks.md)\n- [Hyperion (server side rendering)](<hyperion%20(server%20side%20rendering)/intro.md>)\n  - [Development](<hyperion%20(server%20side%20rendering)/development.md>)\n- [Operations](operations/intro.md)\n  - [Deleting users](operations/deleting-users.md)\n  - [Importing RethinkDB backups](operations/importing-rethinkdb-backups.md)\n- [Testing](testing/intro.md)\n  - [Integration](testing/integration.md)\n  - [Unit](testing/unit.md)\n- [Workers](workers/intro.md)\n  - [Background jobs with Redis](workers/background-jobs.md)\n"
  },
  {
    "path": "docs/testing/integration.md",
    "content": "[Table of contents](../readme.md) / [Testing](./intro.md)\n\n# Integration tests\n\nWe use [Cypress](https://cypress.io) to run our integration tests, which gives you a nice GUI that you can use for your test runs. To run integration tests you have to have the api running in production mode and connected to the test database and the client running.\n\n```sh\n# First, build the API\nyarn run build:api\n# Then, in one tab start the API in test mode\nyarn run start:api:test\n# In another tab start the web client\nyarn run dev:web\n```\n\nThen open the Cypress GUI and you're good to start running the integration tests:\n\n```sh\nyarn run cypress:open\n```\n\n### Writing integration tests\n\n**It is highly recommend to read the [Best Practices section of the Cypress docs](https://docs.cypress.io/guides/references/best-practices.html) before starting to write them!**\n\nAll our integration tests live in `cypress/integration/`. This is what a normal integration test might look like:\n\n```JS\n// cypress/integration/home_spec.js\ndescribe('Home View', () => {\n  before(() => {\n    cy.visit('/');\n  });\n\n  it('should render the home page', () => {\n    cy.get('[data-cy=\"home-page\"]').should('be.visible');\n    cy.get('[href*=\"/login\"]').should('be.visible');\n  });\n});\n```\n\nNote that while the Cypress API looks synchronous, it's actually totally asynchronous under the hood. They build up a queue of incoming assertions and wait for them to happen in order. While that's a bit confusing at the beginning, you get used to it very fast.\n\nAlso note that Cypress uses Mocha under the hood, where our unit tests use Jest. This means rather than `expect().toEqual()` you'd have to write `expect().to.equal()` due to the syntax difference between the `expect` implementations.\n\n### Test IDs\n\nTo verify that certain elements are or aren't on the page we use custom `data-cy` attributes. You render them from React like so:\n\n```JS\nclass HomePage extends Component {\n  render() {\n    return (\n      <Wrapper data-cy=\"home-page\">\n        {/*...*/}\n      </Wrapper>\n    )\n  }\n}\n```\n\nThen you can make sure the splash page rendered correctly by waiting for that selector to appear on the page:\n\n```JS\n// cypress/integration/home_spec.js\nit('should render', () => {\n  cy.get('[data-cy=\"home-page\"]').should('be.visible');\n});\n```\n\n"
  },
  {
    "path": "docs/testing/intro.md",
    "content": "[Table of contents](../readme.md)\n\n# Testing\n\nWe have a test suite consisting of a bunch of unit tests (mostly for the API) and integration tests to verify Spectrum keeps working as expected. The entire test suite is run in CI for every commit and PR, so if you introduce a breaking change the CI will fail and the PR will not be merge-able.\n\nLearn more about:\n- [Unit testing](./unit.md)\n- [Integration testing](./integration.md)\n\n"
  },
  {
    "path": "docs/testing/unit.md",
    "content": "[Table of contents](../readme.md) / [Testing](./intro.md)\n\n# Unit tests\n\nWe use [`Jest`](https://github.com/facebook/jest) for our unit testing needs. To run Jest in watch mode locally so the tests run automatically while you're developing run:\n\n```sh\nyarn run test\n```\n\nBefore running the tests this will set up a RethinkDB database locally called `\"testing\"`. It will run the migrations over it and then insert some dummy data. This is important because we test our GraphQL API against the real database, we don't mock anything, to make sure everything is working 100%.\n\nWhen you exit the testing process with `CTRL+C` it will clean the database from all its data. It leaves the migrations in tact though, since there's no reason we should have to run them everytime we run the test suite.\n\n### Stale data\n\nIn edge cases it could happen that you end up with bad data locally and that tests fail/pass even though they shouldn't. To get rid of the stale data just stop the testing process and optionally run `yarn run posttest` to make extra sure there's nothing in the database anymore, before restarting the testing process to start from a clean slate.\n"
  },
  {
    "path": "flow-typed/npm/@sendgrid/mail_vx.x.x.js",
    "content": "// flow-typed signature: 9853dc0239ef405daa7097373b292e98\n// flow-typed version: <<STUB>>/@sendgrid/mail_v6.3.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@sendgrid/mail'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@sendgrid/mail' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@sendgrid/mail/src/classes/mail-service' {\n  declare module.exports: any;\n}\n\ndeclare module '@sendgrid/mail/src/mail' {\n  declare module.exports: any;\n}\n\ndeclare module '@sendgrid/mail/src/mail.spec' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@sendgrid/mail/index' {\n  declare module.exports: $Exports<'@sendgrid/mail'>;\n}\ndeclare module '@sendgrid/mail/index.js' {\n  declare module.exports: $Exports<'@sendgrid/mail'>;\n}\ndeclare module '@sendgrid/mail/src/classes/mail-service.js' {\n  declare module.exports: $Exports<'@sendgrid/mail/src/classes/mail-service'>;\n}\ndeclare module '@sendgrid/mail/src/mail.js' {\n  declare module.exports: $Exports<'@sendgrid/mail/src/mail'>;\n}\ndeclare module '@sendgrid/mail/src/mail.spec.js' {\n  declare module.exports: $Exports<'@sendgrid/mail/src/mail.spec'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@tippy.js/react_vx.x.x.js",
    "content": "// flow-typed signature: d5a9ac3d3049496487995f00a345e5c8\n// flow-typed version: <<STUB>>/@tippy.js/react_v2.1.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@tippy.js/react'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@tippy.js/react' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@tippy.js/react/esm/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@tippy.js/react/esm/index.min' {\n  declare module.exports: any;\n}\n\ndeclare module '@tippy.js/react/umd/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@tippy.js/react/umd/index.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@tippy.js/react/esm/index.js' {\n  declare module.exports: $Exports<'@tippy.js/react/esm/index'>;\n}\ndeclare module '@tippy.js/react/esm/index.min.js' {\n  declare module.exports: $Exports<'@tippy.js/react/esm/index.min'>;\n}\ndeclare module '@tippy.js/react/umd/index.js' {\n  declare module.exports: $Exports<'@tippy.js/react/umd/index'>;\n}\ndeclare module '@tippy.js/react/umd/index.min.js' {\n  declare module.exports: $Exports<'@tippy.js/react/umd/index.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/curve_vx.x.x.js",
    "content": "// flow-typed signature: 8dca7087ee12bf0d7443f2a2ed53e8a5\n// flow-typed version: <<STUB>>/@vx/curve_v^0.0.127/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/curve'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/curve' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/curve/build/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/curve/build/index.js' {\n  declare module.exports: $Exports<'@vx/curve/build/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/event_vx.x.x.js",
    "content": "// flow-typed signature: 923c90a052a1b40ad9eadb023c489b00\n// flow-typed version: <<STUB>>/@vx/event_v^0.0.127/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/event'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/event' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/event/build/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/event/build/localPoint' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/event/build/index.js' {\n  declare module.exports: $Exports<'@vx/event/build/index'>;\n}\ndeclare module '@vx/event/build/localPoint.js' {\n  declare module.exports: $Exports<'@vx/event/build/localPoint'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/gradient_vx.x.x.js",
    "content": "// flow-typed signature: 8c5c7e282e820b67637f4ac2d760dec0\n// flow-typed version: <<STUB>>/@vx/gradient_v^0.0.129/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/gradient'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/gradient' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/gradient/build/gradients/DarkgreenGreen' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/LightgreenGreen' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/LinearGradient' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/OrangeRed' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/PinkBlue' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/PinkRed' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/PurpleOrange' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/PurpleRed' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/PurpleTeal' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/RadialGradient' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/SteelPurple' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/gradients/TealBlue' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/gradient/build/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/gradient/build/gradients/DarkgreenGreen.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/DarkgreenGreen'>;\n}\ndeclare module '@vx/gradient/build/gradients/LightgreenGreen.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/LightgreenGreen'>;\n}\ndeclare module '@vx/gradient/build/gradients/LinearGradient.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/LinearGradient'>;\n}\ndeclare module '@vx/gradient/build/gradients/OrangeRed.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/OrangeRed'>;\n}\ndeclare module '@vx/gradient/build/gradients/PinkBlue.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/PinkBlue'>;\n}\ndeclare module '@vx/gradient/build/gradients/PinkRed.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/PinkRed'>;\n}\ndeclare module '@vx/gradient/build/gradients/PurpleOrange.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/PurpleOrange'>;\n}\ndeclare module '@vx/gradient/build/gradients/PurpleRed.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/PurpleRed'>;\n}\ndeclare module '@vx/gradient/build/gradients/PurpleTeal.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/PurpleTeal'>;\n}\ndeclare module '@vx/gradient/build/gradients/RadialGradient.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/RadialGradient'>;\n}\ndeclare module '@vx/gradient/build/gradients/SteelPurple.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/SteelPurple'>;\n}\ndeclare module '@vx/gradient/build/gradients/TealBlue.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/gradients/TealBlue'>;\n}\ndeclare module '@vx/gradient/build/index.js' {\n  declare module.exports: $Exports<'@vx/gradient/build/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/grid_vx.x.x.js",
    "content": "// flow-typed signature: d5ba0ce5dc460f15e091aafd082ea665\n// flow-typed version: <<STUB>>/@vx/grid_v^0.0.131/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/grid'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/grid' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/grid/build/grids/Columns' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/grid/build/grids/Grid' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/grid/build/grids/Rows' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/grid/build/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/grid/build/grids/Columns.js' {\n  declare module.exports: $Exports<'@vx/grid/build/grids/Columns'>;\n}\ndeclare module '@vx/grid/build/grids/Grid.js' {\n  declare module.exports: $Exports<'@vx/grid/build/grids/Grid'>;\n}\ndeclare module '@vx/grid/build/grids/Rows.js' {\n  declare module.exports: $Exports<'@vx/grid/build/grids/Rows'>;\n}\ndeclare module '@vx/grid/build/index.js' {\n  declare module.exports: $Exports<'@vx/grid/build/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/scale_vx.x.x.js",
    "content": "// flow-typed signature: 7edbfdb1df2ceb969c0ba14d38a2fb5e\n// flow-typed version: <<STUB>>/@vx/scale_v^0.0.127/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/scale'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/scale' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/scale/build/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/band' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/color/schemeCategory10' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/color/schemeCategory20' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/color/schemeCategory20b' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/color/schemeCategory20c' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/linear' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/log' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/ordinal' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/point' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/power' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/quantile' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/quantize' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/threshold' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/time' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/scales/utc' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/scale/build/util/updateScale' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/scale/build/index.js' {\n  declare module.exports: $Exports<'@vx/scale/build/index'>;\n}\ndeclare module '@vx/scale/build/scales/band.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/band'>;\n}\ndeclare module '@vx/scale/build/scales/color/schemeCategory10.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/color/schemeCategory10'>;\n}\ndeclare module '@vx/scale/build/scales/color/schemeCategory20.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/color/schemeCategory20'>;\n}\ndeclare module '@vx/scale/build/scales/color/schemeCategory20b.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/color/schemeCategory20b'>;\n}\ndeclare module '@vx/scale/build/scales/color/schemeCategory20c.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/color/schemeCategory20c'>;\n}\ndeclare module '@vx/scale/build/scales/linear.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/linear'>;\n}\ndeclare module '@vx/scale/build/scales/log.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/log'>;\n}\ndeclare module '@vx/scale/build/scales/ordinal.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/ordinal'>;\n}\ndeclare module '@vx/scale/build/scales/point.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/point'>;\n}\ndeclare module '@vx/scale/build/scales/power.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/power'>;\n}\ndeclare module '@vx/scale/build/scales/quantile.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/quantile'>;\n}\ndeclare module '@vx/scale/build/scales/quantize.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/quantize'>;\n}\ndeclare module '@vx/scale/build/scales/threshold.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/threshold'>;\n}\ndeclare module '@vx/scale/build/scales/time.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/time'>;\n}\ndeclare module '@vx/scale/build/scales/utc.js' {\n  declare module.exports: $Exports<'@vx/scale/build/scales/utc'>;\n}\ndeclare module '@vx/scale/build/util/updateScale.js' {\n  declare module.exports: $Exports<'@vx/scale/build/util/updateScale'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/shape_vx.x.x.js",
    "content": "// flow-typed signature: 587b8a2a047b121646c3cecbe37d2d59\n// flow-typed version: <<STUB>>/@vx/shape_v^0.0.131/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/shape'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/shape' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/shape/build/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/Arc' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/AreaClosed' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/AreaStack' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/Bar' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/BarGroup' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/BarStack' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/Line' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/LinePath' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/LineRadial' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/LinkHorizontal' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/LinkRadial' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/LinkVertical' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/shapes/Stack' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/util/additionalProps' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/shape/build/util/callOrValue' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/shape/build/index.js' {\n  declare module.exports: $Exports<'@vx/shape/build/index'>;\n}\ndeclare module '@vx/shape/build/shapes/Arc.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/Arc'>;\n}\ndeclare module '@vx/shape/build/shapes/AreaClosed.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/AreaClosed'>;\n}\ndeclare module '@vx/shape/build/shapes/AreaStack.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/AreaStack'>;\n}\ndeclare module '@vx/shape/build/shapes/Bar.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/Bar'>;\n}\ndeclare module '@vx/shape/build/shapes/BarGroup.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/BarGroup'>;\n}\ndeclare module '@vx/shape/build/shapes/BarStack.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/BarStack'>;\n}\ndeclare module '@vx/shape/build/shapes/Line.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/Line'>;\n}\ndeclare module '@vx/shape/build/shapes/LinePath.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/LinePath'>;\n}\ndeclare module '@vx/shape/build/shapes/LineRadial.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/LineRadial'>;\n}\ndeclare module '@vx/shape/build/shapes/LinkHorizontal.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/LinkHorizontal'>;\n}\ndeclare module '@vx/shape/build/shapes/LinkRadial.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/LinkRadial'>;\n}\ndeclare module '@vx/shape/build/shapes/LinkVertical.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/LinkVertical'>;\n}\ndeclare module '@vx/shape/build/shapes/Stack.js' {\n  declare module.exports: $Exports<'@vx/shape/build/shapes/Stack'>;\n}\ndeclare module '@vx/shape/build/util/additionalProps.js' {\n  declare module.exports: $Exports<'@vx/shape/build/util/additionalProps'>;\n}\ndeclare module '@vx/shape/build/util/callOrValue.js' {\n  declare module.exports: $Exports<'@vx/shape/build/util/callOrValue'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/@vx/tooltip_vx.x.x.js",
    "content": "// flow-typed signature: 93b553db4a6684cb0f196150fd2f1943\n// flow-typed version: <<STUB>>/@vx/tooltip_v^0.0.134/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   '@vx/tooltip'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module '@vx/tooltip' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module '@vx/tooltip/build/enhancers/withTooltip' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/build/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/build/tooltips/Tooltip' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/build/tooltips/TooltipWithBounds' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/src/enhancers/withTooltip' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/src/tooltips/Tooltip' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/src/tooltips/TooltipWithBounds' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/test/Tooltip.test' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/test/TooltipWithBounds.test' {\n  declare module.exports: any;\n}\n\ndeclare module '@vx/tooltip/test/withTooltip.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module '@vx/tooltip/build/enhancers/withTooltip.js' {\n  declare module.exports: $Exports<'@vx/tooltip/build/enhancers/withTooltip'>;\n}\ndeclare module '@vx/tooltip/build/index.js' {\n  declare module.exports: $Exports<'@vx/tooltip/build/index'>;\n}\ndeclare module '@vx/tooltip/build/tooltips/Tooltip.js' {\n  declare module.exports: $Exports<'@vx/tooltip/build/tooltips/Tooltip'>;\n}\ndeclare module '@vx/tooltip/build/tooltips/TooltipWithBounds.js' {\n  declare module.exports: $Exports<'@vx/tooltip/build/tooltips/TooltipWithBounds'>;\n}\ndeclare module '@vx/tooltip/src/enhancers/withTooltip.js' {\n  declare module.exports: $Exports<'@vx/tooltip/src/enhancers/withTooltip'>;\n}\ndeclare module '@vx/tooltip/src/index.js' {\n  declare module.exports: $Exports<'@vx/tooltip/src/index'>;\n}\ndeclare module '@vx/tooltip/src/tooltips/Tooltip.js' {\n  declare module.exports: $Exports<'@vx/tooltip/src/tooltips/Tooltip'>;\n}\ndeclare module '@vx/tooltip/src/tooltips/TooltipWithBounds.js' {\n  declare module.exports: $Exports<'@vx/tooltip/src/tooltips/TooltipWithBounds'>;\n}\ndeclare module '@vx/tooltip/test/Tooltip.test.js' {\n  declare module.exports: $Exports<'@vx/tooltip/test/Tooltip.test'>;\n}\ndeclare module '@vx/tooltip/test/TooltipWithBounds.test.js' {\n  declare module.exports: $Exports<'@vx/tooltip/test/TooltipWithBounds.test'>;\n}\ndeclare module '@vx/tooltip/test/withTooltip.test.js' {\n  declare module.exports: $Exports<'@vx/tooltip/test/withTooltip.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/amplitude_vx.x.x.js",
    "content": "// flow-typed signature: fed729f4c8392f815391ae2316878ed8\n// flow-typed version: <<STUB>>/amplitude_v3.5.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'amplitude'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'amplitude' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'amplitude/amplitude' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'amplitude/amplitude.js' {\n  declare module.exports: $Exports<'amplitude/amplitude'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-cache-inmemory_vx.x.x.js",
    "content": "// flow-typed signature: c92dd1747a56d4ea6f16e03d1cffccdf\n// flow-typed version: <<STUB>>/apollo-cache-inmemory_v^1.1.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-cache-inmemory'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-cache-inmemory' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-cache-inmemory/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/fragmentMatcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/fragmentMatcherIntrospectionQuery' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/inMemoryCache' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/mapCache' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/objectCache' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/readFromStore' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/recordingCache' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/lib/writeToStore' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-cache-inmemory/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-cache-inmemory/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/bundle.umd'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/fragmentMatcher.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/fragmentMatcher'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/fragmentMatcherIntrospectionQuery.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/fragmentMatcherIntrospectionQuery'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/index.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/index'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/inMemoryCache.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/inMemoryCache'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/mapCache.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/mapCache'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/objectCache.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/objectCache'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/readFromStore.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/readFromStore'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/recordingCache.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/recordingCache'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/types.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/types'>;\n}\ndeclare module 'apollo-cache-inmemory/lib/writeToStore.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/lib/writeToStore'>;\n}\ndeclare module 'apollo-cache-inmemory/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-cache-inmemory/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-client_vx.x.x.js",
    "content": "// flow-typed signature: 0b56a0e3e55fd528e940b9d96f25c05e\n// flow-typed version: <<STUB>>/apollo-client_v2.x/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-client'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-client' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-client/ApolloClient' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/core/networkStatus' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/core/ObservableQuery' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/core/QueryManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/core/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/core/watchQueryOptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/data/mutations' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/data/queries' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/data/store' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/errors/ApolloError' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/scheduler/scheduler' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/util/Observable' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-client/version' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-client/ApolloClient.js' {\n  declare module.exports: $Exports<'apollo-client/ApolloClient'>;\n}\ndeclare module 'apollo-client/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-client/bundle.umd'>;\n}\ndeclare module 'apollo-client/core/networkStatus.js' {\n  declare module.exports: $Exports<'apollo-client/core/networkStatus'>;\n}\ndeclare module 'apollo-client/core/ObservableQuery.js' {\n  declare module.exports: $Exports<'apollo-client/core/ObservableQuery'>;\n}\ndeclare module 'apollo-client/core/QueryManager.js' {\n  declare module.exports: $Exports<'apollo-client/core/QueryManager'>;\n}\ndeclare module 'apollo-client/core/types.js' {\n  declare module.exports: $Exports<'apollo-client/core/types'>;\n}\ndeclare module 'apollo-client/core/watchQueryOptions.js' {\n  declare module.exports: $Exports<'apollo-client/core/watchQueryOptions'>;\n}\ndeclare module 'apollo-client/data/mutations.js' {\n  declare module.exports: $Exports<'apollo-client/data/mutations'>;\n}\ndeclare module 'apollo-client/data/queries.js' {\n  declare module.exports: $Exports<'apollo-client/data/queries'>;\n}\ndeclare module 'apollo-client/data/store.js' {\n  declare module.exports: $Exports<'apollo-client/data/store'>;\n}\ndeclare module 'apollo-client/errors/ApolloError.js' {\n  declare module.exports: $Exports<'apollo-client/errors/ApolloError'>;\n}\ndeclare module 'apollo-client/index' {\n  declare module.exports: $Exports<'apollo-client'>;\n}\ndeclare module 'apollo-client/index.js' {\n  declare module.exports: $Exports<'apollo-client'>;\n}\ndeclare module 'apollo-client/scheduler/scheduler.js' {\n  declare module.exports: $Exports<'apollo-client/scheduler/scheduler'>;\n}\ndeclare module 'apollo-client/util/Observable.js' {\n  declare module.exports: $Exports<'apollo-client/util/Observable'>;\n}\ndeclare module 'apollo-client/version.js' {\n  declare module.exports: $Exports<'apollo-client/version'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-engine_vx.x.x.js",
    "content": "// flow-typed signature: e347c1991b58f57957a33dd89d2c6203\n// flow-typed version: <<STUB>>/apollo-engine_v^0.8.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-engine'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-engine' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-engine/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/lib/middleware' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/connect' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/engine' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/express' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/hapi' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/koa' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/micro' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/schema' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-engine/test/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-engine/lib/index.js' {\n  declare module.exports: $Exports<'apollo-engine/lib/index'>;\n}\ndeclare module 'apollo-engine/lib/middleware.js' {\n  declare module.exports: $Exports<'apollo-engine/lib/middleware'>;\n}\ndeclare module 'apollo-engine/test/connect.js' {\n  declare module.exports: $Exports<'apollo-engine/test/connect'>;\n}\ndeclare module 'apollo-engine/test/engine.js' {\n  declare module.exports: $Exports<'apollo-engine/test/engine'>;\n}\ndeclare module 'apollo-engine/test/express.js' {\n  declare module.exports: $Exports<'apollo-engine/test/express'>;\n}\ndeclare module 'apollo-engine/test/hapi.js' {\n  declare module.exports: $Exports<'apollo-engine/test/hapi'>;\n}\ndeclare module 'apollo-engine/test/koa.js' {\n  declare module.exports: $Exports<'apollo-engine/test/koa'>;\n}\ndeclare module 'apollo-engine/test/micro.js' {\n  declare module.exports: $Exports<'apollo-engine/test/micro'>;\n}\ndeclare module 'apollo-engine/test/schema.js' {\n  declare module.exports: $Exports<'apollo-engine/test/schema'>;\n}\ndeclare module 'apollo-engine/test/test.js' {\n  declare module.exports: $Exports<'apollo-engine/test/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-link-http_vx.x.x.js",
    "content": "// flow-typed signature: e007517b65406f4329649c40032d54ce\n// flow-typed version: <<STUB>>/apollo-link-http_v^1.3.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-link-http'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-link-http' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-link-http/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-http/lib/httpLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-http/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-http/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-link-http/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-link-http/lib/bundle.umd'>;\n}\ndeclare module 'apollo-link-http/lib/httpLink.js' {\n  declare module.exports: $Exports<'apollo-link-http/lib/httpLink'>;\n}\ndeclare module 'apollo-link-http/lib/index.js' {\n  declare module.exports: $Exports<'apollo-link-http/lib/index'>;\n}\ndeclare module 'apollo-link-http/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-link-http/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-link-retry_vx.x.x.js",
    "content": "// flow-typed signature: e2f19bde43a3647b63b610da7f41a14e\n// flow-typed version: <<STUB>>/apollo-link-retry_v2.1.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-link-retry'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-link-retry' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-link-retry/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-retry/lib/delayFunction' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-retry/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-retry/lib/retryFunction' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-retry/lib/retryLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-retry/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-link-retry/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-link-retry/lib/bundle.umd'>;\n}\ndeclare module 'apollo-link-retry/lib/delayFunction.js' {\n  declare module.exports: $Exports<'apollo-link-retry/lib/delayFunction'>;\n}\ndeclare module 'apollo-link-retry/lib/index.js' {\n  declare module.exports: $Exports<'apollo-link-retry/lib/index'>;\n}\ndeclare module 'apollo-link-retry/lib/retryFunction.js' {\n  declare module.exports: $Exports<'apollo-link-retry/lib/retryFunction'>;\n}\ndeclare module 'apollo-link-retry/lib/retryLink.js' {\n  declare module.exports: $Exports<'apollo-link-retry/lib/retryLink'>;\n}\ndeclare module 'apollo-link-retry/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-link-retry/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-link-schema_vx.x.x.js",
    "content": "// flow-typed signature: 61e2076f557fee75ba8e0dd7a7f21ae8\n// flow-typed version: <<STUB>>/apollo-link-schema_v1.1.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-link-schema'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-link-schema' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-link-schema/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-schema/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-schema/lib/schemaLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-schema/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-link-schema/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-link-schema/lib/bundle.umd'>;\n}\ndeclare module 'apollo-link-schema/lib/index.js' {\n  declare module.exports: $Exports<'apollo-link-schema/lib/index'>;\n}\ndeclare module 'apollo-link-schema/lib/schemaLink.js' {\n  declare module.exports: $Exports<'apollo-link-schema/lib/schemaLink'>;\n}\ndeclare module 'apollo-link-schema/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-link-schema/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-link-ws_vx.x.x.js",
    "content": "// flow-typed signature: 7f0409628464ee70853df937e5e547af\n// flow-typed version: <<STUB>>/apollo-link-ws_v^1.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-link-ws'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-link-ws' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-link-ws/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-ws/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-ws/lib/webSocketLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link-ws/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-link-ws/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-link-ws/lib/bundle.umd'>;\n}\ndeclare module 'apollo-link-ws/lib/index.js' {\n  declare module.exports: $Exports<'apollo-link-ws/lib/index'>;\n}\ndeclare module 'apollo-link-ws/lib/webSocketLink.js' {\n  declare module.exports: $Exports<'apollo-link-ws/lib/webSocketLink'>;\n}\ndeclare module 'apollo-link-ws/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-link-ws/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-link_vx.x.x.js",
    "content": "// flow-typed signature: 466b681854b8ea8e3659549b8fbf0c14\n// flow-typed version: <<STUB>>/apollo-link_v^1.0.7/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-link'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-link' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-link/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/link' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/linkUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/test-utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/test-utils/mockLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/test-utils/setContext' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/test-utils/testingUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/lib/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-link/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-link/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-link/lib/bundle.umd'>;\n}\ndeclare module 'apollo-link/lib/index.js' {\n  declare module.exports: $Exports<'apollo-link/lib/index'>;\n}\ndeclare module 'apollo-link/lib/link.js' {\n  declare module.exports: $Exports<'apollo-link/lib/link'>;\n}\ndeclare module 'apollo-link/lib/linkUtils.js' {\n  declare module.exports: $Exports<'apollo-link/lib/linkUtils'>;\n}\ndeclare module 'apollo-link/lib/test-utils.js' {\n  declare module.exports: $Exports<'apollo-link/lib/test-utils'>;\n}\ndeclare module 'apollo-link/lib/test-utils/mockLink.js' {\n  declare module.exports: $Exports<'apollo-link/lib/test-utils/mockLink'>;\n}\ndeclare module 'apollo-link/lib/test-utils/setContext.js' {\n  declare module.exports: $Exports<'apollo-link/lib/test-utils/setContext'>;\n}\ndeclare module 'apollo-link/lib/test-utils/testingUtils.js' {\n  declare module.exports: $Exports<'apollo-link/lib/test-utils/testingUtils'>;\n}\ndeclare module 'apollo-link/lib/types.js' {\n  declare module.exports: $Exports<'apollo-link/lib/types'>;\n}\ndeclare module 'apollo-link/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-link/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-local-query_vx.x.x.js",
    "content": "// flow-typed signature: 5462698d692d5f78e5d480911744b64c\n// flow-typed version: <<STUB>>/apollo-local-query_v^0.3.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-local-query'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-local-query' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-local-query/tests/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-local-query/index' {\n  declare module.exports: $Exports<'apollo-local-query'>;\n}\ndeclare module 'apollo-local-query/index.js' {\n  declare module.exports: $Exports<'apollo-local-query'>;\n}\ndeclare module 'apollo-local-query/tests/index.js' {\n  declare module.exports: $Exports<'apollo-local-query/tests/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-server-cache-redis_vx.x.x.js",
    "content": "// flow-typed signature: 2579e61c0f1bdea4f82d3a0ff4c70242\n// flow-typed version: <<STUB>>/apollo-server-cache-redis_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-server-cache-redis'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-server-cache-redis' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-server-cache-redis/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-server-cache-redis/dist/index.js' {\n  declare module.exports: $Exports<'apollo-server-cache-redis/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-server-express_vx.x.x.js",
    "content": "// flow-typed signature: f45ccc8a02282556985652543a099375\n// flow-typed version: <<STUB>>/apollo-server-express_v2.0.4/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-server-express'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-server-express' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-server-express/dist/ApolloServer' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-server-express/dist/connectApollo' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-server-express/dist/expressApollo' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-server-express/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-server-express/dist/ApolloServer.js' {\n  declare module.exports: $Exports<'apollo-server-express/dist/ApolloServer'>;\n}\ndeclare module 'apollo-server-express/dist/connectApollo.js' {\n  declare module.exports: $Exports<'apollo-server-express/dist/connectApollo'>;\n}\ndeclare module 'apollo-server-express/dist/expressApollo.js' {\n  declare module.exports: $Exports<'apollo-server-express/dist/expressApollo'>;\n}\ndeclare module 'apollo-server-express/dist/index.js' {\n  declare module.exports: $Exports<'apollo-server-express/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-server-plugin-response-cache_vx.x.x.js",
    "content": "// flow-typed signature: 24e78321d1ce97826d55241446c65e89\n// flow-typed version: <<STUB>>/apollo-server-plugin-response-cache_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-server-plugin-response-cache'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-server-plugin-response-cache' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-server-plugin-response-cache/dist/ApolloServerPluginResponseCache' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-server-plugin-response-cache/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-server-plugin-response-cache/dist/ApolloServerPluginResponseCache.js' {\n  declare module.exports: $Exports<'apollo-server-plugin-response-cache/dist/ApolloServerPluginResponseCache'>;\n}\ndeclare module 'apollo-server-plugin-response-cache/dist/index.js' {\n  declare module.exports: $Exports<'apollo-server-plugin-response-cache/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-upload-client_vx.x.x.js",
    "content": "// flow-typed signature: 6c05143fc37ed485649e03b33d1e80a5\n// flow-typed version: <<STUB>>/apollo-upload-client_v6.x/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-upload-client'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-upload-client' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-upload-client/lib/main/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-upload-client/lib/main/index.js' {\n  declare module.exports: $Exports<'apollo-upload-client/lib/main/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-upload-server_vx.x.x.js",
    "content": "// flow-typed signature: 15ee28e7cc66336df33e6efbf792d48a\n// flow-typed version: <<STUB>>/apollo-upload-server_v^2.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-upload-server'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-upload-server' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-upload-server/dist/apollo-upload-server' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-upload-server/dist/apollo-upload-server.module' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-upload-server/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-upload-server/dist/apollo-upload-server.js' {\n  declare module.exports: $Exports<'apollo-upload-server/dist/apollo-upload-server'>;\n}\ndeclare module 'apollo-upload-server/dist/apollo-upload-server.module.js' {\n  declare module.exports: $Exports<'apollo-upload-server/dist/apollo-upload-server.module'>;\n}\ndeclare module 'apollo-upload-server/src/index.js' {\n  declare module.exports: $Exports<'apollo-upload-server/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/apollo-utilities_vx.x.x.js",
    "content": "// flow-typed signature: 2d49bd60960076967702ccedf0db590b\n// flow-typed version: <<STUB>>/apollo-utilities_v1.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'apollo-utilities'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'apollo-utilities' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'apollo-utilities/lib/bundle.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/directives' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/fragments' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/getFromAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/storeUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/transform' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/cloneDeep' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/environment' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/errorHandling' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/isEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/maybeDeepFreeze' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/lib/util/warnOnce' {\n  declare module.exports: any;\n}\n\ndeclare module 'apollo-utilities/rollup.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'apollo-utilities/lib/bundle.umd.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/bundle.umd'>;\n}\ndeclare module 'apollo-utilities/lib/directives.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/directives'>;\n}\ndeclare module 'apollo-utilities/lib/fragments.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/fragments'>;\n}\ndeclare module 'apollo-utilities/lib/getFromAST.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/getFromAST'>;\n}\ndeclare module 'apollo-utilities/lib/index.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/index'>;\n}\ndeclare module 'apollo-utilities/lib/storeUtils.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/storeUtils'>;\n}\ndeclare module 'apollo-utilities/lib/transform.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/transform'>;\n}\ndeclare module 'apollo-utilities/lib/util/assign.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/assign'>;\n}\ndeclare module 'apollo-utilities/lib/util/cloneDeep.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/cloneDeep'>;\n}\ndeclare module 'apollo-utilities/lib/util/environment.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/environment'>;\n}\ndeclare module 'apollo-utilities/lib/util/errorHandling.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/errorHandling'>;\n}\ndeclare module 'apollo-utilities/lib/util/isEqual.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/isEqual'>;\n}\ndeclare module 'apollo-utilities/lib/util/maybeDeepFreeze.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/maybeDeepFreeze'>;\n}\ndeclare module 'apollo-utilities/lib/util/warnOnce.js' {\n  declare module.exports: $Exports<'apollo-utilities/lib/util/warnOnce'>;\n}\ndeclare module 'apollo-utilities/rollup.config.js' {\n  declare module.exports: $Exports<'apollo-utilities/rollup.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/aws-sdk_vx.x.x.js",
    "content": "// flow-typed signature: b073e824bc9714619fca4dd6caeb7e41\n// flow-typed version: <<STUB>>/aws-sdk_v2.200.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'aws-sdk'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'aws-sdk' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'aws-sdk/browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/acm' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/alexaforbusiness' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/all' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/apigateway' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/applicationautoscaling' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/appstream' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/appsync' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/athena' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/autoscaling' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/autoscalingplans' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/batch' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/browser_default' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/budgets' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloud9' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/clouddirectory' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudformation' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudfront' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudhsm' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudhsmv2' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudsearch' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudsearchdomain' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudtrail' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudwatch' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudwatchevents' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cloudwatchlogs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/codebuild' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/codecommit' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/codedeploy' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/codepipeline' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/codestar' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cognitoidentity' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cognitoidentityserviceprovider' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cognitosync' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/comprehend' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/configservice' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/costexplorer' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/cur' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/datapipeline' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/dax' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/devicefarm' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/directconnect' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/directoryservice' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/discovery' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/dms' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/dynamodb' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/dynamodbstreams' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/ec2' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/ecr' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/ecs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/efs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/elasticache' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/elasticbeanstalk' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/elastictranscoder' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/elb' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/elbv2' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/emr' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/es' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/firehose' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/gamelift' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/glacier' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/glue' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/greengrass' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/guardduty' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/health' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/iam' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/importexport' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/inspector' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/iot' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/iotdata' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/iotjobsdataplane' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kinesis' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kinesisanalytics' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kinesisvideo' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kinesisvideoarchivedmedia' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kinesisvideomedia' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/kms' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/lambda' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/lexmodelbuildingservice' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/lexruntime' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/lightsail' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/machinelearning' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/marketplacecommerceanalytics' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/marketplaceentitlementservice' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/marketplacemetering' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mediaconvert' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/medialive' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mediapackage' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mediastore' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mediastoredata' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/migrationhub' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mobile' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mobileanalytics' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mq' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/mturk' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/opsworks' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/opsworkscm' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/organizations' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/pinpoint' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/polly' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/pricing' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/rds' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/redshift' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/rekognition' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/resourcegroups' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/resourcegroupstaggingapi' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/route53' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/route53domains' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/s3' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sagemaker' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sagemakerruntime' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/serverlessapplicationrepository' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/servicecatalog' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/servicediscovery' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/ses' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/shield' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/simpledb' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sms' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/snowball' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sns' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sqs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/ssm' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/stepfunctions' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/storagegateway' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/sts' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/support' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/swf' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/transcribeservice' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/translate' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/waf' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/wafregional' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/workdocs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/workmail' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/workspaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/clients/xray' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/browser-builder' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/client-creator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/create-all-services' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/service-collector' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/transform' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn-core' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn-dep' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist/aws-sdk-core-react-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist/aws-sdk-react-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist/aws-sdk' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist/aws-sdk.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/dist/xml2js' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/global' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/api_loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/aws' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browser_loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserCryptoLib' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserHashUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserHmac' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserMd5' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserSha1' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/browserSha256' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/cloudfront/signer' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/core' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/cognito_identity_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/credential_provider_chain' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/ec2_metadata_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/ecs_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/environment_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/file_system_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/remote_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/saml_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/shared_ini_file_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/temporary_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/credentials/web_identity_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/converter' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/document_client' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/numberValue' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/set' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/translator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/dynamodb/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/empty' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/event_listeners' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/http/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/http/xhr' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/json/builder' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/json/parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/metadata_service' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/api' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/collection' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/operation' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/paginator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/resource_waiter' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/model/shape' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/node_loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/param_validator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/polly/presigner' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/protocol/json' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/protocol/query' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/protocol/rest_json' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/protocol/rest_xml' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/protocol/rest' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/query/query_param_serializer' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/rds/signer' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/react-native-loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/react-native/add-content-type' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/region_config' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/request' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/resource_waiter' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/response' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/s3/managed_upload' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/sequential_executor' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/service' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/apigateway' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/cloudfront' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/cloudsearchdomain' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/cognitoidentity' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/dynamodb' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/ec2' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/glacier' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/iotdata' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/lambda' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/machinelearning' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/polly' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/rds' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/route53' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/s3' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/sqs' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/sts' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/services/swf' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/shared_ini' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/presign' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/request_signer' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/s3' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/v2' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/v3' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/v3https' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/v4_credentials' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/signers/v4' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/state_machine' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/util' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/xml/browser_parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/xml/builder' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/lib/xml/node_parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/react-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/changelog/add-change' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/changelog/change-creator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/changelog/util' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/lib/translator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/lib/ts-generator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/region-checker/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/region-checker/whitelist' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/services-table-generator' {\n  declare module.exports: any;\n}\n\ndeclare module 'aws-sdk/scripts/typings-generator' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'aws-sdk/browser.js' {\n  declare module.exports: $Exports<'aws-sdk/browser'>;\n}\ndeclare module 'aws-sdk/clients/acm.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/acm'>;\n}\ndeclare module 'aws-sdk/clients/alexaforbusiness.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/alexaforbusiness'>;\n}\ndeclare module 'aws-sdk/clients/all.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/all'>;\n}\ndeclare module 'aws-sdk/clients/apigateway.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/apigateway'>;\n}\ndeclare module 'aws-sdk/clients/applicationautoscaling.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/applicationautoscaling'>;\n}\ndeclare module 'aws-sdk/clients/appstream.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/appstream'>;\n}\ndeclare module 'aws-sdk/clients/appsync.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/appsync'>;\n}\ndeclare module 'aws-sdk/clients/athena.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/athena'>;\n}\ndeclare module 'aws-sdk/clients/autoscaling.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/autoscaling'>;\n}\ndeclare module 'aws-sdk/clients/autoscalingplans.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/autoscalingplans'>;\n}\ndeclare module 'aws-sdk/clients/batch.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/batch'>;\n}\ndeclare module 'aws-sdk/clients/browser_default.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/browser_default'>;\n}\ndeclare module 'aws-sdk/clients/budgets.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/budgets'>;\n}\ndeclare module 'aws-sdk/clients/cloud9.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloud9'>;\n}\ndeclare module 'aws-sdk/clients/clouddirectory.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/clouddirectory'>;\n}\ndeclare module 'aws-sdk/clients/cloudformation.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudformation'>;\n}\ndeclare module 'aws-sdk/clients/cloudfront.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudfront'>;\n}\ndeclare module 'aws-sdk/clients/cloudhsm.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudhsm'>;\n}\ndeclare module 'aws-sdk/clients/cloudhsmv2.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudhsmv2'>;\n}\ndeclare module 'aws-sdk/clients/cloudsearch.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudsearch'>;\n}\ndeclare module 'aws-sdk/clients/cloudsearchdomain.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudsearchdomain'>;\n}\ndeclare module 'aws-sdk/clients/cloudtrail.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudtrail'>;\n}\ndeclare module 'aws-sdk/clients/cloudwatch.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudwatch'>;\n}\ndeclare module 'aws-sdk/clients/cloudwatchevents.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudwatchevents'>;\n}\ndeclare module 'aws-sdk/clients/cloudwatchlogs.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cloudwatchlogs'>;\n}\ndeclare module 'aws-sdk/clients/codebuild.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/codebuild'>;\n}\ndeclare module 'aws-sdk/clients/codecommit.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/codecommit'>;\n}\ndeclare module 'aws-sdk/clients/codedeploy.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/codedeploy'>;\n}\ndeclare module 'aws-sdk/clients/codepipeline.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/codepipeline'>;\n}\ndeclare module 'aws-sdk/clients/codestar.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/codestar'>;\n}\ndeclare module 'aws-sdk/clients/cognitoidentity.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cognitoidentity'>;\n}\ndeclare module 'aws-sdk/clients/cognitoidentityserviceprovider.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cognitoidentityserviceprovider'>;\n}\ndeclare module 'aws-sdk/clients/cognitosync.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cognitosync'>;\n}\ndeclare module 'aws-sdk/clients/comprehend.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/comprehend'>;\n}\ndeclare module 'aws-sdk/clients/configservice.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/configservice'>;\n}\ndeclare module 'aws-sdk/clients/costexplorer.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/costexplorer'>;\n}\ndeclare module 'aws-sdk/clients/cur.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/cur'>;\n}\ndeclare module 'aws-sdk/clients/datapipeline.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/datapipeline'>;\n}\ndeclare module 'aws-sdk/clients/dax.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/dax'>;\n}\ndeclare module 'aws-sdk/clients/devicefarm.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/devicefarm'>;\n}\ndeclare module 'aws-sdk/clients/directconnect.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/directconnect'>;\n}\ndeclare module 'aws-sdk/clients/directoryservice.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/directoryservice'>;\n}\ndeclare module 'aws-sdk/clients/discovery.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/discovery'>;\n}\ndeclare module 'aws-sdk/clients/dms.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/dms'>;\n}\ndeclare module 'aws-sdk/clients/dynamodb.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/dynamodb'>;\n}\ndeclare module 'aws-sdk/clients/dynamodbstreams.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/dynamodbstreams'>;\n}\ndeclare module 'aws-sdk/clients/ec2.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/ec2'>;\n}\ndeclare module 'aws-sdk/clients/ecr.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/ecr'>;\n}\ndeclare module 'aws-sdk/clients/ecs.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/ecs'>;\n}\ndeclare module 'aws-sdk/clients/efs.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/efs'>;\n}\ndeclare module 'aws-sdk/clients/elasticache.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/elasticache'>;\n}\ndeclare module 'aws-sdk/clients/elasticbeanstalk.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/elasticbeanstalk'>;\n}\ndeclare module 'aws-sdk/clients/elastictranscoder.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/elastictranscoder'>;\n}\ndeclare module 'aws-sdk/clients/elb.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/elb'>;\n}\ndeclare module 'aws-sdk/clients/elbv2.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/elbv2'>;\n}\ndeclare module 'aws-sdk/clients/emr.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/emr'>;\n}\ndeclare module 'aws-sdk/clients/es.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/es'>;\n}\ndeclare module 'aws-sdk/clients/firehose.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/firehose'>;\n}\ndeclare module 'aws-sdk/clients/gamelift.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/gamelift'>;\n}\ndeclare module 'aws-sdk/clients/glacier.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/glacier'>;\n}\ndeclare module 'aws-sdk/clients/glue.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/glue'>;\n}\ndeclare module 'aws-sdk/clients/greengrass.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/greengrass'>;\n}\ndeclare module 'aws-sdk/clients/guardduty.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/guardduty'>;\n}\ndeclare module 'aws-sdk/clients/health.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/health'>;\n}\ndeclare module 'aws-sdk/clients/iam.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/iam'>;\n}\ndeclare module 'aws-sdk/clients/importexport.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/importexport'>;\n}\ndeclare module 'aws-sdk/clients/inspector.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/inspector'>;\n}\ndeclare module 'aws-sdk/clients/iot.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/iot'>;\n}\ndeclare module 'aws-sdk/clients/iotdata.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/iotdata'>;\n}\ndeclare module 'aws-sdk/clients/iotjobsdataplane.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/iotjobsdataplane'>;\n}\ndeclare module 'aws-sdk/clients/kinesis.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kinesis'>;\n}\ndeclare module 'aws-sdk/clients/kinesisanalytics.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kinesisanalytics'>;\n}\ndeclare module 'aws-sdk/clients/kinesisvideo.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kinesisvideo'>;\n}\ndeclare module 'aws-sdk/clients/kinesisvideoarchivedmedia.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kinesisvideoarchivedmedia'>;\n}\ndeclare module 'aws-sdk/clients/kinesisvideomedia.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kinesisvideomedia'>;\n}\ndeclare module 'aws-sdk/clients/kms.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/kms'>;\n}\ndeclare module 'aws-sdk/clients/lambda.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/lambda'>;\n}\ndeclare module 'aws-sdk/clients/lexmodelbuildingservice.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/lexmodelbuildingservice'>;\n}\ndeclare module 'aws-sdk/clients/lexruntime.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/lexruntime'>;\n}\ndeclare module 'aws-sdk/clients/lightsail.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/lightsail'>;\n}\ndeclare module 'aws-sdk/clients/machinelearning.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/machinelearning'>;\n}\ndeclare module 'aws-sdk/clients/marketplacecommerceanalytics.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/marketplacecommerceanalytics'>;\n}\ndeclare module 'aws-sdk/clients/marketplaceentitlementservice.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/marketplaceentitlementservice'>;\n}\ndeclare module 'aws-sdk/clients/marketplacemetering.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/marketplacemetering'>;\n}\ndeclare module 'aws-sdk/clients/mediaconvert.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mediaconvert'>;\n}\ndeclare module 'aws-sdk/clients/medialive.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/medialive'>;\n}\ndeclare module 'aws-sdk/clients/mediapackage.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mediapackage'>;\n}\ndeclare module 'aws-sdk/clients/mediastore.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mediastore'>;\n}\ndeclare module 'aws-sdk/clients/mediastoredata.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mediastoredata'>;\n}\ndeclare module 'aws-sdk/clients/migrationhub.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/migrationhub'>;\n}\ndeclare module 'aws-sdk/clients/mobile.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mobile'>;\n}\ndeclare module 'aws-sdk/clients/mobileanalytics.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mobileanalytics'>;\n}\ndeclare module 'aws-sdk/clients/mq.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mq'>;\n}\ndeclare module 'aws-sdk/clients/mturk.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/mturk'>;\n}\ndeclare module 'aws-sdk/clients/opsworks.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/opsworks'>;\n}\ndeclare module 'aws-sdk/clients/opsworkscm.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/opsworkscm'>;\n}\ndeclare module 'aws-sdk/clients/organizations.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/organizations'>;\n}\ndeclare module 'aws-sdk/clients/pinpoint.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/pinpoint'>;\n}\ndeclare module 'aws-sdk/clients/polly.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/polly'>;\n}\ndeclare module 'aws-sdk/clients/pricing.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/pricing'>;\n}\ndeclare module 'aws-sdk/clients/rds.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/rds'>;\n}\ndeclare module 'aws-sdk/clients/redshift.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/redshift'>;\n}\ndeclare module 'aws-sdk/clients/rekognition.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/rekognition'>;\n}\ndeclare module 'aws-sdk/clients/resourcegroups.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/resourcegroups'>;\n}\ndeclare module 'aws-sdk/clients/resourcegroupstaggingapi.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/resourcegroupstaggingapi'>;\n}\ndeclare module 'aws-sdk/clients/route53.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/route53'>;\n}\ndeclare module 'aws-sdk/clients/route53domains.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/route53domains'>;\n}\ndeclare module 'aws-sdk/clients/s3.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/s3'>;\n}\ndeclare module 'aws-sdk/clients/sagemaker.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sagemaker'>;\n}\ndeclare module 'aws-sdk/clients/sagemakerruntime.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sagemakerruntime'>;\n}\ndeclare module 'aws-sdk/clients/serverlessapplicationrepository.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/serverlessapplicationrepository'>;\n}\ndeclare module 'aws-sdk/clients/servicecatalog.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/servicecatalog'>;\n}\ndeclare module 'aws-sdk/clients/servicediscovery.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/servicediscovery'>;\n}\ndeclare module 'aws-sdk/clients/ses.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/ses'>;\n}\ndeclare module 'aws-sdk/clients/shield.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/shield'>;\n}\ndeclare module 'aws-sdk/clients/simpledb.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/simpledb'>;\n}\ndeclare module 'aws-sdk/clients/sms.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sms'>;\n}\ndeclare module 'aws-sdk/clients/snowball.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/snowball'>;\n}\ndeclare module 'aws-sdk/clients/sns.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sns'>;\n}\ndeclare module 'aws-sdk/clients/sqs.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sqs'>;\n}\ndeclare module 'aws-sdk/clients/ssm.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/ssm'>;\n}\ndeclare module 'aws-sdk/clients/stepfunctions.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/stepfunctions'>;\n}\ndeclare module 'aws-sdk/clients/storagegateway.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/storagegateway'>;\n}\ndeclare module 'aws-sdk/clients/sts.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/sts'>;\n}\ndeclare module 'aws-sdk/clients/support.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/support'>;\n}\ndeclare module 'aws-sdk/clients/swf.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/swf'>;\n}\ndeclare module 'aws-sdk/clients/transcribeservice.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/transcribeservice'>;\n}\ndeclare module 'aws-sdk/clients/translate.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/translate'>;\n}\ndeclare module 'aws-sdk/clients/waf.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/waf'>;\n}\ndeclare module 'aws-sdk/clients/wafregional.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/wafregional'>;\n}\ndeclare module 'aws-sdk/clients/workdocs.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/workdocs'>;\n}\ndeclare module 'aws-sdk/clients/workmail.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/workmail'>;\n}\ndeclare module 'aws-sdk/clients/workspaces.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/workspaces'>;\n}\ndeclare module 'aws-sdk/clients/xray.js' {\n  declare module.exports: $Exports<'aws-sdk/clients/xray'>;\n}\ndeclare module 'aws-sdk/dist-tools/browser-builder.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/browser-builder'>;\n}\ndeclare module 'aws-sdk/dist-tools/client-creator.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/client-creator'>;\n}\ndeclare module 'aws-sdk/dist-tools/create-all-services.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/create-all-services'>;\n}\ndeclare module 'aws-sdk/dist-tools/service-collector.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/service-collector'>;\n}\ndeclare module 'aws-sdk/dist-tools/transform.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/transform'>;\n}\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn-core.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/webpack.config.rn-core'>;\n}\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn-dep.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/webpack.config.rn-dep'>;\n}\ndeclare module 'aws-sdk/dist-tools/webpack.config.rn.js' {\n  declare module.exports: $Exports<'aws-sdk/dist-tools/webpack.config.rn'>;\n}\ndeclare module 'aws-sdk/dist/aws-sdk-core-react-native.js' {\n  declare module.exports: $Exports<'aws-sdk/dist/aws-sdk-core-react-native'>;\n}\ndeclare module 'aws-sdk/dist/aws-sdk-react-native.js' {\n  declare module.exports: $Exports<'aws-sdk/dist/aws-sdk-react-native'>;\n}\ndeclare module 'aws-sdk/dist/aws-sdk.js' {\n  declare module.exports: $Exports<'aws-sdk/dist/aws-sdk'>;\n}\ndeclare module 'aws-sdk/dist/aws-sdk.min.js' {\n  declare module.exports: $Exports<'aws-sdk/dist/aws-sdk.min'>;\n}\ndeclare module 'aws-sdk/dist/xml2js.js' {\n  declare module.exports: $Exports<'aws-sdk/dist/xml2js'>;\n}\ndeclare module 'aws-sdk/global.js' {\n  declare module.exports: $Exports<'aws-sdk/global'>;\n}\ndeclare module 'aws-sdk/index' {\n  declare module.exports: $Exports<'aws-sdk'>;\n}\ndeclare module 'aws-sdk/index.js' {\n  declare module.exports: $Exports<'aws-sdk'>;\n}\ndeclare module 'aws-sdk/lib/api_loader.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/api_loader'>;\n}\ndeclare module 'aws-sdk/lib/aws.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/aws'>;\n}\ndeclare module 'aws-sdk/lib/browser_loader.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browser_loader'>;\n}\ndeclare module 'aws-sdk/lib/browser.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browser'>;\n}\ndeclare module 'aws-sdk/lib/browserCryptoLib.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserCryptoLib'>;\n}\ndeclare module 'aws-sdk/lib/browserHashUtils.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserHashUtils'>;\n}\ndeclare module 'aws-sdk/lib/browserHmac.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserHmac'>;\n}\ndeclare module 'aws-sdk/lib/browserMd5.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserMd5'>;\n}\ndeclare module 'aws-sdk/lib/browserSha1.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserSha1'>;\n}\ndeclare module 'aws-sdk/lib/browserSha256.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/browserSha256'>;\n}\ndeclare module 'aws-sdk/lib/cloudfront/signer.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/cloudfront/signer'>;\n}\ndeclare module 'aws-sdk/lib/config.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/config'>;\n}\ndeclare module 'aws-sdk/lib/core.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/core'>;\n}\ndeclare module 'aws-sdk/lib/credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/cognito_identity_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/cognito_identity_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/credential_provider_chain.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/credential_provider_chain'>;\n}\ndeclare module 'aws-sdk/lib/credentials/ec2_metadata_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/ec2_metadata_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/ecs_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/ecs_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/environment_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/environment_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/file_system_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/file_system_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/remote_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/remote_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/saml_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/saml_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/shared_ini_file_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/shared_ini_file_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/temporary_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/temporary_credentials'>;\n}\ndeclare module 'aws-sdk/lib/credentials/web_identity_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/credentials/web_identity_credentials'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/converter.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/converter'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/document_client.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/document_client'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/numberValue.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/numberValue'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/set.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/set'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/translator.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/translator'>;\n}\ndeclare module 'aws-sdk/lib/dynamodb/types.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/dynamodb/types'>;\n}\ndeclare module 'aws-sdk/lib/empty.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/empty'>;\n}\ndeclare module 'aws-sdk/lib/event_listeners.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/event_listeners'>;\n}\ndeclare module 'aws-sdk/lib/http.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/http'>;\n}\ndeclare module 'aws-sdk/lib/http/node.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/http/node'>;\n}\ndeclare module 'aws-sdk/lib/http/xhr.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/http/xhr'>;\n}\ndeclare module 'aws-sdk/lib/json/builder.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/json/builder'>;\n}\ndeclare module 'aws-sdk/lib/json/parser.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/json/parser'>;\n}\ndeclare module 'aws-sdk/lib/metadata_service.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/metadata_service'>;\n}\ndeclare module 'aws-sdk/lib/model/api.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/api'>;\n}\ndeclare module 'aws-sdk/lib/model/collection.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/collection'>;\n}\ndeclare module 'aws-sdk/lib/model/operation.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/operation'>;\n}\ndeclare module 'aws-sdk/lib/model/paginator.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/paginator'>;\n}\ndeclare module 'aws-sdk/lib/model/resource_waiter.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/resource_waiter'>;\n}\ndeclare module 'aws-sdk/lib/model/shape.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/model/shape'>;\n}\ndeclare module 'aws-sdk/lib/node_loader.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/node_loader'>;\n}\ndeclare module 'aws-sdk/lib/param_validator.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/param_validator'>;\n}\ndeclare module 'aws-sdk/lib/polly/presigner.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/polly/presigner'>;\n}\ndeclare module 'aws-sdk/lib/protocol/json.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/protocol/json'>;\n}\ndeclare module 'aws-sdk/lib/protocol/query.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/protocol/query'>;\n}\ndeclare module 'aws-sdk/lib/protocol/rest_json.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/protocol/rest_json'>;\n}\ndeclare module 'aws-sdk/lib/protocol/rest_xml.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/protocol/rest_xml'>;\n}\ndeclare module 'aws-sdk/lib/protocol/rest.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/protocol/rest'>;\n}\ndeclare module 'aws-sdk/lib/query/query_param_serializer.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/query/query_param_serializer'>;\n}\ndeclare module 'aws-sdk/lib/rds/signer.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/rds/signer'>;\n}\ndeclare module 'aws-sdk/lib/react-native-loader.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/react-native-loader'>;\n}\ndeclare module 'aws-sdk/lib/react-native/add-content-type.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/react-native/add-content-type'>;\n}\ndeclare module 'aws-sdk/lib/region_config.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/region_config'>;\n}\ndeclare module 'aws-sdk/lib/request.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/request'>;\n}\ndeclare module 'aws-sdk/lib/resource_waiter.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/resource_waiter'>;\n}\ndeclare module 'aws-sdk/lib/response.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/response'>;\n}\ndeclare module 'aws-sdk/lib/s3/managed_upload.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/s3/managed_upload'>;\n}\ndeclare module 'aws-sdk/lib/sequential_executor.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/sequential_executor'>;\n}\ndeclare module 'aws-sdk/lib/service.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/service'>;\n}\ndeclare module 'aws-sdk/lib/services/apigateway.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/apigateway'>;\n}\ndeclare module 'aws-sdk/lib/services/cloudfront.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/cloudfront'>;\n}\ndeclare module 'aws-sdk/lib/services/cloudsearchdomain.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/cloudsearchdomain'>;\n}\ndeclare module 'aws-sdk/lib/services/cognitoidentity.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/cognitoidentity'>;\n}\ndeclare module 'aws-sdk/lib/services/dynamodb.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/dynamodb'>;\n}\ndeclare module 'aws-sdk/lib/services/ec2.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/ec2'>;\n}\ndeclare module 'aws-sdk/lib/services/glacier.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/glacier'>;\n}\ndeclare module 'aws-sdk/lib/services/iotdata.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/iotdata'>;\n}\ndeclare module 'aws-sdk/lib/services/lambda.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/lambda'>;\n}\ndeclare module 'aws-sdk/lib/services/machinelearning.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/machinelearning'>;\n}\ndeclare module 'aws-sdk/lib/services/polly.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/polly'>;\n}\ndeclare module 'aws-sdk/lib/services/rds.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/rds'>;\n}\ndeclare module 'aws-sdk/lib/services/route53.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/route53'>;\n}\ndeclare module 'aws-sdk/lib/services/s3.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/s3'>;\n}\ndeclare module 'aws-sdk/lib/services/sqs.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/sqs'>;\n}\ndeclare module 'aws-sdk/lib/services/sts.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/sts'>;\n}\ndeclare module 'aws-sdk/lib/services/swf.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/services/swf'>;\n}\ndeclare module 'aws-sdk/lib/shared_ini.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/shared_ini'>;\n}\ndeclare module 'aws-sdk/lib/signers/presign.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/presign'>;\n}\ndeclare module 'aws-sdk/lib/signers/request_signer.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/request_signer'>;\n}\ndeclare module 'aws-sdk/lib/signers/s3.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/s3'>;\n}\ndeclare module 'aws-sdk/lib/signers/v2.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/v2'>;\n}\ndeclare module 'aws-sdk/lib/signers/v3.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/v3'>;\n}\ndeclare module 'aws-sdk/lib/signers/v3https.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/v3https'>;\n}\ndeclare module 'aws-sdk/lib/signers/v4_credentials.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/v4_credentials'>;\n}\ndeclare module 'aws-sdk/lib/signers/v4.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/signers/v4'>;\n}\ndeclare module 'aws-sdk/lib/state_machine.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/state_machine'>;\n}\ndeclare module 'aws-sdk/lib/util.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/util'>;\n}\ndeclare module 'aws-sdk/lib/xml/browser_parser.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/xml/browser_parser'>;\n}\ndeclare module 'aws-sdk/lib/xml/builder.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/xml/builder'>;\n}\ndeclare module 'aws-sdk/lib/xml/node_parser.js' {\n  declare module.exports: $Exports<'aws-sdk/lib/xml/node_parser'>;\n}\ndeclare module 'aws-sdk/react-native.js' {\n  declare module.exports: $Exports<'aws-sdk/react-native'>;\n}\ndeclare module 'aws-sdk/scripts/changelog/add-change.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/changelog/add-change'>;\n}\ndeclare module 'aws-sdk/scripts/changelog/change-creator.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/changelog/change-creator'>;\n}\ndeclare module 'aws-sdk/scripts/changelog/util.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/changelog/util'>;\n}\ndeclare module 'aws-sdk/scripts/lib/translator.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/lib/translator'>;\n}\ndeclare module 'aws-sdk/scripts/lib/ts-generator.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/lib/ts-generator'>;\n}\ndeclare module 'aws-sdk/scripts/region-checker/index.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/region-checker/index'>;\n}\ndeclare module 'aws-sdk/scripts/region-checker/whitelist.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/region-checker/whitelist'>;\n}\ndeclare module 'aws-sdk/scripts/services-table-generator.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/services-table-generator'>;\n}\ndeclare module 'aws-sdk/scripts/typings-generator.js' {\n  declare module.exports: $Exports<'aws-sdk/scripts/typings-generator'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/axios_v0.17.x.js",
    "content": "// flow-typed signature: 9fd7b9287df55ee8cfa980889d107499\n// flow-typed version: a8b5058d19/axios_v0.17.x/flow_>=v0.25.x\n\ndeclare module \"axios\" {\n  declare interface ProxyConfig {\n    host: string;\n    port: number;\n  }\n  declare interface Cancel {\n    constructor(message?: string): Cancel;\n    message: string;\n  }\n  declare interface Canceler {\n    (message?: string): void;\n  }\n  declare interface CancelTokenSource {\n    token: CancelToken;\n    cancel: Canceler;\n  }\n  declare class CancelToken {\n    constructor(executor: (cancel: Canceler) => void): CancelToken;\n    static source(): CancelTokenSource;\n    promise: Promise<Cancel>;\n    reason?: Cancel;\n    throwIfRequested(): void;\n  }\n  declare interface AxiosXHRConfigBase<T> {\n    adapter?: <T>(config: AxiosXHRConfig<T>) => Promise<AxiosXHR<T>>;\n    auth?: {\n      username: string,\n      password: string\n    };\n    baseURL?: string;\n    cancelToken?: CancelToken;\n    headers?: Object;\n    httpAgent?: mixed; // Missing the type in the core flow node libdef\n    httpsAgent?: mixed; // Missing the type in the core flow node libdef\n    maxContentLength?: number;\n    maxRedirects?: 5;\n    params?: Object;\n    paramsSerializer?: (params: Object) => string;\n    progress?: (progressEvent: Event) => void | mixed;\n    proxy?: ProxyConfig | false;\n    responseType?:\n      | \"arraybuffer\"\n      | \"blob\"\n      | \"document\"\n      | \"json\"\n      | \"text\"\n      | \"stream\";\n    timeout?: number;\n    transformRequest?: Array<<U>(data: T) => U | Array<<U>(data: T) => U>>;\n    transformResponse?: Array<<U>(data: T) => U>;\n    validateStatus?: (status: number) => boolean;\n    withCredentials?: boolean;\n    xsrfCookieName?: string;\n    xsrfHeaderName?: string;\n  }\n  declare type $AxiosXHRConfigBase<T> = AxiosXHRConfigBase<T>;\n  declare interface AxiosXHRConfig<T> extends AxiosXHRConfigBase<T> {\n    data?: T;\n    method?: string;\n    url: string;\n  }\n  declare type $AxiosXHRConfig<T> = AxiosXHRConfig<T>;\n  declare class AxiosXHR<T> {\n    config: AxiosXHRConfig<T>;\n    data: T;\n    headers?: Object;\n    status: number;\n    statusText: string;\n    request: http$ClientRequest | XMLHttpRequest;\n  }\n  declare type $AxiosXHR<T> = AxiosXHR<T>;\n  declare class AxiosInterceptorIdent extends String {}\n  declare class AxiosRequestInterceptor<T> {\n    use(\n      successHandler: ?(\n        response: AxiosXHRConfig<T>\n      ) => Promise<AxiosXHRConfig<*>> | AxiosXHRConfig<*>,\n      errorHandler: ?(error: mixed) => mixed\n    ): AxiosInterceptorIdent;\n    eject(ident: AxiosInterceptorIdent): void;\n  }\n  declare class AxiosResponseInterceptor<T> {\n    use(\n      successHandler: ?(response: AxiosXHR<T>) => mixed,\n      errorHandler: ?(error: $AxiosError<any>) => mixed\n    ): AxiosInterceptorIdent;\n    eject(ident: AxiosInterceptorIdent): void;\n  }\n  declare type AxiosPromise<T> = Promise<AxiosXHR<T>>;\n  declare class Axios {\n    constructor<T>(config?: AxiosXHRConfigBase<T>): void;\n    $call: <T>(\n      config: AxiosXHRConfig<T> | string,\n      config?: AxiosXHRConfig<T>\n    ) => AxiosPromise<T>;\n    request<T>(config: AxiosXHRConfig<T>): AxiosPromise<T>;\n    delete<T>(url: string, config?: AxiosXHRConfigBase<T>): AxiosPromise<T>;\n    get<T>(url: string, config?: AxiosXHRConfigBase<T>): AxiosPromise<T>;\n    head<T>(url: string, config?: AxiosXHRConfigBase<T>): AxiosPromise<T>;\n    post<T>(\n      url: string,\n      data?: mixed,\n      config?: AxiosXHRConfigBase<T>\n    ): AxiosPromise<T>;\n    put<T>(\n      url: string,\n      data?: mixed,\n      config?: AxiosXHRConfigBase<T>\n    ): AxiosPromise<T>;\n    patch<T>(\n      url: string,\n      data?: mixed,\n      config?: AxiosXHRConfigBase<T>\n    ): AxiosPromise<T>;\n    interceptors: {\n      request: AxiosRequestInterceptor<mixed>,\n      response: AxiosResponseInterceptor<mixed>\n    };\n    defaults: { headers: Object } & AxiosXHRConfig<*>;\n  }\n\n  declare class AxiosError<T> extends Error {\n    config: AxiosXHRConfig<T>;\n    response: AxiosXHR<T>;\n    code?: string;\n  }\n\n  declare type $AxiosError<T> = AxiosError<T>;\n\n  declare interface AxiosExport extends Axios {\n    Axios: typeof Axios;\n    Cancel: Class<Cancel>;\n    CancelToken: Class<CancelToken>;\n    isCancel(value: any): boolean;\n    create(config?: AxiosXHRConfigBase<any>): Axios;\n    all: typeof Promise.all;\n    spread(callback: Function): (arr: Array<any>) => Function;\n  }\n  declare module.exports: AxiosExport;\n}\n"
  },
  {
    "path": "flow-typed/npm/axios_vx.x.x.js",
    "content": "// flow-typed signature: e0f675cc56db12f7865d542c523225c5\n// flow-typed version: <<STUB>>/axios_v1.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'axios'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'axios' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'axios/dist/axios' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/dist/axios.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/adapters/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/adapters/xhr' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/axios' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/cancel/Cancel' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/cancel/CancelToken' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/cancel/isCancel' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/Axios' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/createError' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/dispatchRequest' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/enhanceError' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/InterceptorManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/settle' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/core/transformData' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/defaults' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/bind' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/btoa' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/buildURL' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/combineURLs' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/cookies' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/deprecatedMethod' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/isAbsoluteURL' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/isURLSameOrigin' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/normalizeHeaderName' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/parseHeaders' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/helpers/spread' {\n  declare module.exports: any;\n}\n\ndeclare module 'axios/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'axios/dist/axios.js' {\n  declare module.exports: $Exports<'axios/dist/axios'>;\n}\ndeclare module 'axios/dist/axios.min.js' {\n  declare module.exports: $Exports<'axios/dist/axios.min'>;\n}\ndeclare module 'axios/index' {\n  declare module.exports: $Exports<'axios'>;\n}\ndeclare module 'axios/index.js' {\n  declare module.exports: $Exports<'axios'>;\n}\ndeclare module 'axios/lib/adapters/http.js' {\n  declare module.exports: $Exports<'axios/lib/adapters/http'>;\n}\ndeclare module 'axios/lib/adapters/xhr.js' {\n  declare module.exports: $Exports<'axios/lib/adapters/xhr'>;\n}\ndeclare module 'axios/lib/axios.js' {\n  declare module.exports: $Exports<'axios/lib/axios'>;\n}\ndeclare module 'axios/lib/cancel/Cancel.js' {\n  declare module.exports: $Exports<'axios/lib/cancel/Cancel'>;\n}\ndeclare module 'axios/lib/cancel/CancelToken.js' {\n  declare module.exports: $Exports<'axios/lib/cancel/CancelToken'>;\n}\ndeclare module 'axios/lib/cancel/isCancel.js' {\n  declare module.exports: $Exports<'axios/lib/cancel/isCancel'>;\n}\ndeclare module 'axios/lib/core/Axios.js' {\n  declare module.exports: $Exports<'axios/lib/core/Axios'>;\n}\ndeclare module 'axios/lib/core/createError.js' {\n  declare module.exports: $Exports<'axios/lib/core/createError'>;\n}\ndeclare module 'axios/lib/core/dispatchRequest.js' {\n  declare module.exports: $Exports<'axios/lib/core/dispatchRequest'>;\n}\ndeclare module 'axios/lib/core/enhanceError.js' {\n  declare module.exports: $Exports<'axios/lib/core/enhanceError'>;\n}\ndeclare module 'axios/lib/core/InterceptorManager.js' {\n  declare module.exports: $Exports<'axios/lib/core/InterceptorManager'>;\n}\ndeclare module 'axios/lib/core/settle.js' {\n  declare module.exports: $Exports<'axios/lib/core/settle'>;\n}\ndeclare module 'axios/lib/core/transformData.js' {\n  declare module.exports: $Exports<'axios/lib/core/transformData'>;\n}\ndeclare module 'axios/lib/defaults.js' {\n  declare module.exports: $Exports<'axios/lib/defaults'>;\n}\ndeclare module 'axios/lib/helpers/bind.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/bind'>;\n}\ndeclare module 'axios/lib/helpers/btoa.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/btoa'>;\n}\ndeclare module 'axios/lib/helpers/buildURL.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/buildURL'>;\n}\ndeclare module 'axios/lib/helpers/combineURLs.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/combineURLs'>;\n}\ndeclare module 'axios/lib/helpers/cookies.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/cookies'>;\n}\ndeclare module 'axios/lib/helpers/deprecatedMethod.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/deprecatedMethod'>;\n}\ndeclare module 'axios/lib/helpers/isAbsoluteURL.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/isAbsoluteURL'>;\n}\ndeclare module 'axios/lib/helpers/isURLSameOrigin.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/isURLSameOrigin'>;\n}\ndeclare module 'axios/lib/helpers/normalizeHeaderName.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/normalizeHeaderName'>;\n}\ndeclare module 'axios/lib/helpers/parseHeaders.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/parseHeaders'>;\n}\ndeclare module 'axios/lib/helpers/spread.js' {\n  declare module.exports: $Exports<'axios/lib/helpers/spread'>;\n}\ndeclare module 'axios/lib/utils.js' {\n  declare module.exports: $Exports<'axios/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/b2a_vx.x.x.js",
    "content": "// flow-typed signature: 458f54b9229cd74dc54679aad2fb6f13\n// flow-typed version: <<STUB>>/b2a_v1.0.10/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'b2a'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'b2a' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'b2a/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'b2a/lib/index.js' {\n  declare module.exports: $Exports<'b2a/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-cli_vx.x.x.js",
    "content": "// flow-typed signature: 806967f09b0efda655ab5cd79fb33bca\n// flow-typed version: <<STUB>>/babel-cli_v^6.24.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-cli'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-cli' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-cli/bin/babel-doctor' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/bin/babel-external-helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/bin/babel-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/bin/babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/_babel-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel-external-helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel/dir' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel/file' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-cli/lib/babel/util' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-cli/bin/babel-doctor.js' {\n  declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>;\n}\ndeclare module 'babel-cli/bin/babel-external-helpers.js' {\n  declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>;\n}\ndeclare module 'babel-cli/bin/babel-node.js' {\n  declare module.exports: $Exports<'babel-cli/bin/babel-node'>;\n}\ndeclare module 'babel-cli/bin/babel.js' {\n  declare module.exports: $Exports<'babel-cli/bin/babel'>;\n}\ndeclare module 'babel-cli/index' {\n  declare module.exports: $Exports<'babel-cli'>;\n}\ndeclare module 'babel-cli/index.js' {\n  declare module.exports: $Exports<'babel-cli'>;\n}\ndeclare module 'babel-cli/lib/_babel-node.js' {\n  declare module.exports: $Exports<'babel-cli/lib/_babel-node'>;\n}\ndeclare module 'babel-cli/lib/babel-external-helpers.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>;\n}\ndeclare module 'babel-cli/lib/babel-node.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel-node'>;\n}\ndeclare module 'babel-cli/lib/babel/dir.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel/dir'>;\n}\ndeclare module 'babel-cli/lib/babel/file.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel/file'>;\n}\ndeclare module 'babel-cli/lib/babel/index.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel/index'>;\n}\ndeclare module 'babel-cli/lib/babel/util.js' {\n  declare module.exports: $Exports<'babel-cli/lib/babel/util'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-eslint_vx.x.x.js",
    "content": "// flow-typed signature: 4d5d7244bd7921f990587fc59f173bd3\n// flow-typed version: <<STUB>>/babel-eslint_v^8.0.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-eslint'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-eslint' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-eslint/lib/analyze-scope' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/attachComments' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/convertComments' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/convertTemplateType' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/toAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/toToken' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/babylon-to-espree/toTokens' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/parse-with-patch' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/parse-with-scope' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/patch-eslint-scope' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-eslint/lib/visitor-keys' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-eslint/lib/analyze-scope.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/analyze-scope'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/attachComments.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/attachComments'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/convertComments.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/convertComments'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/convertTemplateType.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/convertTemplateType'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/index.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/index'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/toAST.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toAST'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/toToken.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toToken'>;\n}\ndeclare module 'babel-eslint/lib/babylon-to-espree/toTokens.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/babylon-to-espree/toTokens'>;\n}\ndeclare module 'babel-eslint/lib/index.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/index'>;\n}\ndeclare module 'babel-eslint/lib/parse-with-patch.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/parse-with-patch'>;\n}\ndeclare module 'babel-eslint/lib/parse-with-scope.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/parse-with-scope'>;\n}\ndeclare module 'babel-eslint/lib/parse.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/parse'>;\n}\ndeclare module 'babel-eslint/lib/patch-eslint-scope.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/patch-eslint-scope'>;\n}\ndeclare module 'babel-eslint/lib/visitor-keys.js' {\n  declare module.exports: $Exports<'babel-eslint/lib/visitor-keys'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-import-inspector_vx.x.x.js",
    "content": "// flow-typed signature: ec295b01dbf939c386cab3350dd25109\n// flow-typed version: <<STUB>>/babel-plugin-import-inspector_v^2.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-import-inspector'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-import-inspector' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'babel-plugin-import-inspector/index' {\n  declare module.exports: $Exports<'babel-plugin-import-inspector'>;\n}\ndeclare module 'babel-plugin-import-inspector/index.js' {\n  declare module.exports: $Exports<'babel-plugin-import-inspector'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-styled-components_vx.x.x.js",
    "content": "// flow-typed signature: 9a7eda6fe4d82c7dd052862424d0702c\n// flow-typed version: <<STUB>>/babel-plugin-styled-components_v^1.1.7/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-styled-components'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-styled-components' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-styled-components/lib/css/placeholderUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/css/preprocess' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessInjectGlobal' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessKeyframes' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/minify/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/utils/detectors' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/utils/getName' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/utils/hash' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/utils/options' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/assignStyledRequired' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/displayNameAndId' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/minify' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/noParserImport' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/preprocess' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/transpile' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-styled-components/lib/css/placeholderUtils.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/css/placeholderUtils'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/css/preprocess.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/css/preprocess'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessInjectGlobal.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/css/preprocessInjectGlobal'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessKeyframes.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/css/preprocessKeyframes'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/css/preprocessUtils.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/css/preprocessUtils'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/index'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/minify/index.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/minify/index'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/utils/detectors.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/utils/detectors'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/utils/getName.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/utils/getName'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/utils/hash.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/utils/hash'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/utils/options.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/utils/options'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/assignStyledRequired.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/assignStyledRequired'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/displayNameAndId.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/displayNameAndId'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/minify.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/minify'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/noParserImport.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/noParserImport'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/index.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/templateLiterals/index'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/preprocess.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/templateLiterals/preprocess'>;\n}\ndeclare module 'babel-plugin-styled-components/lib/visitors/templateLiterals/transpile.js' {\n  declare module.exports: $Exports<'babel-plugin-styled-components/lib/visitors/templateLiterals/transpile'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-syntax-async-generators_vx.x.x.js",
    "content": "// flow-typed signature: 64d38b285c852a33f4c03a1da257d367\n// flow-typed version: <<STUB>>/babel-plugin-syntax-async-generators_v^6.13.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-syntax-async-generators'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-syntax-async-generators' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-syntax-async-generators/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-syntax-async-generators/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-syntax-async-generators/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-syntax-dynamic-import_vx.x.x.js",
    "content": "// flow-typed signature: 26fd3369ddb6fa8ea2ee0357c7caeb1f\n// flow-typed version: <<STUB>>/babel-plugin-syntax-dynamic-import_v^6.18.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-syntax-dynamic-import'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-syntax-dynamic-import' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-syntax-dynamic-import/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-syntax-dynamic-import/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-syntax-dynamic-import/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-transform-async-generator-functions_vx.x.x.js",
    "content": "// flow-typed signature: 498068283d7cb370197e7324b3db5923\n// flow-typed version: <<STUB>>/babel-plugin-transform-async-generator-functions_v^6.24.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-transform-async-generator-functions'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-transform-async-generator-functions' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-transform-async-generator-functions/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-transform-async-generator-functions/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-transform-async-generator-functions/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-transform-class-properties_vx.x.x.js",
    "content": "// flow-typed signature: ffec3ad0fa3b7a1e39f375016f9f1b83\n// flow-typed version: <<STUB>>/babel-plugin-transform-class-properties_v^6.24.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-transform-class-properties'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-transform-class-properties' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-transform-class-properties/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-transform-class-properties/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-transform-class-properties/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js",
    "content": "// flow-typed signature: 76cf24c882811a6100dbf999faa85748\n// flow-typed version: <<STUB>>/babel-plugin-transform-flow-strip-types_v^6.22.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-transform-flow-strip-types'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-transform-flow-strip-types' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-transform-flow-strip-types/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-transform-flow-strip-types/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-transform-flow-strip-types/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x.js",
    "content": "// flow-typed signature: f6c2beb241a516f09a244db3f507b116\n// flow-typed version: <<STUB>>/babel-plugin-transform-object-rest-spread_v^6.23.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-plugin-transform-object-rest-spread'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-plugin-transform-object-rest-spread' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-plugin-transform-object-rest-spread/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-plugin-transform-object-rest-spread/lib/index.js' {\n  declare module.exports: $Exports<'babel-plugin-transform-object-rest-spread/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/babel-preset-env_vx.x.x.js",
    "content": "// flow-typed signature: b0aead40d7a2a57e471b27e991cfaed7\n// flow-typed version: <<STUB>>/babel-preset-env_v^1.5.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'babel-preset-env'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'babel-preset-env' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'babel-preset-env/data/built-in-features' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/data/plugin-features' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/default-includes' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/module-transformations' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/normalize-options' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/targets-parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/transform-polyfill-require-plugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'babel-preset-env/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'babel-preset-env/data/built-in-features.js' {\n  declare module.exports: $Exports<'babel-preset-env/data/built-in-features'>;\n}\ndeclare module 'babel-preset-env/data/plugin-features.js' {\n  declare module.exports: $Exports<'babel-preset-env/data/plugin-features'>;\n}\ndeclare module 'babel-preset-env/lib/default-includes.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/default-includes'>;\n}\ndeclare module 'babel-preset-env/lib/index.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/index'>;\n}\ndeclare module 'babel-preset-env/lib/module-transformations.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/module-transformations'>;\n}\ndeclare module 'babel-preset-env/lib/normalize-options.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/normalize-options'>;\n}\ndeclare module 'babel-preset-env/lib/targets-parser.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/targets-parser'>;\n}\ndeclare module 'babel-preset-env/lib/transform-polyfill-require-plugin.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/transform-polyfill-require-plugin'>;\n}\ndeclare module 'babel-preset-env/lib/utils.js' {\n  declare module.exports: $Exports<'babel-preset-env/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/backpack-core_vx.x.x.js",
    "content": "// flow-typed signature: 395e1bae3d6ea3ec1dc87ac1a5086143\n// flow-typed version: <<STUB>>/backpack-core_v^0.4.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'backpack-core'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'backpack-core' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'backpack-core/babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'backpack-core/config/paths' {\n  declare module.exports: any;\n}\n\ndeclare module 'backpack-core/config/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'backpack-core/babel.js' {\n  declare module.exports: $Exports<'backpack-core/babel'>;\n}\ndeclare module 'backpack-core/config/paths.js' {\n  declare module.exports: $Exports<'backpack-core/config/paths'>;\n}\ndeclare module 'backpack-core/config/webpack.config.js' {\n  declare module.exports: $Exports<'backpack-core/config/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/bad-words_vx.x.x.js",
    "content": "// flow-typed signature: 191b454033816150d2194336e74fbe32\n// flow-typed version: <<STUB>>/bad-words_v^1.6.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'bad-words'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'bad-words' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'bad-words/lib/badwords' {\n  declare module.exports: any;\n}\n\ndeclare module 'bad-words/test/addWords' {\n  declare module.exports: any;\n}\n\ndeclare module 'bad-words/test/filter' {\n  declare module.exports: any;\n}\n\ndeclare module 'bad-words/test/isProfane' {\n  declare module.exports: any;\n}\n\ndeclare module 'bad-words/test/removeWords' {\n  declare module.exports: any;\n}\n\ndeclare module 'bad-words/test/replaceWord' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'bad-words/lib/badwords.js' {\n  declare module.exports: $Exports<'bad-words/lib/badwords'>;\n}\ndeclare module 'bad-words/test/addWords.js' {\n  declare module.exports: $Exports<'bad-words/test/addWords'>;\n}\ndeclare module 'bad-words/test/filter.js' {\n  declare module.exports: $Exports<'bad-words/test/filter'>;\n}\ndeclare module 'bad-words/test/isProfane.js' {\n  declare module.exports: $Exports<'bad-words/test/isProfane'>;\n}\ndeclare module 'bad-words/test/removeWords.js' {\n  declare module.exports: $Exports<'bad-words/test/removeWords'>;\n}\ndeclare module 'bad-words/test/replaceWord.js' {\n  declare module.exports: $Exports<'bad-words/test/replaceWord'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/bluebird_vx.x.x.js",
    "content": "// flow-typed signature: fd6015492cc31b2750e3b5e1b048858f\n// flow-typed version: <<STUB>>/bluebird_v3.5.3/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'bluebird'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'bluebird' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'bluebird/js/browser/bluebird.core' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/browser/bluebird.core.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/browser/bluebird' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/browser/bluebird.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/any' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/assert' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/async' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/bind' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/bluebird' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/call_get' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/cancel' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/catch_filter' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/context' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/debuggability' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/direct_resolve' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/each' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/errors' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/es5' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/filter' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/finally' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/generators' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/join' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/map' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/method' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/nodeback' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/nodeify' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/promise_array' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/promise' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/promisify' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/props' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/queue' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/race' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/reduce' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/schedule' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/settle' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/some' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/synchronous_inspection' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/thenables' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/timers' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/using' {\n  declare module.exports: any;\n}\n\ndeclare module 'bluebird/js/release/util' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'bluebird/js/browser/bluebird.core.js' {\n  declare module.exports: $Exports<'bluebird/js/browser/bluebird.core'>;\n}\ndeclare module 'bluebird/js/browser/bluebird.core.min.js' {\n  declare module.exports: $Exports<'bluebird/js/browser/bluebird.core.min'>;\n}\ndeclare module 'bluebird/js/browser/bluebird.js' {\n  declare module.exports: $Exports<'bluebird/js/browser/bluebird'>;\n}\ndeclare module 'bluebird/js/browser/bluebird.min.js' {\n  declare module.exports: $Exports<'bluebird/js/browser/bluebird.min'>;\n}\ndeclare module 'bluebird/js/release/any.js' {\n  declare module.exports: $Exports<'bluebird/js/release/any'>;\n}\ndeclare module 'bluebird/js/release/assert.js' {\n  declare module.exports: $Exports<'bluebird/js/release/assert'>;\n}\ndeclare module 'bluebird/js/release/async.js' {\n  declare module.exports: $Exports<'bluebird/js/release/async'>;\n}\ndeclare module 'bluebird/js/release/bind.js' {\n  declare module.exports: $Exports<'bluebird/js/release/bind'>;\n}\ndeclare module 'bluebird/js/release/bluebird.js' {\n  declare module.exports: $Exports<'bluebird/js/release/bluebird'>;\n}\ndeclare module 'bluebird/js/release/call_get.js' {\n  declare module.exports: $Exports<'bluebird/js/release/call_get'>;\n}\ndeclare module 'bluebird/js/release/cancel.js' {\n  declare module.exports: $Exports<'bluebird/js/release/cancel'>;\n}\ndeclare module 'bluebird/js/release/catch_filter.js' {\n  declare module.exports: $Exports<'bluebird/js/release/catch_filter'>;\n}\ndeclare module 'bluebird/js/release/context.js' {\n  declare module.exports: $Exports<'bluebird/js/release/context'>;\n}\ndeclare module 'bluebird/js/release/debuggability.js' {\n  declare module.exports: $Exports<'bluebird/js/release/debuggability'>;\n}\ndeclare module 'bluebird/js/release/direct_resolve.js' {\n  declare module.exports: $Exports<'bluebird/js/release/direct_resolve'>;\n}\ndeclare module 'bluebird/js/release/each.js' {\n  declare module.exports: $Exports<'bluebird/js/release/each'>;\n}\ndeclare module 'bluebird/js/release/errors.js' {\n  declare module.exports: $Exports<'bluebird/js/release/errors'>;\n}\ndeclare module 'bluebird/js/release/es5.js' {\n  declare module.exports: $Exports<'bluebird/js/release/es5'>;\n}\ndeclare module 'bluebird/js/release/filter.js' {\n  declare module.exports: $Exports<'bluebird/js/release/filter'>;\n}\ndeclare module 'bluebird/js/release/finally.js' {\n  declare module.exports: $Exports<'bluebird/js/release/finally'>;\n}\ndeclare module 'bluebird/js/release/generators.js' {\n  declare module.exports: $Exports<'bluebird/js/release/generators'>;\n}\ndeclare module 'bluebird/js/release/join.js' {\n  declare module.exports: $Exports<'bluebird/js/release/join'>;\n}\ndeclare module 'bluebird/js/release/map.js' {\n  declare module.exports: $Exports<'bluebird/js/release/map'>;\n}\ndeclare module 'bluebird/js/release/method.js' {\n  declare module.exports: $Exports<'bluebird/js/release/method'>;\n}\ndeclare module 'bluebird/js/release/nodeback.js' {\n  declare module.exports: $Exports<'bluebird/js/release/nodeback'>;\n}\ndeclare module 'bluebird/js/release/nodeify.js' {\n  declare module.exports: $Exports<'bluebird/js/release/nodeify'>;\n}\ndeclare module 'bluebird/js/release/promise_array.js' {\n  declare module.exports: $Exports<'bluebird/js/release/promise_array'>;\n}\ndeclare module 'bluebird/js/release/promise.js' {\n  declare module.exports: $Exports<'bluebird/js/release/promise'>;\n}\ndeclare module 'bluebird/js/release/promisify.js' {\n  declare module.exports: $Exports<'bluebird/js/release/promisify'>;\n}\ndeclare module 'bluebird/js/release/props.js' {\n  declare module.exports: $Exports<'bluebird/js/release/props'>;\n}\ndeclare module 'bluebird/js/release/queue.js' {\n  declare module.exports: $Exports<'bluebird/js/release/queue'>;\n}\ndeclare module 'bluebird/js/release/race.js' {\n  declare module.exports: $Exports<'bluebird/js/release/race'>;\n}\ndeclare module 'bluebird/js/release/reduce.js' {\n  declare module.exports: $Exports<'bluebird/js/release/reduce'>;\n}\ndeclare module 'bluebird/js/release/schedule.js' {\n  declare module.exports: $Exports<'bluebird/js/release/schedule'>;\n}\ndeclare module 'bluebird/js/release/settle.js' {\n  declare module.exports: $Exports<'bluebird/js/release/settle'>;\n}\ndeclare module 'bluebird/js/release/some.js' {\n  declare module.exports: $Exports<'bluebird/js/release/some'>;\n}\ndeclare module 'bluebird/js/release/synchronous_inspection.js' {\n  declare module.exports: $Exports<'bluebird/js/release/synchronous_inspection'>;\n}\ndeclare module 'bluebird/js/release/thenables.js' {\n  declare module.exports: $Exports<'bluebird/js/release/thenables'>;\n}\ndeclare module 'bluebird/js/release/timers.js' {\n  declare module.exports: $Exports<'bluebird/js/release/timers'>;\n}\ndeclare module 'bluebird/js/release/using.js' {\n  declare module.exports: $Exports<'bluebird/js/release/using'>;\n}\ndeclare module 'bluebird/js/release/util.js' {\n  declare module.exports: $Exports<'bluebird/js/release/util'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/body-parser_v1.x.x.js",
    "content": "// flow-typed signature: 18dadbe162b608c79b9b31c3d2f1c822\n// flow-typed version: b43dff3e0e/body-parser_v1.x.x/flow_>=v0.17.x\n\nimport type { Middleware, $Request, $Response } from 'express';\n\ndeclare type bodyParser$Options = {\n  inflate?: boolean,\n  limit?: number | string,\n  type?: string | string[] | ((req: $Request) => any),\n  verify?: (\n    req: $Request,\n    res: $Response,\n    buf: Buffer,\n    encoding: string\n  ) => void,\n};\n\ndeclare type bodyParser$OptionsText = bodyParser$Options & {\n  reviver?: (key: string, value: any) => any,\n  strict?: boolean,\n};\n\ndeclare type bodyParser$OptionsJson = bodyParser$Options & {\n  reviver?: (key: string, value: any) => any,\n  strict?: boolean,\n};\n\ndeclare type bodyParser$OptionsUrlencoded = bodyParser$Options & {\n  extended?: boolean,\n  parameterLimit?: number,\n};\n\ndeclare module 'body-parser' {\n  declare type Options = bodyParser$Options;\n  declare type OptionsText = bodyParser$OptionsText;\n  declare type OptionsJson = bodyParser$OptionsJson;\n  declare type OptionsUrlencoded = bodyParser$OptionsUrlencoded;\n\n  declare function json(options?: OptionsJson): Middleware;\n\n  declare function raw(options?: Options): Middleware;\n\n  declare function text(options?: OptionsText): Middleware;\n\n  declare function urlencoded(options?: OptionsUrlencoded): Middleware;\n}\n"
  },
  {
    "path": "flow-typed/npm/casual_vx.x.x.js",
    "content": "// flow-typed signature: 1787c661cd96c2da7c25e678aebdf0ed\n// flow-typed version: <<STUB>>/casual_v^1.5.19/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'casual'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'casual' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'casual/src/casual' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ar_SY/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ar_SY/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ar_SY/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ar_SY/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ar_SY/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/de_DE/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/de_DE/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/de_DE/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/de_DE/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/en_CA/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/en_US/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/fr_FR/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/fr_FR/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/id_ID/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/internet' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_CH/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_CH/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_CH/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_IT/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_IT/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/it_IT/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/misc' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nb_NO/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nb_NO/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nb_NO/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nb_NO/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nl_NL/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/nl_NL/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/number' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/payment' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/pt_BR/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/pt_BR/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/pt_BR/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ro_RO/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ro_RO/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ro_RO/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ru_RU/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ru_RU/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ru_RU/internet' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ru_RU/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/ru_RU/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/sv_SE/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/sv_SE/person' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/sv_SE/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/uk_UA/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/uk_UA/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/src/providers/uk_UA/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/test/casual' {\n  declare module.exports: any;\n}\n\ndeclare module 'casual/utils/show' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'casual/src/casual.js' {\n  declare module.exports: $Exports<'casual/src/casual'>;\n}\ndeclare module 'casual/src/helpers.js' {\n  declare module.exports: $Exports<'casual/src/helpers'>;\n}\ndeclare module 'casual/src/providers/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/address'>;\n}\ndeclare module 'casual/src/providers/ar_SY/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/ar_SY/address'>;\n}\ndeclare module 'casual/src/providers/ar_SY/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/ar_SY/color'>;\n}\ndeclare module 'casual/src/providers/ar_SY/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/ar_SY/date'>;\n}\ndeclare module 'casual/src/providers/ar_SY/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/ar_SY/person'>;\n}\ndeclare module 'casual/src/providers/ar_SY/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/ar_SY/text'>;\n}\ndeclare module 'casual/src/providers/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/color'>;\n}\ndeclare module 'casual/src/providers/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/date'>;\n}\ndeclare module 'casual/src/providers/de_DE/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/de_DE/address'>;\n}\ndeclare module 'casual/src/providers/de_DE/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/de_DE/date'>;\n}\ndeclare module 'casual/src/providers/de_DE/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/de_DE/person'>;\n}\ndeclare module 'casual/src/providers/de_DE/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/de_DE/text'>;\n}\ndeclare module 'casual/src/providers/en_CA/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/en_CA/address'>;\n}\ndeclare module 'casual/src/providers/en_US/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/en_US/address'>;\n}\ndeclare module 'casual/src/providers/fr_FR/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/fr_FR/address'>;\n}\ndeclare module 'casual/src/providers/fr_FR/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/fr_FR/person'>;\n}\ndeclare module 'casual/src/providers/id_ID/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/id_ID/address'>;\n}\ndeclare module 'casual/src/providers/internet.js' {\n  declare module.exports: $Exports<'casual/src/providers/internet'>;\n}\ndeclare module 'casual/src/providers/it_CH/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_CH/address'>;\n}\ndeclare module 'casual/src/providers/it_CH/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_CH/date'>;\n}\ndeclare module 'casual/src/providers/it_CH/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_CH/person'>;\n}\ndeclare module 'casual/src/providers/it_IT/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_IT/address'>;\n}\ndeclare module 'casual/src/providers/it_IT/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_IT/date'>;\n}\ndeclare module 'casual/src/providers/it_IT/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/it_IT/person'>;\n}\ndeclare module 'casual/src/providers/misc.js' {\n  declare module.exports: $Exports<'casual/src/providers/misc'>;\n}\ndeclare module 'casual/src/providers/nb_NO/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/nb_NO/address'>;\n}\ndeclare module 'casual/src/providers/nb_NO/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/nb_NO/color'>;\n}\ndeclare module 'casual/src/providers/nb_NO/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/nb_NO/date'>;\n}\ndeclare module 'casual/src/providers/nb_NO/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/nb_NO/person'>;\n}\ndeclare module 'casual/src/providers/nl_NL/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/nl_NL/address'>;\n}\ndeclare module 'casual/src/providers/nl_NL/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/nl_NL/person'>;\n}\ndeclare module 'casual/src/providers/number.js' {\n  declare module.exports: $Exports<'casual/src/providers/number'>;\n}\ndeclare module 'casual/src/providers/payment.js' {\n  declare module.exports: $Exports<'casual/src/providers/payment'>;\n}\ndeclare module 'casual/src/providers/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/person'>;\n}\ndeclare module 'casual/src/providers/pt_BR/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/pt_BR/address'>;\n}\ndeclare module 'casual/src/providers/pt_BR/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/pt_BR/color'>;\n}\ndeclare module 'casual/src/providers/pt_BR/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/pt_BR/person'>;\n}\ndeclare module 'casual/src/providers/ro_RO/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/ro_RO/address'>;\n}\ndeclare module 'casual/src/providers/ro_RO/date.js' {\n  declare module.exports: $Exports<'casual/src/providers/ro_RO/date'>;\n}\ndeclare module 'casual/src/providers/ro_RO/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/ro_RO/person'>;\n}\ndeclare module 'casual/src/providers/ru_RU/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/ru_RU/address'>;\n}\ndeclare module 'casual/src/providers/ru_RU/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/ru_RU/color'>;\n}\ndeclare module 'casual/src/providers/ru_RU/internet.js' {\n  declare module.exports: $Exports<'casual/src/providers/ru_RU/internet'>;\n}\ndeclare module 'casual/src/providers/ru_RU/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/ru_RU/person'>;\n}\ndeclare module 'casual/src/providers/ru_RU/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/ru_RU/text'>;\n}\ndeclare module 'casual/src/providers/sv_SE/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/sv_SE/address'>;\n}\ndeclare module 'casual/src/providers/sv_SE/person.js' {\n  declare module.exports: $Exports<'casual/src/providers/sv_SE/person'>;\n}\ndeclare module 'casual/src/providers/sv_SE/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/sv_SE/text'>;\n}\ndeclare module 'casual/src/providers/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/text'>;\n}\ndeclare module 'casual/src/providers/uk_UA/address.js' {\n  declare module.exports: $Exports<'casual/src/providers/uk_UA/address'>;\n}\ndeclare module 'casual/src/providers/uk_UA/color.js' {\n  declare module.exports: $Exports<'casual/src/providers/uk_UA/color'>;\n}\ndeclare module 'casual/src/providers/uk_UA/text.js' {\n  declare module.exports: $Exports<'casual/src/providers/uk_UA/text'>;\n}\ndeclare module 'casual/test/casual.js' {\n  declare module.exports: $Exports<'casual/test/casual'>;\n}\ndeclare module 'casual/utils/show.js' {\n  declare module.exports: $Exports<'casual/utils/show'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cheerio_vx.x.x.js",
    "content": "// flow-typed signature: 2d9e14a22205cc71eefd684e2070eed1\n// flow-typed version: <<STUB>>/cheerio_v^1.0.0-rc.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cheerio'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cheerio' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'cheerio/lib/api/attributes' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/api/css' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/api/forms' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/api/manipulation' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/api/traversing' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/cheerio' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/options' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/static' {\n  declare module.exports: any;\n}\n\ndeclare module 'cheerio/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'cheerio/index' {\n  declare module.exports: $Exports<'cheerio'>;\n}\ndeclare module 'cheerio/index.js' {\n  declare module.exports: $Exports<'cheerio'>;\n}\ndeclare module 'cheerio/lib/api/attributes.js' {\n  declare module.exports: $Exports<'cheerio/lib/api/attributes'>;\n}\ndeclare module 'cheerio/lib/api/css.js' {\n  declare module.exports: $Exports<'cheerio/lib/api/css'>;\n}\ndeclare module 'cheerio/lib/api/forms.js' {\n  declare module.exports: $Exports<'cheerio/lib/api/forms'>;\n}\ndeclare module 'cheerio/lib/api/manipulation.js' {\n  declare module.exports: $Exports<'cheerio/lib/api/manipulation'>;\n}\ndeclare module 'cheerio/lib/api/traversing.js' {\n  declare module.exports: $Exports<'cheerio/lib/api/traversing'>;\n}\ndeclare module 'cheerio/lib/cheerio.js' {\n  declare module.exports: $Exports<'cheerio/lib/cheerio'>;\n}\ndeclare module 'cheerio/lib/options.js' {\n  declare module.exports: $Exports<'cheerio/lib/options'>;\n}\ndeclare module 'cheerio/lib/parse.js' {\n  declare module.exports: $Exports<'cheerio/lib/parse'>;\n}\ndeclare module 'cheerio/lib/static.js' {\n  declare module.exports: $Exports<'cheerio/lib/static'>;\n}\ndeclare module 'cheerio/lib/utils.js' {\n  declare module.exports: $Exports<'cheerio/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/common-tags_v1.4.x.js",
    "content": "// flow-typed signature: e60dc0f96d7d55734050073860bea369\n// flow-typed version: de4764766b/common-tags_v1.4.x/flow_>=v0.25.x\n\n/**\n * @flow\n */\n\ndeclare module \"common-tags\" {\n  declare type TaggedTemplate = (\n    strings: Array<string>,\n    ...interpolations: Array<any>\n  ) => string;\n\n  declare type TemplateTransformer = {\n    onSubstitution?: (substitution: string, resultSoFar: string) => string,\n    onEndResult?: (endResult: string) => string\n  };\n\n  // Built-in tagged template literals\n  declare export var html: TaggedTemplate;\n  declare export var source: TaggedTemplate;\n  declare export var codeBlock: TaggedTemplate;\n  declare export var safeHtml: TaggedTemplate;\n  declare export var oneLine: TaggedTemplate;\n  declare export var oneLineTrim: TaggedTemplate;\n  declare export var oneLineCommaLists: TaggedTemplate;\n  declare export var oneLineCommaListsOr: TaggedTemplate;\n  declare export var oneLineCommaListsAnd: TaggedTemplate;\n  declare export var stripIndent: TaggedTemplate;\n  declare export var stripIndents: TaggedTemplate;\n  declare export var inlineLists: TaggedTemplate;\n  declare export var oneLineInlineLists: TaggedTemplate;\n  declare export var commaLists: TaggedTemplate;\n  declare export var commaListsOr: TaggedTemplate;\n  declare export var commaListsAnd: TaggedTemplate;\n\n  // Class for creating a new tagged template literal\n  declare export class TemplateTag {\n    constructor(): TemplateTag;\n    constructor(transformers: Array<TemplateTransformer>): TemplateTag;\n    constructor(...transformers: Array<TemplateTransformer>): TemplateTag;\n  }\n\n  // Built-in transformers\n  declare export var trimResultTransformer: (\n    side?: \"left\" | \"right\"\n  ) => TemplateTransformer;\n\n  declare export var stripIndentTransformer: (\n    type?: \"initial\" | \"all\"\n  ) => TemplateTransformer;\n\n  declare export var replaceResultTransformer: (\n    replaceWhat: string | RegExp,\n    replaceWith: string\n  ) => TemplateTransformer;\n\n  declare export var replaceSubstitutionTransformer: (\n    replaceWhat: string | RegExp,\n    replaceWith: string\n  ) => TemplateTransformer;\n\n  declare export var inlineArrayTransformer: (opts?: {\n    separator?: string,\n    conjunction?: string\n  }) => TemplateTransformer;\n\n  declare export var splitStringTransformer: (\n    splitBy: string\n  ) => TemplateTransformer;\n}\n"
  },
  {
    "path": "flow-typed/npm/compression_vx.x.x.js",
    "content": "// flow-typed signature: 54dd45f1f03e5eb6ad575b1d9116f427\n// flow-typed version: <<STUB>>/compression_v1.7.1/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'compression'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'compression' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'compression/index' {\n  declare module.exports: $Exports<'compression'>;\n}\ndeclare module 'compression/index.js' {\n  declare module.exports: $Exports<'compression'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cookie-parser_vx.x.x.js",
    "content": "// flow-typed signature: 79bd6aba0258c63b7a7a02181e87bcad\n// flow-typed version: <<STUB>>/cookie-parser_v^1.4.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cookie-parser'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cookie-parser' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'cookie-parser/index' {\n  declare module.exports: $Exports<'cookie-parser'>;\n}\ndeclare module 'cookie-parser/index.js' {\n  declare module.exports: $Exports<'cookie-parser'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cookie-session_vx.x.x.js",
    "content": "// flow-typed signature: 99fa9abc0635e47c2ed5e804b6dc1004\n// flow-typed version: <<STUB>>/cookie-session_v^2.0.0-beta.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cookie-session'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cookie-session' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'cookie-session/index' {\n  declare module.exports: $Exports<'cookie-session'>;\n}\ndeclare module 'cookie-session/index.js' {\n  declare module.exports: $Exports<'cookie-session'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cors_vx.x.x.js",
    "content": "// flow-typed signature: 68969a04a0652c58dc9a661976f58d70\n// flow-typed version: <<STUB>>/cors_v^2.8.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cors'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cors' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'cors/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/basic-auth' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/body-events' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/cors' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/error-response' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/example-app' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/issue-2' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/issue-31' {\n  declare module.exports: any;\n}\n\ndeclare module 'cors/test/support/env' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'cors/lib/index.js' {\n  declare module.exports: $Exports<'cors/lib/index'>;\n}\ndeclare module 'cors/test/basic-auth.js' {\n  declare module.exports: $Exports<'cors/test/basic-auth'>;\n}\ndeclare module 'cors/test/body-events.js' {\n  declare module.exports: $Exports<'cors/test/body-events'>;\n}\ndeclare module 'cors/test/cors.js' {\n  declare module.exports: $Exports<'cors/test/cors'>;\n}\ndeclare module 'cors/test/error-response.js' {\n  declare module.exports: $Exports<'cors/test/error-response'>;\n}\ndeclare module 'cors/test/example-app.js' {\n  declare module.exports: $Exports<'cors/test/example-app'>;\n}\ndeclare module 'cors/test/issue-2.js' {\n  declare module.exports: $Exports<'cors/test/issue-2'>;\n}\ndeclare module 'cors/test/issue-31.js' {\n  declare module.exports: $Exports<'cors/test/issue-31'>;\n}\ndeclare module 'cors/test/support/env.js' {\n  declare module.exports: $Exports<'cors/test/support/env'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cross-env_vx.x.x.js",
    "content": "// flow-typed signature: c934ed64e5d3c25e3b704b8c9c8ee8be\n// flow-typed version: <<STUB>>/cross-env_v^5.0.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cross-env'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cross-env' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'cross-env/dist/bin/cross-env-shell' {\n  declare module.exports: any;\n}\n\ndeclare module 'cross-env/dist/bin/cross-env' {\n  declare module.exports: any;\n}\n\ndeclare module 'cross-env/dist/command' {\n  declare module.exports: any;\n}\n\ndeclare module 'cross-env/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'cross-env/dist/variable' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'cross-env/dist/bin/cross-env-shell.js' {\n  declare module.exports: $Exports<'cross-env/dist/bin/cross-env-shell'>;\n}\ndeclare module 'cross-env/dist/bin/cross-env.js' {\n  declare module.exports: $Exports<'cross-env/dist/bin/cross-env'>;\n}\ndeclare module 'cross-env/dist/command.js' {\n  declare module.exports: $Exports<'cross-env/dist/command'>;\n}\ndeclare module 'cross-env/dist/index.js' {\n  declare module.exports: $Exports<'cross-env/dist/index'>;\n}\ndeclare module 'cross-env/dist/variable.js' {\n  declare module.exports: $Exports<'cross-env/dist/variable'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/cryptr_vx.x.x.js",
    "content": "// flow-typed signature: 75dc078152e6e97382b34bbe99dcaf4f\n// flow-typed version: <<STUB>>/cryptr_v3.0.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'cryptr'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'cryptr' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'cryptr/tests/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'cryptr/index' {\n  declare module.exports: $Exports<'cryptr'>;\n}\ndeclare module 'cryptr/index.js' {\n  declare module.exports: $Exports<'cryptr'>;\n}\ndeclare module 'cryptr/tests/index.js' {\n  declare module.exports: $Exports<'cryptr/tests/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/css.escape_vx.x.x.js",
    "content": "// flow-typed signature: d19f9ae683d024b199d9ab71b4f59caa\n// flow-typed version: <<STUB>>/css.escape_v1.5.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'css.escape'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'css.escape' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'css.escape/css.escape' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'css.escape/css.escape.js' {\n  declare module.exports: $Exports<'css.escape/css.escape'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/d3-array_vx.x.x.js",
    "content": "// flow-typed signature: 8a1fe35a0f1cbef7caf7734f328697de\n// flow-typed version: <<STUB>>/d3-array_v^1.2.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'd3-array'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'd3-array' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'd3-array/build/d3-array' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/build/d3-array.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/array' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/ascending' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/bisect' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/bisector' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/constant' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/cross' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/descending' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/deviation' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/extent' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/histogram' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/identity' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/max' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/mean' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/median' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/merge' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/min' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/number' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/pairs' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/permute' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/quantile' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/range' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/scan' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/shuffle' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/sum' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/threshold/freedmanDiaconis' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/threshold/scott' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/threshold/sturges' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/ticks' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/transpose' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/variance' {\n  declare module.exports: any;\n}\n\ndeclare module 'd3-array/src/zip' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'd3-array/build/d3-array.js' {\n  declare module.exports: $Exports<'d3-array/build/d3-array'>;\n}\ndeclare module 'd3-array/build/d3-array.min.js' {\n  declare module.exports: $Exports<'d3-array/build/d3-array.min'>;\n}\ndeclare module 'd3-array/index' {\n  declare module.exports: $Exports<'d3-array'>;\n}\ndeclare module 'd3-array/index.js' {\n  declare module.exports: $Exports<'d3-array'>;\n}\ndeclare module 'd3-array/src/array.js' {\n  declare module.exports: $Exports<'d3-array/src/array'>;\n}\ndeclare module 'd3-array/src/ascending.js' {\n  declare module.exports: $Exports<'d3-array/src/ascending'>;\n}\ndeclare module 'd3-array/src/bisect.js' {\n  declare module.exports: $Exports<'d3-array/src/bisect'>;\n}\ndeclare module 'd3-array/src/bisector.js' {\n  declare module.exports: $Exports<'d3-array/src/bisector'>;\n}\ndeclare module 'd3-array/src/constant.js' {\n  declare module.exports: $Exports<'d3-array/src/constant'>;\n}\ndeclare module 'd3-array/src/cross.js' {\n  declare module.exports: $Exports<'d3-array/src/cross'>;\n}\ndeclare module 'd3-array/src/descending.js' {\n  declare module.exports: $Exports<'d3-array/src/descending'>;\n}\ndeclare module 'd3-array/src/deviation.js' {\n  declare module.exports: $Exports<'d3-array/src/deviation'>;\n}\ndeclare module 'd3-array/src/extent.js' {\n  declare module.exports: $Exports<'d3-array/src/extent'>;\n}\ndeclare module 'd3-array/src/histogram.js' {\n  declare module.exports: $Exports<'d3-array/src/histogram'>;\n}\ndeclare module 'd3-array/src/identity.js' {\n  declare module.exports: $Exports<'d3-array/src/identity'>;\n}\ndeclare module 'd3-array/src/max.js' {\n  declare module.exports: $Exports<'d3-array/src/max'>;\n}\ndeclare module 'd3-array/src/mean.js' {\n  declare module.exports: $Exports<'d3-array/src/mean'>;\n}\ndeclare module 'd3-array/src/median.js' {\n  declare module.exports: $Exports<'d3-array/src/median'>;\n}\ndeclare module 'd3-array/src/merge.js' {\n  declare module.exports: $Exports<'d3-array/src/merge'>;\n}\ndeclare module 'd3-array/src/min.js' {\n  declare module.exports: $Exports<'d3-array/src/min'>;\n}\ndeclare module 'd3-array/src/number.js' {\n  declare module.exports: $Exports<'d3-array/src/number'>;\n}\ndeclare module 'd3-array/src/pairs.js' {\n  declare module.exports: $Exports<'d3-array/src/pairs'>;\n}\ndeclare module 'd3-array/src/permute.js' {\n  declare module.exports: $Exports<'d3-array/src/permute'>;\n}\ndeclare module 'd3-array/src/quantile.js' {\n  declare module.exports: $Exports<'d3-array/src/quantile'>;\n}\ndeclare module 'd3-array/src/range.js' {\n  declare module.exports: $Exports<'d3-array/src/range'>;\n}\ndeclare module 'd3-array/src/scan.js' {\n  declare module.exports: $Exports<'d3-array/src/scan'>;\n}\ndeclare module 'd3-array/src/shuffle.js' {\n  declare module.exports: $Exports<'d3-array/src/shuffle'>;\n}\ndeclare module 'd3-array/src/sum.js' {\n  declare module.exports: $Exports<'d3-array/src/sum'>;\n}\ndeclare module 'd3-array/src/threshold/freedmanDiaconis.js' {\n  declare module.exports: $Exports<'d3-array/src/threshold/freedmanDiaconis'>;\n}\ndeclare module 'd3-array/src/threshold/scott.js' {\n  declare module.exports: $Exports<'d3-array/src/threshold/scott'>;\n}\ndeclare module 'd3-array/src/threshold/sturges.js' {\n  declare module.exports: $Exports<'d3-array/src/threshold/sturges'>;\n}\ndeclare module 'd3-array/src/ticks.js' {\n  declare module.exports: $Exports<'d3-array/src/ticks'>;\n}\ndeclare module 'd3-array/src/transpose.js' {\n  declare module.exports: $Exports<'d3-array/src/transpose'>;\n}\ndeclare module 'd3-array/src/variance.js' {\n  declare module.exports: $Exports<'d3-array/src/variance'>;\n}\ndeclare module 'd3-array/src/zip.js' {\n  declare module.exports: $Exports<'d3-array/src/zip'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-flow_vx.x.x.js",
    "content": "// flow-typed signature: 45f3a6b6919397f3ea67b75c1a9601bf\n// flow-typed version: <<STUB>>/danger-plugin-flow_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-flow'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-flow' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-flow/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-flow/dist/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-flow/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-flow/dist/index'>;\n}\ndeclare module 'danger-plugin-flow/dist/index.test.js' {\n  declare module.exports: $Exports<'danger-plugin-flow/dist/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-jest_vx.x.x.js",
    "content": "// flow-typed signature: 0bc9953088789fa140d0772a738d8153\n// flow-typed version: <<STUB>>/danger-plugin-jest_v^1.1.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-jest'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-jest' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-jest/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-jest/dist/types' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-jest/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-jest/dist/index'>;\n}\ndeclare module 'danger-plugin-jest/dist/types.js' {\n  declare module.exports: $Exports<'danger-plugin-jest/dist/types'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-labels_vx.x.x.js",
    "content": "// flow-typed signature: e326fed0053f2fd1e205c7be2196f5b5\n// flow-typed version: <<STUB>>/danger-plugin-labels_v1.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-labels'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-labels' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-labels/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-labels/dist/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-labels/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-labels/dist/index'>;\n}\ndeclare module 'danger-plugin-labels/dist/index.test.js' {\n  declare module.exports: $Exports<'danger-plugin-labels/dist/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-no-console_vx.x.x.js",
    "content": "// flow-typed signature: be735722bffb485a8cf54a7c7080821a\n// flow-typed version: <<STUB>>/danger-plugin-no-console_v1.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-no-console'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-no-console' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-no-console/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/inherited-summary' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/inner-link' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/manual' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/patch-for-local' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/prettify/prettify' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/pretty-print' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/search_index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/search' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-no-console/docs/script/test-summary' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-no-console/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/dist/index'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/inherited-summary.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/inherited-summary'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/inner-link.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/inner-link'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/manual.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/manual'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/patch-for-local.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/patch-for-local'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/prettify/prettify.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/prettify/prettify'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/pretty-print.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/pretty-print'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/search_index.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/search_index'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/search.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/search'>;\n}\ndeclare module 'danger-plugin-no-console/docs/script/test-summary.js' {\n  declare module.exports: $Exports<'danger-plugin-no-console/docs/script/test-summary'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-no-test-shortcuts_vx.x.x.js",
    "content": "// flow-typed signature: 6eac443fa8195b12d311468f9d3dfcb8\n// flow-typed version: <<STUB>>/danger-plugin-no-test-shortcuts_v^2.0.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-no-test-shortcuts'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-no-test-shortcuts' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-no-test-shortcuts/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-no-test-shortcuts/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-no-test-shortcuts/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger-plugin-yarn_vx.x.x.js",
    "content": "// flow-typed signature: 7b69917a67b22d12810ba89bc8ffdec2\n// flow-typed version: <<STUB>>/danger-plugin-yarn_v^1.2.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger-plugin-yarn'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger-plugin-yarn' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger-plugin-yarn/dist/danger-mock' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-yarn/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger-plugin-yarn/dist/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger-plugin-yarn/dist/danger-mock.js' {\n  declare module.exports: $Exports<'danger-plugin-yarn/dist/danger-mock'>;\n}\ndeclare module 'danger-plugin-yarn/dist/index.js' {\n  declare module.exports: $Exports<'danger-plugin-yarn/dist/index'>;\n}\ndeclare module 'danger-plugin-yarn/dist/index.test.js' {\n  declare module.exports: $Exports<'danger-plugin-yarn/dist/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/danger_vx.x.x.js",
    "content": "// flow-typed signature: 9a4f89440762daa780f3c48b41660b25\n// flow-typed version: <<STUB>>/danger_v3.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'danger'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'danger' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'danger/dangerfile.circle' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/dangerfile.flow' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/api/fetch' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/ci_source_helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/ci_source' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/get_ci_source' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Bitrise' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/BuddyBuild' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Buildkite' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Circle' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Codeship' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/DockerCloud' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Drone' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Fake' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Jenkins' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/local-repo' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Nevercode' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Semaphore' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Surf' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/Travis' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/ci_source/providers/VSTS' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/ci/runner' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-ci' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-init' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-local' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-pr' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-process' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger-runner' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/danger' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/init/add-to-ci' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/init/default-dangerfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/init/get-repo-slug' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/init/interfaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/init/state-setup' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/dangerRunToRunnerCLI' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/file-utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/getRuntimeCISource' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/reporting' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/runDangerSubprocess' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/sharedDangerfileArgs' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/commands/utils/validateDangerfileExists' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/danger' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/Aliases' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/cli-args' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/Commit' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/DangerDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/DangerResults' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/DangerUtilsDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/GitDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/GitHubDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/dsl/Violation' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/FakePlatform' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/git/diffToGitJSONDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/git/gitJSONToGitDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/git/localGetCommits' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/git/localGetDiff' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/git/localGetFileAtSHA' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/GitHub' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/github/GitHubAPI' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/github/GitHubGit' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/github/GitHubUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/github/pullRequestParser' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/LocalGit' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/platforms/platform' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/danger-dsl-json' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/Dangerfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/DangerUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/dslGenerator' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/Executor' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/json-to-context' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/jsonToDSL' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/inline' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/runner' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/utils/cleanDangerfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/utils/resultsForCaughtError' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/utils/transpiler' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/runners/vm2' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/templates/exceptionRaisedTemplate' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/distribution/runner/templates/githubIssueTemplate' {\n  declare module.exports: any;\n}\n\ndeclare module 'danger/wallaby' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'danger/dangerfile.circle.js' {\n  declare module.exports: $Exports<'danger/dangerfile.circle'>;\n}\ndeclare module 'danger/dangerfile.flow.js' {\n  declare module.exports: $Exports<'danger/dangerfile.flow'>;\n}\ndeclare module 'danger/distribution/api/fetch.js' {\n  declare module.exports: $Exports<'danger/distribution/api/fetch'>;\n}\ndeclare module 'danger/distribution/ci_source/ci_source_helpers.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/ci_source_helpers'>;\n}\ndeclare module 'danger/distribution/ci_source/ci_source.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/ci_source'>;\n}\ndeclare module 'danger/distribution/ci_source/get_ci_source.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/get_ci_source'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Bitrise.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Bitrise'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/BuddyBuild.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/BuddyBuild'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Buildkite.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Buildkite'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Circle.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Circle'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Codeship.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Codeship'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/DockerCloud.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/DockerCloud'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Drone.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Drone'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Fake.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Fake'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/index.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/index'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Jenkins.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Jenkins'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/local-repo.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/local-repo'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Nevercode.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Nevercode'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Semaphore.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Semaphore'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Surf.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Surf'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/Travis.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/Travis'>;\n}\ndeclare module 'danger/distribution/ci_source/providers/VSTS.js' {\n  declare module.exports: $Exports<'danger/distribution/ci_source/providers/VSTS'>;\n}\ndeclare module 'danger/distribution/commands/ci/runner.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/ci/runner'>;\n}\ndeclare module 'danger/distribution/commands/danger-ci.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-ci'>;\n}\ndeclare module 'danger/distribution/commands/danger-init.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-init'>;\n}\ndeclare module 'danger/distribution/commands/danger-local.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-local'>;\n}\ndeclare module 'danger/distribution/commands/danger-pr.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-pr'>;\n}\ndeclare module 'danger/distribution/commands/danger-process.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-process'>;\n}\ndeclare module 'danger/distribution/commands/danger-runner.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger-runner'>;\n}\ndeclare module 'danger/distribution/commands/danger.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/danger'>;\n}\ndeclare module 'danger/distribution/commands/init/add-to-ci.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/init/add-to-ci'>;\n}\ndeclare module 'danger/distribution/commands/init/default-dangerfile.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/init/default-dangerfile'>;\n}\ndeclare module 'danger/distribution/commands/init/get-repo-slug.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/init/get-repo-slug'>;\n}\ndeclare module 'danger/distribution/commands/init/interfaces.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/init/interfaces'>;\n}\ndeclare module 'danger/distribution/commands/init/state-setup.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/init/state-setup'>;\n}\ndeclare module 'danger/distribution/commands/utils/dangerRunToRunnerCLI.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/dangerRunToRunnerCLI'>;\n}\ndeclare module 'danger/distribution/commands/utils/file-utils.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/file-utils'>;\n}\ndeclare module 'danger/distribution/commands/utils/getRuntimeCISource.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/getRuntimeCISource'>;\n}\ndeclare module 'danger/distribution/commands/utils/reporting.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/reporting'>;\n}\ndeclare module 'danger/distribution/commands/utils/runDangerSubprocess.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/runDangerSubprocess'>;\n}\ndeclare module 'danger/distribution/commands/utils/sharedDangerfileArgs.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/sharedDangerfileArgs'>;\n}\ndeclare module 'danger/distribution/commands/utils/validateDangerfileExists.js' {\n  declare module.exports: $Exports<'danger/distribution/commands/utils/validateDangerfileExists'>;\n}\ndeclare module 'danger/distribution/danger.js' {\n  declare module.exports: $Exports<'danger/distribution/danger'>;\n}\ndeclare module 'danger/distribution/dsl/Aliases.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/Aliases'>;\n}\ndeclare module 'danger/distribution/dsl/cli-args.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/cli-args'>;\n}\ndeclare module 'danger/distribution/dsl/Commit.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/Commit'>;\n}\ndeclare module 'danger/distribution/dsl/DangerDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/DangerDSL'>;\n}\ndeclare module 'danger/distribution/dsl/DangerResults.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/DangerResults'>;\n}\ndeclare module 'danger/distribution/dsl/DangerUtilsDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/DangerUtilsDSL'>;\n}\ndeclare module 'danger/distribution/dsl/GitDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/GitDSL'>;\n}\ndeclare module 'danger/distribution/dsl/GitHubDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/GitHubDSL'>;\n}\ndeclare module 'danger/distribution/dsl/Violation.js' {\n  declare module.exports: $Exports<'danger/distribution/dsl/Violation'>;\n}\ndeclare module 'danger/distribution/platforms/FakePlatform.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/FakePlatform'>;\n}\ndeclare module 'danger/distribution/platforms/git/diffToGitJSONDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/git/diffToGitJSONDSL'>;\n}\ndeclare module 'danger/distribution/platforms/git/gitJSONToGitDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/git/gitJSONToGitDSL'>;\n}\ndeclare module 'danger/distribution/platforms/git/localGetCommits.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/git/localGetCommits'>;\n}\ndeclare module 'danger/distribution/platforms/git/localGetDiff.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/git/localGetDiff'>;\n}\ndeclare module 'danger/distribution/platforms/git/localGetFileAtSHA.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/git/localGetFileAtSHA'>;\n}\ndeclare module 'danger/distribution/platforms/GitHub.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/GitHub'>;\n}\ndeclare module 'danger/distribution/platforms/github/GitHubAPI.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubAPI'>;\n}\ndeclare module 'danger/distribution/platforms/github/GitHubGit.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubGit'>;\n}\ndeclare module 'danger/distribution/platforms/github/GitHubUtils.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/github/GitHubUtils'>;\n}\ndeclare module 'danger/distribution/platforms/github/pullRequestParser.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/github/pullRequestParser'>;\n}\ndeclare module 'danger/distribution/platforms/LocalGit.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/LocalGit'>;\n}\ndeclare module 'danger/distribution/platforms/platform.js' {\n  declare module.exports: $Exports<'danger/distribution/platforms/platform'>;\n}\ndeclare module 'danger/distribution/runner/danger-dsl-json.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/danger-dsl-json'>;\n}\ndeclare module 'danger/distribution/runner/Dangerfile.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/Dangerfile'>;\n}\ndeclare module 'danger/distribution/runner/DangerUtils.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/DangerUtils'>;\n}\ndeclare module 'danger/distribution/runner/dslGenerator.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/dslGenerator'>;\n}\ndeclare module 'danger/distribution/runner/Executor.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/Executor'>;\n}\ndeclare module 'danger/distribution/runner/json-to-context.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/json-to-context'>;\n}\ndeclare module 'danger/distribution/runner/jsonToDSL.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/jsonToDSL'>;\n}\ndeclare module 'danger/distribution/runner/runners/inline.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/inline'>;\n}\ndeclare module 'danger/distribution/runner/runners/runner.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/runner'>;\n}\ndeclare module 'danger/distribution/runner/runners/utils/cleanDangerfile.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/utils/cleanDangerfile'>;\n}\ndeclare module 'danger/distribution/runner/runners/utils/resultsForCaughtError.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/utils/resultsForCaughtError'>;\n}\ndeclare module 'danger/distribution/runner/runners/utils/transpiler.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/utils/transpiler'>;\n}\ndeclare module 'danger/distribution/runner/runners/vm2.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/runners/vm2'>;\n}\ndeclare module 'danger/distribution/runner/templates/exceptionRaisedTemplate.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/templates/exceptionRaisedTemplate'>;\n}\ndeclare module 'danger/distribution/runner/templates/githubIssueTemplate.js' {\n  declare module.exports: $Exports<'danger/distribution/runner/templates/githubIssueTemplate'>;\n}\ndeclare module 'danger/wallaby.js' {\n  declare module.exports: $Exports<'danger/wallaby'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/datadog-metrics_vx.x.x.js",
    "content": "// flow-typed signature: 4193c068fe558edea2fe8b024db8448c\n// flow-typed version: <<STUB>>/datadog-metrics_v0.8.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'datadog-metrics'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'datadog-metrics' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'datadog-metrics/lib/aggregators' {\n  declare module.exports: any;\n}\n\ndeclare module 'datadog-metrics/lib/loggers' {\n  declare module.exports: any;\n}\n\ndeclare module 'datadog-metrics/lib/metrics' {\n  declare module.exports: any;\n}\n\ndeclare module 'datadog-metrics/lib/reporters' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'datadog-metrics/index' {\n  declare module.exports: $Exports<'datadog-metrics'>;\n}\ndeclare module 'datadog-metrics/index.js' {\n  declare module.exports: $Exports<'datadog-metrics'>;\n}\ndeclare module 'datadog-metrics/lib/aggregators.js' {\n  declare module.exports: $Exports<'datadog-metrics/lib/aggregators'>;\n}\ndeclare module 'datadog-metrics/lib/loggers.js' {\n  declare module.exports: $Exports<'datadog-metrics/lib/loggers'>;\n}\ndeclare module 'datadog-metrics/lib/metrics.js' {\n  declare module.exports: $Exports<'datadog-metrics/lib/metrics'>;\n}\ndeclare module 'datadog-metrics/lib/reporters.js' {\n  declare module.exports: $Exports<'datadog-metrics/lib/reporters'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/dataloader_vx.x.x.js",
    "content": "// flow-typed signature: 62d3fa71e344ce71db81037ecb6264ae\n// flow-typed version: <<STUB>>/dataloader_v1.4.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'dataloader'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'dataloader' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'dataloader/index' {\n  declare module.exports: $Exports<'dataloader'>;\n}\ndeclare module 'dataloader/index.js' {\n  declare module.exports: $Exports<'dataloader'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/debounce_vx.x.x.js",
    "content": "// flow-typed signature: 696652e6be06a49af1c1ae4cf66d86e7\n// flow-typed version: <<STUB>>/debounce_v^1.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'debounce'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'debounce' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'debounce/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'debounce/index' {\n  declare module.exports: $Exports<'debounce'>;\n}\ndeclare module 'debounce/index.js' {\n  declare module.exports: $Exports<'debounce'>;\n}\ndeclare module 'debounce/test.js' {\n  declare module.exports: $Exports<'debounce/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/debug_v2.x.x.js",
    "content": "// flow-typed signature: c7b1e1d8d9c2230d131299ddc21dcb0e\n// flow-typed version: da30fe6876/debug_v2.x.x/flow_>=v0.28.x\n\ndeclare module \"debug\" {\n  declare type Debugger = {\n    (...args: Array<mixed>): void,\n    (formatter: string, ...args: Array<mixed>): void,\n    (err: Error, ...args: Array<mixed>): void,\n    enabled: boolean,\n    log: () => {},\n    namespace: string\n  };\n\n  declare module.exports: (namespace: string) => Debugger;\n\n  declare var names: Array<string>;\n  declare var skips: Array<string>;\n  declare var colors: Array<number>;\n\n  declare function disable(): void;\n  declare function enable(namespaces: string): void;\n  declare function enabled(name: string): boolean;\n  declare function humanize(): void;\n  declare function useColors(): boolean;\n  declare function log(): void;\n\n  declare var formatters: {\n    [formatter: string]: () => {}\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/decode-uri-component_vx.x.x.js",
    "content": "// flow-typed signature: faef99bbaaff986e9b4077753c74e5b6\n// flow-typed version: <<STUB>>/decode-uri-component_v0.2.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'decode-uri-component'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'decode-uri-component' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'decode-uri-component/index' {\n  declare module.exports: $Exports<'decode-uri-component'>;\n}\ndeclare module 'decode-uri-component/index.js' {\n  declare module.exports: $Exports<'decode-uri-component'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-code-editor-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 85a24d2d3bac4a91b6283dc8eb6f6018\n// flow-typed version: <<STUB>>/draft-js-code-editor-plugin_v0.2.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-code-editor-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-code-editor-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-code-editor-plugin/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-polyfill_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-env_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/draft-js-code_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/husky_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/jest_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/prettier_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/rimraf_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-code-editor-plugin/src/test/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-code-editor-plugin/dist/index.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/dist/index'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-polyfill_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-polyfill_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-env_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-env_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-flow_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/draft-js-code_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/draft-js-code_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/husky_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/husky_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/jest_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/jest_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/prettier_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/prettier_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/flow-typed/npm/rimraf_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/flow-typed/npm/rimraf_vx.x.x'>;\n}\ndeclare module 'draft-js-code-editor-plugin/src/index.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/src/index'>;\n}\ndeclare module 'draft-js-code-editor-plugin/src/test/index.test.js' {\n  declare module.exports: $Exports<'draft-js-code-editor-plugin/src/test/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-drag-n-drop-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 321a13eae9e4b66400e89722009fcf5f\n// flow-typed version: <<STUB>>/draft-js-drag-n-drop-plugin_v2.0.0-rc9/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-drag-n-drop-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-drag-n-drop-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-drag-n-drop-plugin/lib/constants/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/lib/createDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/lib/handleDrop' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/lib/modifiers/addBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/lib/modifiers/removeBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/postcss.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-drag-n-drop-plugin/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-drag-n-drop-plugin/lib/constants/index.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/constants/index'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/lib/createDecorator.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/createDecorator'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/lib/handleDrop.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/handleDrop'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/index'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/lib/modifiers/addBlock.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/modifiers/addBlock'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/lib/modifiers/removeBlock.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/lib/modifiers/removeBlock'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/postcss.config.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/postcss.config'>;\n}\ndeclare module 'draft-js-drag-n-drop-plugin/webpack.config.js' {\n  declare module.exports: $Exports<'draft-js-drag-n-drop-plugin/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-embed-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 9a561a1fa760295a878190beb98cda0d\n// flow-typed version: <<STUB>>/draft-js-embed-plugin_v^1.2.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-embed-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-embed-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-embed-plugin/lib/bundle-embedStyles' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-embed-plugin/lib/embed/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-embed-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-embed-plugin/lib/modifiers/addEmbed' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-embed-plugin/postcss.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-embed-plugin/lib/bundle-embedStyles.js' {\n  declare module.exports: $Exports<'draft-js-embed-plugin/lib/bundle-embedStyles'>;\n}\ndeclare module 'draft-js-embed-plugin/lib/embed/index.js' {\n  declare module.exports: $Exports<'draft-js-embed-plugin/lib/embed/index'>;\n}\ndeclare module 'draft-js-embed-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-embed-plugin/lib/index'>;\n}\ndeclare module 'draft-js-embed-plugin/lib/modifiers/addEmbed.js' {\n  declare module.exports: $Exports<'draft-js-embed-plugin/lib/modifiers/addEmbed'>;\n}\ndeclare module 'draft-js-embed-plugin/postcss.config.js' {\n  declare module.exports: $Exports<'draft-js-embed-plugin/postcss.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-export-markdown_vx.x.x.js",
    "content": "// flow-typed signature: 62c300788f61ec7382ffcd7ba580e1e3\n// flow-typed version: <<STUB>>/draft-js-export-markdown_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-export-markdown'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-export-markdown' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-export-markdown/lib/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-export-markdown/lib/stateToMarkdown' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-export-markdown/lib/main.js' {\n  declare module.exports: $Exports<'draft-js-export-markdown/lib/main'>;\n}\ndeclare module 'draft-js-export-markdown/lib/stateToMarkdown.js' {\n  declare module.exports: $Exports<'draft-js-export-markdown/lib/stateToMarkdown'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-focus-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 006dddf5145a7a86d38fa258e57f376d\n// flow-typed version: <<STUB>>/draft-js-focus-plugin_v2.0.0-rc2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-focus-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-focus-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-focus-plugin/lib/createDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/modifiers/removeBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/modifiers/setSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/modifiers/setSelectionToBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/utils/blockInSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/utils/createBlockKeyStore' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/utils/getBlockMapKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/lib/utils/getSelectedBlocksMapKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/postcss.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-focus-plugin/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-focus-plugin/lib/createDecorator.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/createDecorator'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/index'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/modifiers/removeBlock.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/modifiers/removeBlock'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/modifiers/setSelection.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/modifiers/setSelection'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/modifiers/setSelectionToBlock.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/modifiers/setSelectionToBlock'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/utils/blockInSelection.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/utils/blockInSelection'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/utils/createBlockKeyStore.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/utils/createBlockKeyStore'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/utils/getBlockMapKeys.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/utils/getBlockMapKeys'>;\n}\ndeclare module 'draft-js-focus-plugin/lib/utils/getSelectedBlocksMapKeys.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/lib/utils/getSelectedBlocksMapKeys'>;\n}\ndeclare module 'draft-js-focus-plugin/postcss.config.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/postcss.config'>;\n}\ndeclare module 'draft-js-focus-plugin/webpack.config.js' {\n  declare module.exports: $Exports<'draft-js-focus-plugin/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-image-plugin_vx.x.x.js",
    "content": "// flow-typed signature: a7f937ced32d340aa2e995adfa04774f\n// flow-typed version: <<STUB>>/draft-js-image-plugin_v2.0.0-rc8/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-image-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-image-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-image-plugin/lib/Image/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-image-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-image-plugin/lib/modifiers/addImage' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-image-plugin/postcss.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-image-plugin/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-image-plugin/lib/Image/index.js' {\n  declare module.exports: $Exports<'draft-js-image-plugin/lib/Image/index'>;\n}\ndeclare module 'draft-js-image-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-image-plugin/lib/index'>;\n}\ndeclare module 'draft-js-image-plugin/lib/modifiers/addImage.js' {\n  declare module.exports: $Exports<'draft-js-image-plugin/lib/modifiers/addImage'>;\n}\ndeclare module 'draft-js-image-plugin/postcss.config.js' {\n  declare module.exports: $Exports<'draft-js-image-plugin/postcss.config'>;\n}\ndeclare module 'draft-js-image-plugin/webpack.config.js' {\n  declare module.exports: $Exports<'draft-js-image-plugin/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-import-markdown_vx.x.x.js",
    "content": "// flow-typed signature: 389c153854ffcd0db04e39873c832a95\n// flow-typed version: <<STUB>>/draft-js-import-markdown_v^1.2.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-import-markdown'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-import-markdown' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-import-markdown/lib/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-import-markdown/lib/MarkdownParser' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-import-markdown/lib/stateFromMarkdown' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-import-markdown/lib/main.js' {\n  declare module.exports: $Exports<'draft-js-import-markdown/lib/main'>;\n}\ndeclare module 'draft-js-import-markdown/lib/MarkdownParser.js' {\n  declare module.exports: $Exports<'draft-js-import-markdown/lib/MarkdownParser'>;\n}\ndeclare module 'draft-js-import-markdown/lib/stateFromMarkdown.js' {\n  declare module.exports: $Exports<'draft-js-import-markdown/lib/stateFromMarkdown'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-linkify-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 97eb122c8883bdc42dd8631a8ded5526\n// flow-typed version: <<STUB>>/draft-js-linkify-plugin_v^2.0.0-beta1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-linkify-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-linkify-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-linkify-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-linkify-plugin/lib/Link/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-linkify-plugin/lib/linkStrategy' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-linkify-plugin/postcss.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-linkify-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-linkify-plugin/lib/index'>;\n}\ndeclare module 'draft-js-linkify-plugin/lib/Link/index.js' {\n  declare module.exports: $Exports<'draft-js-linkify-plugin/lib/Link/index'>;\n}\ndeclare module 'draft-js-linkify-plugin/lib/linkStrategy.js' {\n  declare module.exports: $Exports<'draft-js-linkify-plugin/lib/linkStrategy'>;\n}\ndeclare module 'draft-js-linkify-plugin/postcss.config.js' {\n  declare module.exports: $Exports<'draft-js-linkify-plugin/postcss.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-markdown-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 979025fdc1c62c46c4edb097f3cfe780\n// flow-typed version: <<STUB>>/draft-js-markdown-plugin_v^1.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-markdown-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-markdown-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-markdown-plugin/lib/components/Image/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/components/Link/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/constants' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/decorators/image/imageStrategy' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/decorators/image/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/decorators/link/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/decorators/link/linkStrategy' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/adjustBlockDepth' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/changeCurrentBlockType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/changeCurrentInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleBlockType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleImage' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleNewCodeBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertEmptyBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertImage' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertText' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/leaveList' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-markdown-plugin/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-markdown-plugin/lib/components/Image/index.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/components/Image/index'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/components/Link/index.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/components/Link/index'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/constants.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/constants'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/decorators/image/imageStrategy.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/decorators/image/imageStrategy'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/decorators/image/index.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/decorators/image/index'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/decorators/link/index.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/decorators/link/index'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/decorators/link/linkStrategy.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/decorators/link/linkStrategy'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/index'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/adjustBlockDepth.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/adjustBlockDepth'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/changeCurrentBlockType.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/changeCurrentBlockType'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/changeCurrentInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/changeCurrentInlineStyle'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleBlockType.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/handleBlockType'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleImage.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/handleImage'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/handleInlineStyle'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleLink.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/handleLink'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/handleNewCodeBlock.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/handleNewCodeBlock'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertEmptyBlock.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/insertEmptyBlock'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertImage.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/insertImage'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertLink.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/insertLink'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/insertText.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/insertText'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/modifiers/leaveList.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/modifiers/leaveList'>;\n}\ndeclare module 'draft-js-markdown-plugin/lib/utils.js' {\n  declare module.exports: $Exports<'draft-js-markdown-plugin/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-plugins-editor_vx.x.x.js",
    "content": "// flow-typed signature: 3d9dbc65bde93887bd1d5fa9c164dcd9\n// flow-typed version: <<STUB>>/draft-js-plugins-editor_v^2.0.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-plugins-editor'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-plugins-editor' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-plugins-editor/lib/Editor/__test__/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/__test__/MultiDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/createCompositeDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/defaultKeyBindingPlugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/moveSelectionToEnd' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/MultiDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/proxies' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/Editor/resolveDecorators' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/utils/composeDecorators' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-plugins-editor/lib/utils/createEditorStateWithText' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-plugins-editor/lib/Editor/__test__/index.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/__test__/index'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/__test__/MultiDecorator.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/__test__/MultiDecorator'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/createCompositeDecorator.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/createCompositeDecorator'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/defaultKeyBindingPlugin.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/defaultKeyBindingPlugin'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/index.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/index'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/moveSelectionToEnd.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/moveSelectionToEnd'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/MultiDecorator.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/MultiDecorator'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/proxies.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/proxies'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/Editor/resolveDecorators.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/Editor/resolveDecorators'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/index.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/index'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/utils/composeDecorators.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/utils/composeDecorators'>;\n}\ndeclare module 'draft-js-plugins-editor/lib/utils/createEditorStateWithText.js' {\n  declare module.exports: $Exports<'draft-js-plugins-editor/lib/utils/createEditorStateWithText'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js-prism-plugin_vx.x.x.js",
    "content": "// flow-typed signature: b19d6fb70255137c591e442ccd68ecb8\n// flow-typed version: <<STUB>>/draft-js-prism-plugin_v0.1.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js-prism-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js-prism-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js-prism-plugin/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-polyfill_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-env_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/draft-js-prism_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/husky_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/prettier_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/rimraf_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js-prism-plugin/src/test/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js-prism-plugin/dist/index.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/dist/index'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-polyfill_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-polyfill_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-env_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-preset-env_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-preset-es2015_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-preset-flow_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/babel-preset-stage-2_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/draft-js-prism_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/draft-js-prism_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/eslint-plugin-babel_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/husky_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/husky_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/prettier_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/prettier_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/flow-typed/npm/rimraf_vx.x.x.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/flow-typed/npm/rimraf_vx.x.x'>;\n}\ndeclare module 'draft-js-prism-plugin/src/index.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/src/index'>;\n}\ndeclare module 'draft-js-prism-plugin/src/test/index.test.js' {\n  declare module.exports: $Exports<'draft-js-prism-plugin/src/test/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draft-js_vx.x.x.js",
    "content": "// flow-typed signature: 26a9245f6d98367e4a7e3f48e00baaf8\n// flow-typed version: <<STUB>>/draft-js_v0.10.2/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draft-js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draft-js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draft-js/dist/Draft' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/dist/Draft.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/addEntityToContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/addEntityToEntityMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/adjustBlockDepthForContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/applyEntityToContentBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/applyEntityToContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/AtomicBlockUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/BlockMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/BlockMapBuilder' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/BlockTree' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/CharacterMetadata' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/ComposedEntityMutability' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/ComposedEntityType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/CompositeDraftDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/ContentBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/ContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/ContentStateInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/convertFromDraftStateToRaw' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/convertFromHTMLToContentBlocks' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/convertFromRawToDraftState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/createCharacterList' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/createEntityInContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/decodeEntityRanges' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/decodeInlineStyleRanges' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DefaultDraftBlockRenderMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DefaultDraftInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DOMDerivedSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/Draft' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftBlockRenderConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftBlockRenderMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftBlockType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftDecoratorType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftDragType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditor.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorBlock.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorCommand' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorCompositionHandler' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorContents.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorDragHandler' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorEditHandler' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorLeaf.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorModes' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorPlaceholder.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEditorTextNode.react' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEntity' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEntityInstance' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEntityMutability' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEntitySegments' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftEntityType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftFeatureFlags-core' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftFeatureFlags' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftHandleValue' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftInsertionType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftJsDebugLogging' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftModifier' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftOffsetKey' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftOffsetKeyPath' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftPasteProcessor' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftRange' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftRemovableWord' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftRemovalDirection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftScrollPosition' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftStringKey' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/DraftTextAlignment' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnBeforeInput' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnBlur' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnCompositionStart' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnCopy' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnCut' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnDragOver' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnDragStart' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnFocus' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnInput' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnKeyDown' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnPaste' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/editOnSelect' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EditorBidiService' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EditorChangeType' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EditorState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EditorStateCreationConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/encodeEntityRanges' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/encodeInlineStyleRanges' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EntityMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/EntityRange' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/expandRangeToStartOfLine' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/findAncestorOffsetKey' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/findRangesImmutable' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/generateRandomKey' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getCharacterRemovalRange' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getContentStateFragment' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getDefaultKeyBinding' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getDraftEditorSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getDraftEditorSelectionWithNodes' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getEntityKeyForSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getFragmentFromSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getRangeBoundingClientRect' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getRangeClientRects' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getRangesForDraftEntity' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getSafeBodyFromHTML' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getSampleStateForTesting' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getSelectionOffsetKeyForNode' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getTextAfterNearestEntity' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getTextContentFromFiles' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getUpdatedSelectionState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/getVisibleSelectionRect' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/InlineStyleRange' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/insertFragmentIntoContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/insertIntoList' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/insertTextIntoContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/isEventHandled' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/isSelectionAtLeafStart' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/isSoftNewlineEvent' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/KeyBindingUtil' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandBackspaceToStartOfLine' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandBackspaceWord' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandDeleteWord' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandInsertNewline' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandMoveSelectionToEndOfBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandMoveSelectionToStartOfBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandPlainBackspace' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandPlainDelete' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandTransposeCharacters' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/keyCommandUndo' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/modifyBlockForContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/moveBlockInContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/moveSelectionBackward' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/moveSelectionForward' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/RawDraftContentBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/RawDraftContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/RawDraftEntity' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/removeEntitiesAtEdges' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/removeRangeFromContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/removeTextWithStrategy' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/RichTextEditorUtil' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/SampleDraftInlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/sanitizeDraftText' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/SecondaryClipboard' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/SelectionState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/setDraftEditorSelection' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/splitBlockInContentState' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/splitTextIntoTextBlocks' {\n  declare module.exports: any;\n}\n\ndeclare module 'draft-js/lib/updateEntityDataInContentState' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draft-js/dist/Draft.js' {\n  declare module.exports: $Exports<'draft-js/dist/Draft'>;\n}\ndeclare module 'draft-js/dist/Draft.min.js' {\n  declare module.exports: $Exports<'draft-js/dist/Draft.min'>;\n}\ndeclare module 'draft-js/lib/addEntityToContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/addEntityToContentState'>;\n}\ndeclare module 'draft-js/lib/addEntityToEntityMap.js' {\n  declare module.exports: $Exports<'draft-js/lib/addEntityToEntityMap'>;\n}\ndeclare module 'draft-js/lib/adjustBlockDepthForContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/adjustBlockDepthForContentState'>;\n}\ndeclare module 'draft-js/lib/applyEntityToContentBlock.js' {\n  declare module.exports: $Exports<'draft-js/lib/applyEntityToContentBlock'>;\n}\ndeclare module 'draft-js/lib/applyEntityToContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/applyEntityToContentState'>;\n}\ndeclare module 'draft-js/lib/AtomicBlockUtils.js' {\n  declare module.exports: $Exports<'draft-js/lib/AtomicBlockUtils'>;\n}\ndeclare module 'draft-js/lib/BlockMap.js' {\n  declare module.exports: $Exports<'draft-js/lib/BlockMap'>;\n}\ndeclare module 'draft-js/lib/BlockMapBuilder.js' {\n  declare module.exports: $Exports<'draft-js/lib/BlockMapBuilder'>;\n}\ndeclare module 'draft-js/lib/BlockTree.js' {\n  declare module.exports: $Exports<'draft-js/lib/BlockTree'>;\n}\ndeclare module 'draft-js/lib/CharacterMetadata.js' {\n  declare module.exports: $Exports<'draft-js/lib/CharacterMetadata'>;\n}\ndeclare module 'draft-js/lib/ComposedEntityMutability.js' {\n  declare module.exports: $Exports<'draft-js/lib/ComposedEntityMutability'>;\n}\ndeclare module 'draft-js/lib/ComposedEntityType.js' {\n  declare module.exports: $Exports<'draft-js/lib/ComposedEntityType'>;\n}\ndeclare module 'draft-js/lib/CompositeDraftDecorator.js' {\n  declare module.exports: $Exports<'draft-js/lib/CompositeDraftDecorator'>;\n}\ndeclare module 'draft-js/lib/ContentBlock.js' {\n  declare module.exports: $Exports<'draft-js/lib/ContentBlock'>;\n}\ndeclare module 'draft-js/lib/ContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/ContentState'>;\n}\ndeclare module 'draft-js/lib/ContentStateInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js/lib/ContentStateInlineStyle'>;\n}\ndeclare module 'draft-js/lib/convertFromDraftStateToRaw.js' {\n  declare module.exports: $Exports<'draft-js/lib/convertFromDraftStateToRaw'>;\n}\ndeclare module 'draft-js/lib/convertFromHTMLToContentBlocks.js' {\n  declare module.exports: $Exports<'draft-js/lib/convertFromHTMLToContentBlocks'>;\n}\ndeclare module 'draft-js/lib/convertFromRawToDraftState.js' {\n  declare module.exports: $Exports<'draft-js/lib/convertFromRawToDraftState'>;\n}\ndeclare module 'draft-js/lib/createCharacterList.js' {\n  declare module.exports: $Exports<'draft-js/lib/createCharacterList'>;\n}\ndeclare module 'draft-js/lib/createEntityInContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/createEntityInContentState'>;\n}\ndeclare module 'draft-js/lib/decodeEntityRanges.js' {\n  declare module.exports: $Exports<'draft-js/lib/decodeEntityRanges'>;\n}\ndeclare module 'draft-js/lib/decodeInlineStyleRanges.js' {\n  declare module.exports: $Exports<'draft-js/lib/decodeInlineStyleRanges'>;\n}\ndeclare module 'draft-js/lib/DefaultDraftBlockRenderMap.js' {\n  declare module.exports: $Exports<'draft-js/lib/DefaultDraftBlockRenderMap'>;\n}\ndeclare module 'draft-js/lib/DefaultDraftInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js/lib/DefaultDraftInlineStyle'>;\n}\ndeclare module 'draft-js/lib/DOMDerivedSelection.js' {\n  declare module.exports: $Exports<'draft-js/lib/DOMDerivedSelection'>;\n}\ndeclare module 'draft-js/lib/Draft.js' {\n  declare module.exports: $Exports<'draft-js/lib/Draft'>;\n}\ndeclare module 'draft-js/lib/DraftBlockRenderConfig.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftBlockRenderConfig'>;\n}\ndeclare module 'draft-js/lib/DraftBlockRenderMap.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftBlockRenderMap'>;\n}\ndeclare module 'draft-js/lib/DraftBlockType.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftBlockType'>;\n}\ndeclare module 'draft-js/lib/DraftDecorator.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftDecorator'>;\n}\ndeclare module 'draft-js/lib/DraftDecoratorType.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftDecoratorType'>;\n}\ndeclare module 'draft-js/lib/DraftDragType.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftDragType'>;\n}\ndeclare module 'draft-js/lib/DraftEditor.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditor.react'>;\n}\ndeclare module 'draft-js/lib/DraftEditorBlock.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorBlock.react'>;\n}\ndeclare module 'draft-js/lib/DraftEditorCommand.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorCommand'>;\n}\ndeclare module 'draft-js/lib/DraftEditorCompositionHandler.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorCompositionHandler'>;\n}\ndeclare module 'draft-js/lib/DraftEditorContents.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorContents.react'>;\n}\ndeclare module 'draft-js/lib/DraftEditorDragHandler.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorDragHandler'>;\n}\ndeclare module 'draft-js/lib/DraftEditorEditHandler.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorEditHandler'>;\n}\ndeclare module 'draft-js/lib/DraftEditorLeaf.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorLeaf.react'>;\n}\ndeclare module 'draft-js/lib/DraftEditorModes.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorModes'>;\n}\ndeclare module 'draft-js/lib/DraftEditorPlaceholder.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorPlaceholder.react'>;\n}\ndeclare module 'draft-js/lib/DraftEditorProps.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorProps'>;\n}\ndeclare module 'draft-js/lib/DraftEditorTextNode.react.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEditorTextNode.react'>;\n}\ndeclare module 'draft-js/lib/DraftEntity.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEntity'>;\n}\ndeclare module 'draft-js/lib/DraftEntityInstance.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEntityInstance'>;\n}\ndeclare module 'draft-js/lib/DraftEntityMutability.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEntityMutability'>;\n}\ndeclare module 'draft-js/lib/DraftEntitySegments.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEntitySegments'>;\n}\ndeclare module 'draft-js/lib/DraftEntityType.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftEntityType'>;\n}\ndeclare module 'draft-js/lib/DraftFeatureFlags-core.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftFeatureFlags-core'>;\n}\ndeclare module 'draft-js/lib/DraftFeatureFlags.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftFeatureFlags'>;\n}\ndeclare module 'draft-js/lib/DraftHandleValue.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftHandleValue'>;\n}\ndeclare module 'draft-js/lib/DraftInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftInlineStyle'>;\n}\ndeclare module 'draft-js/lib/DraftInsertionType.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftInsertionType'>;\n}\ndeclare module 'draft-js/lib/DraftJsDebugLogging.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftJsDebugLogging'>;\n}\ndeclare module 'draft-js/lib/DraftModifier.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftModifier'>;\n}\ndeclare module 'draft-js/lib/DraftOffsetKey.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftOffsetKey'>;\n}\ndeclare module 'draft-js/lib/DraftOffsetKeyPath.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftOffsetKeyPath'>;\n}\ndeclare module 'draft-js/lib/DraftPasteProcessor.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftPasteProcessor'>;\n}\ndeclare module 'draft-js/lib/DraftRange.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftRange'>;\n}\ndeclare module 'draft-js/lib/DraftRemovableWord.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftRemovableWord'>;\n}\ndeclare module 'draft-js/lib/DraftRemovalDirection.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftRemovalDirection'>;\n}\ndeclare module 'draft-js/lib/DraftScrollPosition.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftScrollPosition'>;\n}\ndeclare module 'draft-js/lib/DraftStringKey.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftStringKey'>;\n}\ndeclare module 'draft-js/lib/DraftTextAlignment.js' {\n  declare module.exports: $Exports<'draft-js/lib/DraftTextAlignment'>;\n}\ndeclare module 'draft-js/lib/editOnBeforeInput.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnBeforeInput'>;\n}\ndeclare module 'draft-js/lib/editOnBlur.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnBlur'>;\n}\ndeclare module 'draft-js/lib/editOnCompositionStart.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnCompositionStart'>;\n}\ndeclare module 'draft-js/lib/editOnCopy.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnCopy'>;\n}\ndeclare module 'draft-js/lib/editOnCut.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnCut'>;\n}\ndeclare module 'draft-js/lib/editOnDragOver.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnDragOver'>;\n}\ndeclare module 'draft-js/lib/editOnDragStart.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnDragStart'>;\n}\ndeclare module 'draft-js/lib/editOnFocus.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnFocus'>;\n}\ndeclare module 'draft-js/lib/editOnInput.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnInput'>;\n}\ndeclare module 'draft-js/lib/editOnKeyDown.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnKeyDown'>;\n}\ndeclare module 'draft-js/lib/editOnPaste.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnPaste'>;\n}\ndeclare module 'draft-js/lib/editOnSelect.js' {\n  declare module.exports: $Exports<'draft-js/lib/editOnSelect'>;\n}\ndeclare module 'draft-js/lib/EditorBidiService.js' {\n  declare module.exports: $Exports<'draft-js/lib/EditorBidiService'>;\n}\ndeclare module 'draft-js/lib/EditorChangeType.js' {\n  declare module.exports: $Exports<'draft-js/lib/EditorChangeType'>;\n}\ndeclare module 'draft-js/lib/EditorState.js' {\n  declare module.exports: $Exports<'draft-js/lib/EditorState'>;\n}\ndeclare module 'draft-js/lib/EditorStateCreationConfig.js' {\n  declare module.exports: $Exports<'draft-js/lib/EditorStateCreationConfig'>;\n}\ndeclare module 'draft-js/lib/encodeEntityRanges.js' {\n  declare module.exports: $Exports<'draft-js/lib/encodeEntityRanges'>;\n}\ndeclare module 'draft-js/lib/encodeInlineStyleRanges.js' {\n  declare module.exports: $Exports<'draft-js/lib/encodeInlineStyleRanges'>;\n}\ndeclare module 'draft-js/lib/EntityMap.js' {\n  declare module.exports: $Exports<'draft-js/lib/EntityMap'>;\n}\ndeclare module 'draft-js/lib/EntityRange.js' {\n  declare module.exports: $Exports<'draft-js/lib/EntityRange'>;\n}\ndeclare module 'draft-js/lib/expandRangeToStartOfLine.js' {\n  declare module.exports: $Exports<'draft-js/lib/expandRangeToStartOfLine'>;\n}\ndeclare module 'draft-js/lib/findAncestorOffsetKey.js' {\n  declare module.exports: $Exports<'draft-js/lib/findAncestorOffsetKey'>;\n}\ndeclare module 'draft-js/lib/findRangesImmutable.js' {\n  declare module.exports: $Exports<'draft-js/lib/findRangesImmutable'>;\n}\ndeclare module 'draft-js/lib/generateRandomKey.js' {\n  declare module.exports: $Exports<'draft-js/lib/generateRandomKey'>;\n}\ndeclare module 'draft-js/lib/getCharacterRemovalRange.js' {\n  declare module.exports: $Exports<'draft-js/lib/getCharacterRemovalRange'>;\n}\ndeclare module 'draft-js/lib/getContentStateFragment.js' {\n  declare module.exports: $Exports<'draft-js/lib/getContentStateFragment'>;\n}\ndeclare module 'draft-js/lib/getDefaultKeyBinding.js' {\n  declare module.exports: $Exports<'draft-js/lib/getDefaultKeyBinding'>;\n}\ndeclare module 'draft-js/lib/getDraftEditorSelection.js' {\n  declare module.exports: $Exports<'draft-js/lib/getDraftEditorSelection'>;\n}\ndeclare module 'draft-js/lib/getDraftEditorSelectionWithNodes.js' {\n  declare module.exports: $Exports<'draft-js/lib/getDraftEditorSelectionWithNodes'>;\n}\ndeclare module 'draft-js/lib/getEntityKeyForSelection.js' {\n  declare module.exports: $Exports<'draft-js/lib/getEntityKeyForSelection'>;\n}\ndeclare module 'draft-js/lib/getFragmentFromSelection.js' {\n  declare module.exports: $Exports<'draft-js/lib/getFragmentFromSelection'>;\n}\ndeclare module 'draft-js/lib/getRangeBoundingClientRect.js' {\n  declare module.exports: $Exports<'draft-js/lib/getRangeBoundingClientRect'>;\n}\ndeclare module 'draft-js/lib/getRangeClientRects.js' {\n  declare module.exports: $Exports<'draft-js/lib/getRangeClientRects'>;\n}\ndeclare module 'draft-js/lib/getRangesForDraftEntity.js' {\n  declare module.exports: $Exports<'draft-js/lib/getRangesForDraftEntity'>;\n}\ndeclare module 'draft-js/lib/getSafeBodyFromHTML.js' {\n  declare module.exports: $Exports<'draft-js/lib/getSafeBodyFromHTML'>;\n}\ndeclare module 'draft-js/lib/getSampleStateForTesting.js' {\n  declare module.exports: $Exports<'draft-js/lib/getSampleStateForTesting'>;\n}\ndeclare module 'draft-js/lib/getSelectionOffsetKeyForNode.js' {\n  declare module.exports: $Exports<'draft-js/lib/getSelectionOffsetKeyForNode'>;\n}\ndeclare module 'draft-js/lib/getTextAfterNearestEntity.js' {\n  declare module.exports: $Exports<'draft-js/lib/getTextAfterNearestEntity'>;\n}\ndeclare module 'draft-js/lib/getTextContentFromFiles.js' {\n  declare module.exports: $Exports<'draft-js/lib/getTextContentFromFiles'>;\n}\ndeclare module 'draft-js/lib/getUpdatedSelectionState.js' {\n  declare module.exports: $Exports<'draft-js/lib/getUpdatedSelectionState'>;\n}\ndeclare module 'draft-js/lib/getVisibleSelectionRect.js' {\n  declare module.exports: $Exports<'draft-js/lib/getVisibleSelectionRect'>;\n}\ndeclare module 'draft-js/lib/InlineStyleRange.js' {\n  declare module.exports: $Exports<'draft-js/lib/InlineStyleRange'>;\n}\ndeclare module 'draft-js/lib/insertFragmentIntoContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/insertFragmentIntoContentState'>;\n}\ndeclare module 'draft-js/lib/insertIntoList.js' {\n  declare module.exports: $Exports<'draft-js/lib/insertIntoList'>;\n}\ndeclare module 'draft-js/lib/insertTextIntoContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/insertTextIntoContentState'>;\n}\ndeclare module 'draft-js/lib/isEventHandled.js' {\n  declare module.exports: $Exports<'draft-js/lib/isEventHandled'>;\n}\ndeclare module 'draft-js/lib/isSelectionAtLeafStart.js' {\n  declare module.exports: $Exports<'draft-js/lib/isSelectionAtLeafStart'>;\n}\ndeclare module 'draft-js/lib/isSoftNewlineEvent.js' {\n  declare module.exports: $Exports<'draft-js/lib/isSoftNewlineEvent'>;\n}\ndeclare module 'draft-js/lib/KeyBindingUtil.js' {\n  declare module.exports: $Exports<'draft-js/lib/KeyBindingUtil'>;\n}\ndeclare module 'draft-js/lib/keyCommandBackspaceToStartOfLine.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandBackspaceToStartOfLine'>;\n}\ndeclare module 'draft-js/lib/keyCommandBackspaceWord.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandBackspaceWord'>;\n}\ndeclare module 'draft-js/lib/keyCommandDeleteWord.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandDeleteWord'>;\n}\ndeclare module 'draft-js/lib/keyCommandInsertNewline.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandInsertNewline'>;\n}\ndeclare module 'draft-js/lib/keyCommandMoveSelectionToEndOfBlock.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandMoveSelectionToEndOfBlock'>;\n}\ndeclare module 'draft-js/lib/keyCommandMoveSelectionToStartOfBlock.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandMoveSelectionToStartOfBlock'>;\n}\ndeclare module 'draft-js/lib/keyCommandPlainBackspace.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandPlainBackspace'>;\n}\ndeclare module 'draft-js/lib/keyCommandPlainDelete.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandPlainDelete'>;\n}\ndeclare module 'draft-js/lib/keyCommandTransposeCharacters.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandTransposeCharacters'>;\n}\ndeclare module 'draft-js/lib/keyCommandUndo.js' {\n  declare module.exports: $Exports<'draft-js/lib/keyCommandUndo'>;\n}\ndeclare module 'draft-js/lib/modifyBlockForContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/modifyBlockForContentState'>;\n}\ndeclare module 'draft-js/lib/moveBlockInContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/moveBlockInContentState'>;\n}\ndeclare module 'draft-js/lib/moveSelectionBackward.js' {\n  declare module.exports: $Exports<'draft-js/lib/moveSelectionBackward'>;\n}\ndeclare module 'draft-js/lib/moveSelectionForward.js' {\n  declare module.exports: $Exports<'draft-js/lib/moveSelectionForward'>;\n}\ndeclare module 'draft-js/lib/RawDraftContentBlock.js' {\n  declare module.exports: $Exports<'draft-js/lib/RawDraftContentBlock'>;\n}\ndeclare module 'draft-js/lib/RawDraftContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/RawDraftContentState'>;\n}\ndeclare module 'draft-js/lib/RawDraftEntity.js' {\n  declare module.exports: $Exports<'draft-js/lib/RawDraftEntity'>;\n}\ndeclare module 'draft-js/lib/removeEntitiesAtEdges.js' {\n  declare module.exports: $Exports<'draft-js/lib/removeEntitiesAtEdges'>;\n}\ndeclare module 'draft-js/lib/removeRangeFromContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/removeRangeFromContentState'>;\n}\ndeclare module 'draft-js/lib/removeTextWithStrategy.js' {\n  declare module.exports: $Exports<'draft-js/lib/removeTextWithStrategy'>;\n}\ndeclare module 'draft-js/lib/RichTextEditorUtil.js' {\n  declare module.exports: $Exports<'draft-js/lib/RichTextEditorUtil'>;\n}\ndeclare module 'draft-js/lib/SampleDraftInlineStyle.js' {\n  declare module.exports: $Exports<'draft-js/lib/SampleDraftInlineStyle'>;\n}\ndeclare module 'draft-js/lib/sanitizeDraftText.js' {\n  declare module.exports: $Exports<'draft-js/lib/sanitizeDraftText'>;\n}\ndeclare module 'draft-js/lib/SecondaryClipboard.js' {\n  declare module.exports: $Exports<'draft-js/lib/SecondaryClipboard'>;\n}\ndeclare module 'draft-js/lib/SelectionState.js' {\n  declare module.exports: $Exports<'draft-js/lib/SelectionState'>;\n}\ndeclare module 'draft-js/lib/setDraftEditorSelection.js' {\n  declare module.exports: $Exports<'draft-js/lib/setDraftEditorSelection'>;\n}\ndeclare module 'draft-js/lib/splitBlockInContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/splitBlockInContentState'>;\n}\ndeclare module 'draft-js/lib/splitTextIntoTextBlocks.js' {\n  declare module.exports: $Exports<'draft-js/lib/splitTextIntoTextBlocks'>;\n}\ndeclare module 'draft-js/lib/updateEntityDataInContentState.js' {\n  declare module.exports: $Exports<'draft-js/lib/updateEntityDataInContentState'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/draftjs-to-markdown_vx.x.x.js",
    "content": "// flow-typed signature: 80b6c75a3455344e47ed91d5c4a5970c\n// flow-typed version: <<STUB>>/draftjs-to-markdown_v^0.4.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'draftjs-to-markdown'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'draftjs-to-markdown' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'draftjs-to-markdown/lib/draftjs-to-markdown' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'draftjs-to-markdown/lib/draftjs-to-markdown.js' {\n  declare module.exports: $Exports<'draftjs-to-markdown/lib/draftjs-to-markdown'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/electron-context-menu_vx.x.x.js",
    "content": "// flow-typed signature: fa2daa44307abd285e881b992fa9d76c\n// flow-typed version: <<STUB>>/electron-context-menu_v0.9.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'electron-context-menu'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'electron-context-menu' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/electron-is-dev_vx.x.x.js",
    "content": "// flow-typed signature: 56cb87472f7011e6a22325af9a351724\n// flow-typed version: <<STUB>>/electron-is-dev_v1.0.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'electron-is-dev'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'electron-is-dev' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'electron-is-dev/index' {\n  declare module.exports: $Exports<'electron-is-dev'>;\n}\ndeclare module 'electron-is-dev/index.js' {\n  declare module.exports: $Exports<'electron-is-dev'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/electron-updater_vx.x.x.js",
    "content": "// flow-typed signature: be94c12fa70b80b91f6bef7efa92a8fe\n// flow-typed version: <<STUB>>/electron-updater_v4.0.5/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'electron-updater'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'electron-updater' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'electron-updater/out/AppAdapter' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/AppImageUpdater' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/AppUpdater' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/BaseUpdater' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/DataSplitter' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/DifferentialDownloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/downloadPlanBuilder' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/GenericDifferentialDownloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/differentialDownloader/multipleRangeDownloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/DownloadedUpdateHelper' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/ElectronAppAdapter' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/electronHttpExecutor' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/MacUpdater' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/NsisUpdater' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providerFactory' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providers/BintrayProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providers/GenericProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providers/GitHubProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providers/PrivateGitHubProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/providers/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron-updater/out/windowsExecutableCodeSignatureVerifier' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'electron-updater/out/AppAdapter.js' {\n  declare module.exports: $Exports<'electron-updater/out/AppAdapter'>;\n}\ndeclare module 'electron-updater/out/AppImageUpdater.js' {\n  declare module.exports: $Exports<'electron-updater/out/AppImageUpdater'>;\n}\ndeclare module 'electron-updater/out/AppUpdater.js' {\n  declare module.exports: $Exports<'electron-updater/out/AppUpdater'>;\n}\ndeclare module 'electron-updater/out/BaseUpdater.js' {\n  declare module.exports: $Exports<'electron-updater/out/BaseUpdater'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/DataSplitter.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/DataSplitter'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/DifferentialDownloader.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/DifferentialDownloader'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/downloadPlanBuilder.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/downloadPlanBuilder'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/GenericDifferentialDownloader.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/GenericDifferentialDownloader'>;\n}\ndeclare module 'electron-updater/out/differentialDownloader/multipleRangeDownloader.js' {\n  declare module.exports: $Exports<'electron-updater/out/differentialDownloader/multipleRangeDownloader'>;\n}\ndeclare module 'electron-updater/out/DownloadedUpdateHelper.js' {\n  declare module.exports: $Exports<'electron-updater/out/DownloadedUpdateHelper'>;\n}\ndeclare module 'electron-updater/out/ElectronAppAdapter.js' {\n  declare module.exports: $Exports<'electron-updater/out/ElectronAppAdapter'>;\n}\ndeclare module 'electron-updater/out/electronHttpExecutor.js' {\n  declare module.exports: $Exports<'electron-updater/out/electronHttpExecutor'>;\n}\ndeclare module 'electron-updater/out/MacUpdater.js' {\n  declare module.exports: $Exports<'electron-updater/out/MacUpdater'>;\n}\ndeclare module 'electron-updater/out/main.js' {\n  declare module.exports: $Exports<'electron-updater/out/main'>;\n}\ndeclare module 'electron-updater/out/NsisUpdater.js' {\n  declare module.exports: $Exports<'electron-updater/out/NsisUpdater'>;\n}\ndeclare module 'electron-updater/out/providerFactory.js' {\n  declare module.exports: $Exports<'electron-updater/out/providerFactory'>;\n}\ndeclare module 'electron-updater/out/providers/BintrayProvider.js' {\n  declare module.exports: $Exports<'electron-updater/out/providers/BintrayProvider'>;\n}\ndeclare module 'electron-updater/out/providers/GenericProvider.js' {\n  declare module.exports: $Exports<'electron-updater/out/providers/GenericProvider'>;\n}\ndeclare module 'electron-updater/out/providers/GitHubProvider.js' {\n  declare module.exports: $Exports<'electron-updater/out/providers/GitHubProvider'>;\n}\ndeclare module 'electron-updater/out/providers/PrivateGitHubProvider.js' {\n  declare module.exports: $Exports<'electron-updater/out/providers/PrivateGitHubProvider'>;\n}\ndeclare module 'electron-updater/out/providers/Provider.js' {\n  declare module.exports: $Exports<'electron-updater/out/providers/Provider'>;\n}\ndeclare module 'electron-updater/out/windowsExecutableCodeSignatureVerifier.js' {\n  declare module.exports: $Exports<'electron-updater/out/windowsExecutableCodeSignatureVerifier'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/electron-window-state_vx.x.x.js",
    "content": "// flow-typed signature: 77130022186123cfc81d76787330354e\n// flow-typed version: <<STUB>>/electron-window-state_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'electron-window-state'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'electron-window-state' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/electron_vx.x.x.js",
    "content": "// flow-typed signature: 8dd143dc1ccb8d078e45dd9625583512\n// flow-typed version: <<STUB>>/electron_v3.0.10/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'electron'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'electron' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'electron/cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'electron/install' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'electron/cli.js' {\n  declare module.exports: $Exports<'electron/cli'>;\n}\ndeclare module 'electron/index' {\n  declare module.exports: $Exports<'electron'>;\n}\ndeclare module 'electron/index.js' {\n  declare module.exports: $Exports<'electron'>;\n}\ndeclare module 'electron/install.js' {\n  declare module.exports: $Exports<'electron/install'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/emoji-regex_vx.x.x.js",
    "content": "// flow-typed signature: 2146505d7dc1ce34df62b193aa483a99\n// flow-typed version: <<STUB>>/emoji-regex_v^6.1.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'emoji-regex'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'emoji-regex' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'emoji-regex/es2015/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'emoji-regex/es2015/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'emoji-regex/text' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'emoji-regex/es2015/index.js' {\n  declare module.exports: $Exports<'emoji-regex/es2015/index'>;\n}\ndeclare module 'emoji-regex/es2015/text.js' {\n  declare module.exports: $Exports<'emoji-regex/es2015/text'>;\n}\ndeclare module 'emoji-regex/index' {\n  declare module.exports: $Exports<'emoji-regex'>;\n}\ndeclare module 'emoji-regex/index.js' {\n  declare module.exports: $Exports<'emoji-regex'>;\n}\ndeclare module 'emoji-regex/text.js' {\n  declare module.exports: $Exports<'emoji-regex/text'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js",
    "content": "// flow-typed signature: c3cb37e9b55ed2805f019e8055f34df6\n// flow-typed version: <<STUB>>/eslint-plugin-flowtype_v^2.39.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-flowtype'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'eslint-plugin-flowtype' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'eslint-plugin-flowtype/bin/readmeAssertions' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/booleanStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/defineFlowType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/delimiterDangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/genericSpacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noDupeKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noFlowFixMeComments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noMutableArray' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noUnusedExpressions' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/noWeakTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireParameterType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireReturnType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireVariableType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/semi' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/sortKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeIdMatch' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/useFlowType' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/rules/validSyntax' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getParameterName' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/isFlowFile' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/quoteName' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-flowtype/dist/utilities/spacingFixers' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'eslint-plugin-flowtype/bin/readmeAssertions.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/bin/readmeAssertions'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/index'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/booleanStyle.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/booleanStyle'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/defineFlowType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/defineFlowType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/delimiterDangle.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/delimiterDangle'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/genericSpacing.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/genericSpacing'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noDupeKeys.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noDupeKeys'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noFlowFixMeComments.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noFlowFixMeComments'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noMutableArray.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noMutableArray'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noPrimitiveConstructorTypes'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noTypesMissingFileAnnotation'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noUnusedExpressions.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noUnusedExpressions'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/noWeakTypes.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/noWeakTypes'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/objectTypeDelimiter'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireParameterType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireParameterType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireReturnType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireReturnType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireValidFileAnnotation'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/requireVariableType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/requireVariableType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/semi.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/semi'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/sortKeys.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/sortKeys'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceAfterTypeColon'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceBeforeGenericBracket'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/spaceBeforeTypeColon'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateFunctions'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeIndexer'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateObjectTypeProperty'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateReturnType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypeCastExpression'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/evaluateTypical'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/index'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeColonSpacing/reporter'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/typeIdMatch.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/typeIdMatch'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/unionIntersectionSpacing'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/useFlowType.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/useFlowType'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/rules/validSyntax.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/rules/validSyntax'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/checkFlowFileAnnotation'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/fuzzyStringMatch'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getParameterName.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getParameterName'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getTokenAfterParens'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/getTokenBeforeParens'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/index'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/isFlowFile.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/isFlowFile'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/isFlowFileAnnotation'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/iterateFunctionNodes'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/quoteName.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/quoteName'>;\n}\ndeclare module 'eslint-plugin-flowtype/dist/utilities/spacingFixers.js' {\n  declare module.exports: $Exports<'eslint-plugin-flowtype/dist/utilities/spacingFixers'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-jest_vx.x.x.js",
    "content": "// flow-typed signature: eebb83b37b65acefcb2a1285cdcd8f40\n// flow-typed version: <<STUB>>/eslint-plugin-jest_v^21.6.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-jest'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'eslint-plugin-jest' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'eslint-plugin-jest/processors/__tests__/snapshot-processor.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/processors/snapshot-processor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_focused_tests.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_identical_title.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_large_snapshots.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_skipped_tests.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_expect_assertions.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_be_null.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_be_undefined.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_have_length.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/__tests__/valid_expect.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/no_disabled_tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/no_focused_tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/no_identical_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/no_large_snapshots' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/prefer_expect_assertions' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/prefer_to_be_null' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/prefer_to_be_undefined' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/prefer_to_have_length' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/util' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-jest/rules/valid_expect' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'eslint-plugin-jest/index' {\n  declare module.exports: $Exports<'eslint-plugin-jest'>;\n}\ndeclare module 'eslint-plugin-jest/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest'>;\n}\ndeclare module 'eslint-plugin-jest/processors/__tests__/snapshot-processor.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/processors/__tests__/snapshot-processor.test'>;\n}\ndeclare module 'eslint-plugin-jest/processors/snapshot-processor.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/processors/snapshot-processor'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_focused_tests.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/no_focused_tests.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_identical_title.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/no_identical_title.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_large_snapshots.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/no_large_snapshots.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/no_skipped_tests.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/no_skipped_tests.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_expect_assertions.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/prefer_expect_assertions.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_be_null.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/prefer_to_be_null.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_be_undefined.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/prefer_to_be_undefined.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/prefer_to_have_length.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/prefer_to_have_length.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/__tests__/valid_expect.test.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/__tests__/valid_expect.test'>;\n}\ndeclare module 'eslint-plugin-jest/rules/no_disabled_tests.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/no_disabled_tests'>;\n}\ndeclare module 'eslint-plugin-jest/rules/no_focused_tests.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/no_focused_tests'>;\n}\ndeclare module 'eslint-plugin-jest/rules/no_identical_title.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/no_identical_title'>;\n}\ndeclare module 'eslint-plugin-jest/rules/no_large_snapshots.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/no_large_snapshots'>;\n}\ndeclare module 'eslint-plugin-jest/rules/prefer_expect_assertions.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/prefer_expect_assertions'>;\n}\ndeclare module 'eslint-plugin-jest/rules/prefer_to_be_null.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/prefer_to_be_null'>;\n}\ndeclare module 'eslint-plugin-jest/rules/prefer_to_be_undefined.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/prefer_to_be_undefined'>;\n}\ndeclare module 'eslint-plugin-jest/rules/prefer_to_have_length.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/prefer_to_have_length'>;\n}\ndeclare module 'eslint-plugin-jest/rules/util.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/util'>;\n}\ndeclare module 'eslint-plugin-jest/rules/valid_expect.js' {\n  declare module.exports: $Exports<'eslint-plugin-jest/rules/valid_expect'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-promise_vx.x.x.js",
    "content": "// flow-typed signature: 3dad6a146176994cea77200d1f68399b\n// flow-typed version: <<STUB>>/eslint-plugin-promise_v^3.6.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-promise'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'eslint-plugin-promise' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'eslint-plugin-promise/rules/always-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/avoid-new' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/catch-or-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/has-promise-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/is-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/is-inside-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/is-inside-promise' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/is-named-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/lib/is-promise' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-callback-in-promise' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-nesting' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-promise-in-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-return-in-finally' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/no-return-wrap' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/param-names' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/prefer-await-to-callbacks' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-promise/rules/prefer-await-to-then' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'eslint-plugin-promise/index' {\n  declare module.exports: $Exports<'eslint-plugin-promise'>;\n}\ndeclare module 'eslint-plugin-promise/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise'>;\n}\ndeclare module 'eslint-plugin-promise/rules/always-return.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/always-return'>;\n}\ndeclare module 'eslint-plugin-promise/rules/avoid-new.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/avoid-new'>;\n}\ndeclare module 'eslint-plugin-promise/rules/catch-or-return.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/catch-or-return'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/has-promise-callback.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/has-promise-callback'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/is-callback.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/is-callback'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/is-inside-callback.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/is-inside-callback'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/is-inside-promise.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/is-inside-promise'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/is-named-callback.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/is-named-callback'>;\n}\ndeclare module 'eslint-plugin-promise/rules/lib/is-promise.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/lib/is-promise'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-callback-in-promise.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-callback-in-promise'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-native.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-native'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-nesting.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-nesting'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-promise-in-callback.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-promise-in-callback'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-return-in-finally.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-return-in-finally'>;\n}\ndeclare module 'eslint-plugin-promise/rules/no-return-wrap.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/no-return-wrap'>;\n}\ndeclare module 'eslint-plugin-promise/rules/param-names.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/param-names'>;\n}\ndeclare module 'eslint-plugin-promise/rules/prefer-await-to-callbacks.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/prefer-await-to-callbacks'>;\n}\ndeclare module 'eslint-plugin-promise/rules/prefer-await-to-then.js' {\n  declare module.exports: $Exports<'eslint-plugin-promise/rules/prefer-await-to-then'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint-plugin-react_vx.x.x.js",
    "content": "// flow-typed signature: 3ccbf28017415bcdadf41280ba832f48\n// flow-typed version: <<STUB>>/eslint-plugin-react_v^7.4.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint-plugin-react'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'eslint-plugin-react' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'eslint-plugin-react/lib/rules/boolean-prop-naming' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/button-has-type' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/default-props-match-prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/destructuring-assignment' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/display-name' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/forbid-component-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/forbid-elements' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/forbid-prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-boolean-value' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-closing-tag-location' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-curly-brace-presence' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-filename-extension' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-handler-names' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-indent-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-indent' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-bind' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-literals' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-undef' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-one-expression-per-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-pascal-case' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-sort-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-uses-react' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-uses-vars' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-access-state-in-setstate' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-array-index-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-children-prop' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-danger-with-children' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-danger' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-deprecated' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-did-update-set-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-find-dom-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-is-mounted' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-multi-comp' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-redundant-should-component-update' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-render-return-value' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-set-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-string-refs' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-typos' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-unescaped-entities' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-unknown-property' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-unused-prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-unused-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/no-will-update-set-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/prefer-es6-class' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/prefer-stateless-function' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/require-default-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/require-optimization' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/require-render-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/self-closing-comp' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/sort-comp' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/sort-prop-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/style-prop-object' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/annotations' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/ast' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/Components' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/makeNoMethodSetStateRule' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/pragma' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/variable' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint-plugin-react/lib/util/version' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'eslint-plugin-react/index' {\n  declare module.exports: $Exports<'eslint-plugin-react'>;\n}\ndeclare module 'eslint-plugin-react/index.js' {\n  declare module.exports: $Exports<'eslint-plugin-react'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/boolean-prop-naming.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/boolean-prop-naming'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/button-has-type.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/button-has-type'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/default-props-match-prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/default-props-match-prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/destructuring-assignment.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/destructuring-assignment'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/display-name.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/display-name'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/forbid-component-props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-component-props'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/forbid-elements.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-elements'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/forbid-foreign-prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-foreign-prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/forbid-prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/forbid-prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-boolean-value.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-boolean-value'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-closing-bracket-location.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-closing-bracket-location'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-closing-tag-location.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-closing-tag-location'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-curly-brace-presence.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-curly-brace-presence'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-curly-spacing.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-curly-spacing'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-equals-spacing.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-equals-spacing'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-filename-extension.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-filename-extension'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-first-prop-new-line.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-first-prop-new-line'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-handler-names.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-handler-names'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-indent-props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent-props'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-indent.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-indent'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-key.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-key'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-max-props-per-line.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-max-props-per-line'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-bind.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-bind'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-comment-textnodes'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-duplicate-props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-duplicate-props'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-literals.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-literals'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-target-blank.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-target-blank'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-no-undef.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-no-undef'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-one-expression-per-line.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-one-expression-per-line'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-pascal-case.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-pascal-case'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-sort-props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-sort-props'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-space-before-closing.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-space-before-closing'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-tag-spacing.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-tag-spacing'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-uses-react.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-react'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-uses-vars.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-uses-vars'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/jsx-wrap-multilines.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/jsx-wrap-multilines'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-access-state-in-setstate.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-access-state-in-setstate'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-array-index-key.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-array-index-key'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-children-prop.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-children-prop'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-danger-with-children.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger-with-children'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-danger.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-danger'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-deprecated.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-deprecated'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-did-mount-set-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-mount-set-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-did-update-set-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-did-update-set-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-direct-mutation-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-direct-mutation-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-find-dom-node.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-find-dom-node'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-is-mounted.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-is-mounted'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-multi-comp.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-multi-comp'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-redundant-should-component-update.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-redundant-should-component-update'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-render-return-value.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-render-return-value'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-set-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-set-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-string-refs.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-string-refs'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-typos.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-typos'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-unescaped-entities.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unescaped-entities'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-unknown-property.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unknown-property'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-unused-prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unused-prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-unused-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-unused-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/no-will-update-set-state.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/no-will-update-set-state'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/prefer-es6-class.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-es6-class'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/prefer-stateless-function.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prefer-stateless-function'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/react-in-jsx-scope.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/react-in-jsx-scope'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/require-default-props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-default-props'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/require-optimization.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-optimization'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/require-render-return.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/require-render-return'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/self-closing-comp.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/self-closing-comp'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/sort-comp.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-comp'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/sort-prop-types.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/sort-prop-types'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/style-prop-object.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/style-prop-object'>;\n}\ndeclare module 'eslint-plugin-react/lib/rules/void-dom-elements-no-children.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/rules/void-dom-elements-no-children'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/annotations.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/annotations'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/ast.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/ast'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/Components.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/Components'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/getTokenBeforeClosingBracket'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/makeNoMethodSetStateRule.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/makeNoMethodSetStateRule'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/pragma.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/pragma'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/props.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/props'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/variable.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/variable'>;\n}\ndeclare module 'eslint-plugin-react/lib/util/version.js' {\n  declare module.exports: $Exports<'eslint-plugin-react/lib/util/version'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/eslint_vx.x.x.js",
    "content": "// flow-typed signature: 06fb0448e5d92893c2832e03e36de63d\n// flow-typed version: <<STUB>>/eslint_v^4.15.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'eslint'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'eslint' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'eslint/bin/eslint' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/config-schema' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/default-cli-options' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/default-config-options' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/environments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/eslint-all' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/conf/eslint-recommended' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/api' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/ast-utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/cli-engine' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/code-path-analyzer' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/code-path-segment' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/code-path-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/code-path' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/debug-helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/fork-context' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/code-path-analysis/id-generator' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/autoconfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-cache' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-file' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-initializer' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-ops' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-rule' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/config-validator' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/environments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/config/plugins' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/file-finder' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/checkstyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/codeframe' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/compact' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/html' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/jslint-xml' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/json' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/junit' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/stylish' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/table' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/tap' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/unix' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/formatters/visualstudio' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/ignored-paths' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/linter' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/load-rules' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/logging' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/options' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/report-translator' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/accessor-pairs' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/array-bracket-newline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/array-bracket-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/array-callback-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/array-element-newline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/arrow-body-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/arrow-parens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/arrow-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/block-scoped-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/block-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/brace-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/callback-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/camelcase' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/capitalized-comments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/class-methods-use-this' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/comma-dangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/comma-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/comma-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/complexity' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/computed-property-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/consistent-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/consistent-this' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/constructor-super' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/curly' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/default-case' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/dot-location' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/dot-notation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/eol-last' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/eqeqeq' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/for-direction' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/func-call-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/func-name-matching' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/func-names' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/func-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/function-paren-newline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/generator-star-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/getter-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/global-require' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/guard-for-in' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/handle-callback-err' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/id-blacklist' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/id-length' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/id-match' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/implicit-arrow-linebreak' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/indent-legacy' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/indent' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/init-declarations' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/jsx-quotes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/key-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/keyword-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/line-comment-position' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/linebreak-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/lines-around-comment' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/lines-around-directive' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/lines-between-class-members' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-depth' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-len' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-lines' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-nested-callbacks' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-params' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-statements-per-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/max-statements' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/multiline-comment-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/multiline-ternary' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/new-cap' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/new-parens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/newline-after-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/newline-before-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/newline-per-chained-call' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-alert' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-array-constructor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-await-in-loop' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-bitwise' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-buffer-constructor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-caller' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-case-declarations' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-catch-shadow' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-class-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-compare-neg-zero' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-cond-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-confusing-arrow' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-console' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-const-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-constant-condition' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-continue' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-control-regex' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-debugger' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-delete-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-div-regex' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-dupe-args' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-dupe-class-members' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-dupe-keys' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-duplicate-case' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-duplicate-imports' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-else-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-empty-character-class' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-empty-function' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-empty-pattern' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-empty' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-eq-null' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-eval' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-ex-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extend-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extra-bind' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extra-boolean-cast' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extra-label' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extra-parens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-extra-semi' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-fallthrough' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-floating-decimal' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-func-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-global-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-implicit-coercion' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-implicit-globals' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-implied-eval' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-inline-comments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-inner-declarations' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-invalid-regexp' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-invalid-this' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-irregular-whitespace' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-iterator' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-label-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-labels' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-lone-blocks' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-lonely-if' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-loop-func' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-magic-numbers' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-mixed-operators' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-mixed-requires' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-mixed-spaces-and-tabs' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-multi-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-multi-spaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-multi-str' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-multiple-empty-lines' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-native-reassign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-negated-condition' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-negated-in-lhs' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-nested-ternary' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new-func' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new-object' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new-require' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new-symbol' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new-wrappers' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-new' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-obj-calls' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-octal-escape' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-octal' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-param-reassign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-path-concat' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-plusplus' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-process-env' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-process-exit' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-proto' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-prototype-builtins' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-redeclare' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-regex-spaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-restricted-globals' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-restricted-imports' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-restricted-modules' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-restricted-properties' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-restricted-syntax' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-return-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-return-await' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-script-url' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-self-assign' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-self-compare' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-sequences' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-shadow-restricted-names' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-shadow' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-spaced-func' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-sparse-arrays' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-sync' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-tabs' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-template-curly-in-string' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-ternary' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-this-before-super' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-throw-literal' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-trailing-spaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-undef-init' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-undef' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-undefined' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-underscore-dangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unexpected-multiline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unmodified-loop-condition' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unneeded-ternary' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unreachable' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unsafe-finally' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unsafe-negation' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unused-expressions' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unused-labels' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-unused-vars' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-use-before-define' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-call' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-computed-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-concat' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-constructor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-escape' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-rename' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-useless-return' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-void' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-warning-comments' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-whitespace-before-property' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/no-with' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/nonblock-statement-body-position' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/object-curly-newline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/object-curly-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/object-property-newline' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/object-shorthand' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/one-var-declaration-per-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/one-var' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/operator-assignment' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/operator-linebreak' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/padded-blocks' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/padding-line-between-statements' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-arrow-callback' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-const' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-destructuring' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-numeric-literals' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-promise-reject-errors' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-reflect' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-rest-params' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-spread' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/prefer-template' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/quote-props' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/quotes' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/radix' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/require-await' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/require-jsdoc' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/require-yield' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/rest-spread-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/semi-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/semi-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/semi' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/sort-imports' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/sort-keys' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/sort-vars' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/space-before-blocks' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/space-before-function-paren' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/space-in-parens' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/space-infix-ops' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/space-unary-ops' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/spaced-comment' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/strict' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/switch-colon-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/symbol-description' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/template-curly-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/template-tag-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/unicode-bom' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/use-isnan' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/valid-jsdoc' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/valid-typeof' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/vars-on-top' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/wrap-iife' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/wrap-regex' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/yield-star-spacing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/rules/yoda' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/testers/rule-tester' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/timing' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/backward-token-comment-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/backward-token-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/cursors' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/decorative-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/filter-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/forward-token-comment-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/forward-token-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/limit-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/padded-token-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/skip-cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/token-store/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/ajv' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/apply-disable-directives' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/fix-tracker' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/glob-util' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/glob' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/hash' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/interpolate' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/keywords' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/module-resolver' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/naming' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/node-event-generator' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/npm-util' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/path-util' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/patterns/letters' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/rule-fixer' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/safe-emitter' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/source-code-fixer' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/source-code-util' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/source-code' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/traverser' {\n  declare module.exports: any;\n}\n\ndeclare module 'eslint/lib/util/xml-escape' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'eslint/bin/eslint.js' {\n  declare module.exports: $Exports<'eslint/bin/eslint'>;\n}\ndeclare module 'eslint/conf/config-schema.js' {\n  declare module.exports: $Exports<'eslint/conf/config-schema'>;\n}\ndeclare module 'eslint/conf/default-cli-options.js' {\n  declare module.exports: $Exports<'eslint/conf/default-cli-options'>;\n}\ndeclare module 'eslint/conf/default-config-options.js' {\n  declare module.exports: $Exports<'eslint/conf/default-config-options'>;\n}\ndeclare module 'eslint/conf/environments.js' {\n  declare module.exports: $Exports<'eslint/conf/environments'>;\n}\ndeclare module 'eslint/conf/eslint-all.js' {\n  declare module.exports: $Exports<'eslint/conf/eslint-all'>;\n}\ndeclare module 'eslint/conf/eslint-recommended.js' {\n  declare module.exports: $Exports<'eslint/conf/eslint-recommended'>;\n}\ndeclare module 'eslint/lib/api.js' {\n  declare module.exports: $Exports<'eslint/lib/api'>;\n}\ndeclare module 'eslint/lib/ast-utils.js' {\n  declare module.exports: $Exports<'eslint/lib/ast-utils'>;\n}\ndeclare module 'eslint/lib/cli-engine.js' {\n  declare module.exports: $Exports<'eslint/lib/cli-engine'>;\n}\ndeclare module 'eslint/lib/cli.js' {\n  declare module.exports: $Exports<'eslint/lib/cli'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/code-path-analyzer.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-analyzer'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/code-path-segment.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-segment'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/code-path-state.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-state'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/code-path.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/debug-helpers.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/debug-helpers'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/fork-context.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/fork-context'>;\n}\ndeclare module 'eslint/lib/code-path-analysis/id-generator.js' {\n  declare module.exports: $Exports<'eslint/lib/code-path-analysis/id-generator'>;\n}\ndeclare module 'eslint/lib/config.js' {\n  declare module.exports: $Exports<'eslint/lib/config'>;\n}\ndeclare module 'eslint/lib/config/autoconfig.js' {\n  declare module.exports: $Exports<'eslint/lib/config/autoconfig'>;\n}\ndeclare module 'eslint/lib/config/config-cache.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-cache'>;\n}\ndeclare module 'eslint/lib/config/config-file.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-file'>;\n}\ndeclare module 'eslint/lib/config/config-initializer.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-initializer'>;\n}\ndeclare module 'eslint/lib/config/config-ops.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-ops'>;\n}\ndeclare module 'eslint/lib/config/config-rule.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-rule'>;\n}\ndeclare module 'eslint/lib/config/config-validator.js' {\n  declare module.exports: $Exports<'eslint/lib/config/config-validator'>;\n}\ndeclare module 'eslint/lib/config/environments.js' {\n  declare module.exports: $Exports<'eslint/lib/config/environments'>;\n}\ndeclare module 'eslint/lib/config/plugins.js' {\n  declare module.exports: $Exports<'eslint/lib/config/plugins'>;\n}\ndeclare module 'eslint/lib/file-finder.js' {\n  declare module.exports: $Exports<'eslint/lib/file-finder'>;\n}\ndeclare module 'eslint/lib/formatters/checkstyle.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/checkstyle'>;\n}\ndeclare module 'eslint/lib/formatters/codeframe.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/codeframe'>;\n}\ndeclare module 'eslint/lib/formatters/compact.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/compact'>;\n}\ndeclare module 'eslint/lib/formatters/html.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/html'>;\n}\ndeclare module 'eslint/lib/formatters/jslint-xml.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/jslint-xml'>;\n}\ndeclare module 'eslint/lib/formatters/json.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/json'>;\n}\ndeclare module 'eslint/lib/formatters/junit.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/junit'>;\n}\ndeclare module 'eslint/lib/formatters/stylish.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/stylish'>;\n}\ndeclare module 'eslint/lib/formatters/table.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/table'>;\n}\ndeclare module 'eslint/lib/formatters/tap.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/tap'>;\n}\ndeclare module 'eslint/lib/formatters/unix.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/unix'>;\n}\ndeclare module 'eslint/lib/formatters/visualstudio.js' {\n  declare module.exports: $Exports<'eslint/lib/formatters/visualstudio'>;\n}\ndeclare module 'eslint/lib/ignored-paths.js' {\n  declare module.exports: $Exports<'eslint/lib/ignored-paths'>;\n}\ndeclare module 'eslint/lib/linter.js' {\n  declare module.exports: $Exports<'eslint/lib/linter'>;\n}\ndeclare module 'eslint/lib/load-rules.js' {\n  declare module.exports: $Exports<'eslint/lib/load-rules'>;\n}\ndeclare module 'eslint/lib/logging.js' {\n  declare module.exports: $Exports<'eslint/lib/logging'>;\n}\ndeclare module 'eslint/lib/options.js' {\n  declare module.exports: $Exports<'eslint/lib/options'>;\n}\ndeclare module 'eslint/lib/report-translator.js' {\n  declare module.exports: $Exports<'eslint/lib/report-translator'>;\n}\ndeclare module 'eslint/lib/rules.js' {\n  declare module.exports: $Exports<'eslint/lib/rules'>;\n}\ndeclare module 'eslint/lib/rules/accessor-pairs.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/accessor-pairs'>;\n}\ndeclare module 'eslint/lib/rules/array-bracket-newline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/array-bracket-newline'>;\n}\ndeclare module 'eslint/lib/rules/array-bracket-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/array-bracket-spacing'>;\n}\ndeclare module 'eslint/lib/rules/array-callback-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/array-callback-return'>;\n}\ndeclare module 'eslint/lib/rules/array-element-newline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/array-element-newline'>;\n}\ndeclare module 'eslint/lib/rules/arrow-body-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/arrow-body-style'>;\n}\ndeclare module 'eslint/lib/rules/arrow-parens.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/arrow-parens'>;\n}\ndeclare module 'eslint/lib/rules/arrow-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/arrow-spacing'>;\n}\ndeclare module 'eslint/lib/rules/block-scoped-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/block-scoped-var'>;\n}\ndeclare module 'eslint/lib/rules/block-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/block-spacing'>;\n}\ndeclare module 'eslint/lib/rules/brace-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/brace-style'>;\n}\ndeclare module 'eslint/lib/rules/callback-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/callback-return'>;\n}\ndeclare module 'eslint/lib/rules/camelcase.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/camelcase'>;\n}\ndeclare module 'eslint/lib/rules/capitalized-comments.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/capitalized-comments'>;\n}\ndeclare module 'eslint/lib/rules/class-methods-use-this.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/class-methods-use-this'>;\n}\ndeclare module 'eslint/lib/rules/comma-dangle.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/comma-dangle'>;\n}\ndeclare module 'eslint/lib/rules/comma-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/comma-spacing'>;\n}\ndeclare module 'eslint/lib/rules/comma-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/comma-style'>;\n}\ndeclare module 'eslint/lib/rules/complexity.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/complexity'>;\n}\ndeclare module 'eslint/lib/rules/computed-property-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/computed-property-spacing'>;\n}\ndeclare module 'eslint/lib/rules/consistent-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/consistent-return'>;\n}\ndeclare module 'eslint/lib/rules/consistent-this.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/consistent-this'>;\n}\ndeclare module 'eslint/lib/rules/constructor-super.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/constructor-super'>;\n}\ndeclare module 'eslint/lib/rules/curly.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/curly'>;\n}\ndeclare module 'eslint/lib/rules/default-case.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/default-case'>;\n}\ndeclare module 'eslint/lib/rules/dot-location.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/dot-location'>;\n}\ndeclare module 'eslint/lib/rules/dot-notation.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/dot-notation'>;\n}\ndeclare module 'eslint/lib/rules/eol-last.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/eol-last'>;\n}\ndeclare module 'eslint/lib/rules/eqeqeq.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/eqeqeq'>;\n}\ndeclare module 'eslint/lib/rules/for-direction.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/for-direction'>;\n}\ndeclare module 'eslint/lib/rules/func-call-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/func-call-spacing'>;\n}\ndeclare module 'eslint/lib/rules/func-name-matching.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/func-name-matching'>;\n}\ndeclare module 'eslint/lib/rules/func-names.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/func-names'>;\n}\ndeclare module 'eslint/lib/rules/func-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/func-style'>;\n}\ndeclare module 'eslint/lib/rules/function-paren-newline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/function-paren-newline'>;\n}\ndeclare module 'eslint/lib/rules/generator-star-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/generator-star-spacing'>;\n}\ndeclare module 'eslint/lib/rules/getter-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/getter-return'>;\n}\ndeclare module 'eslint/lib/rules/global-require.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/global-require'>;\n}\ndeclare module 'eslint/lib/rules/guard-for-in.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/guard-for-in'>;\n}\ndeclare module 'eslint/lib/rules/handle-callback-err.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/handle-callback-err'>;\n}\ndeclare module 'eslint/lib/rules/id-blacklist.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/id-blacklist'>;\n}\ndeclare module 'eslint/lib/rules/id-length.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/id-length'>;\n}\ndeclare module 'eslint/lib/rules/id-match.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/id-match'>;\n}\ndeclare module 'eslint/lib/rules/implicit-arrow-linebreak.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/implicit-arrow-linebreak'>;\n}\ndeclare module 'eslint/lib/rules/indent-legacy.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/indent-legacy'>;\n}\ndeclare module 'eslint/lib/rules/indent.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/indent'>;\n}\ndeclare module 'eslint/lib/rules/init-declarations.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/init-declarations'>;\n}\ndeclare module 'eslint/lib/rules/jsx-quotes.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/jsx-quotes'>;\n}\ndeclare module 'eslint/lib/rules/key-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/key-spacing'>;\n}\ndeclare module 'eslint/lib/rules/keyword-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/keyword-spacing'>;\n}\ndeclare module 'eslint/lib/rules/line-comment-position.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/line-comment-position'>;\n}\ndeclare module 'eslint/lib/rules/linebreak-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/linebreak-style'>;\n}\ndeclare module 'eslint/lib/rules/lines-around-comment.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/lines-around-comment'>;\n}\ndeclare module 'eslint/lib/rules/lines-around-directive.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/lines-around-directive'>;\n}\ndeclare module 'eslint/lib/rules/lines-between-class-members.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/lines-between-class-members'>;\n}\ndeclare module 'eslint/lib/rules/max-depth.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-depth'>;\n}\ndeclare module 'eslint/lib/rules/max-len.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-len'>;\n}\ndeclare module 'eslint/lib/rules/max-lines.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-lines'>;\n}\ndeclare module 'eslint/lib/rules/max-nested-callbacks.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-nested-callbacks'>;\n}\ndeclare module 'eslint/lib/rules/max-params.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-params'>;\n}\ndeclare module 'eslint/lib/rules/max-statements-per-line.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-statements-per-line'>;\n}\ndeclare module 'eslint/lib/rules/max-statements.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/max-statements'>;\n}\ndeclare module 'eslint/lib/rules/multiline-comment-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/multiline-comment-style'>;\n}\ndeclare module 'eslint/lib/rules/multiline-ternary.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/multiline-ternary'>;\n}\ndeclare module 'eslint/lib/rules/new-cap.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/new-cap'>;\n}\ndeclare module 'eslint/lib/rules/new-parens.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/new-parens'>;\n}\ndeclare module 'eslint/lib/rules/newline-after-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/newline-after-var'>;\n}\ndeclare module 'eslint/lib/rules/newline-before-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/newline-before-return'>;\n}\ndeclare module 'eslint/lib/rules/newline-per-chained-call.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/newline-per-chained-call'>;\n}\ndeclare module 'eslint/lib/rules/no-alert.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-alert'>;\n}\ndeclare module 'eslint/lib/rules/no-array-constructor.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-array-constructor'>;\n}\ndeclare module 'eslint/lib/rules/no-await-in-loop.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-await-in-loop'>;\n}\ndeclare module 'eslint/lib/rules/no-bitwise.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-bitwise'>;\n}\ndeclare module 'eslint/lib/rules/no-buffer-constructor.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-buffer-constructor'>;\n}\ndeclare module 'eslint/lib/rules/no-caller.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-caller'>;\n}\ndeclare module 'eslint/lib/rules/no-case-declarations.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-case-declarations'>;\n}\ndeclare module 'eslint/lib/rules/no-catch-shadow.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-catch-shadow'>;\n}\ndeclare module 'eslint/lib/rules/no-class-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-class-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-compare-neg-zero.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-compare-neg-zero'>;\n}\ndeclare module 'eslint/lib/rules/no-cond-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-cond-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-confusing-arrow.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-confusing-arrow'>;\n}\ndeclare module 'eslint/lib/rules/no-console.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-console'>;\n}\ndeclare module 'eslint/lib/rules/no-const-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-const-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-constant-condition.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-constant-condition'>;\n}\ndeclare module 'eslint/lib/rules/no-continue.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-continue'>;\n}\ndeclare module 'eslint/lib/rules/no-control-regex.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-control-regex'>;\n}\ndeclare module 'eslint/lib/rules/no-debugger.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-debugger'>;\n}\ndeclare module 'eslint/lib/rules/no-delete-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-delete-var'>;\n}\ndeclare module 'eslint/lib/rules/no-div-regex.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-div-regex'>;\n}\ndeclare module 'eslint/lib/rules/no-dupe-args.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-dupe-args'>;\n}\ndeclare module 'eslint/lib/rules/no-dupe-class-members.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-dupe-class-members'>;\n}\ndeclare module 'eslint/lib/rules/no-dupe-keys.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-dupe-keys'>;\n}\ndeclare module 'eslint/lib/rules/no-duplicate-case.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-case'>;\n}\ndeclare module 'eslint/lib/rules/no-duplicate-imports.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-imports'>;\n}\ndeclare module 'eslint/lib/rules/no-else-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-else-return'>;\n}\ndeclare module 'eslint/lib/rules/no-empty-character-class.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-empty-character-class'>;\n}\ndeclare module 'eslint/lib/rules/no-empty-function.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-empty-function'>;\n}\ndeclare module 'eslint/lib/rules/no-empty-pattern.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-empty-pattern'>;\n}\ndeclare module 'eslint/lib/rules/no-empty.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-empty'>;\n}\ndeclare module 'eslint/lib/rules/no-eq-null.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-eq-null'>;\n}\ndeclare module 'eslint/lib/rules/no-eval.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-eval'>;\n}\ndeclare module 'eslint/lib/rules/no-ex-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-ex-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-extend-native.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extend-native'>;\n}\ndeclare module 'eslint/lib/rules/no-extra-bind.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extra-bind'>;\n}\ndeclare module 'eslint/lib/rules/no-extra-boolean-cast.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extra-boolean-cast'>;\n}\ndeclare module 'eslint/lib/rules/no-extra-label.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extra-label'>;\n}\ndeclare module 'eslint/lib/rules/no-extra-parens.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extra-parens'>;\n}\ndeclare module 'eslint/lib/rules/no-extra-semi.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-extra-semi'>;\n}\ndeclare module 'eslint/lib/rules/no-fallthrough.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-fallthrough'>;\n}\ndeclare module 'eslint/lib/rules/no-floating-decimal.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-floating-decimal'>;\n}\ndeclare module 'eslint/lib/rules/no-func-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-func-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-global-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-global-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-implicit-coercion.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-implicit-coercion'>;\n}\ndeclare module 'eslint/lib/rules/no-implicit-globals.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-implicit-globals'>;\n}\ndeclare module 'eslint/lib/rules/no-implied-eval.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-implied-eval'>;\n}\ndeclare module 'eslint/lib/rules/no-inline-comments.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-inline-comments'>;\n}\ndeclare module 'eslint/lib/rules/no-inner-declarations.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-inner-declarations'>;\n}\ndeclare module 'eslint/lib/rules/no-invalid-regexp.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-invalid-regexp'>;\n}\ndeclare module 'eslint/lib/rules/no-invalid-this.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-invalid-this'>;\n}\ndeclare module 'eslint/lib/rules/no-irregular-whitespace.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-irregular-whitespace'>;\n}\ndeclare module 'eslint/lib/rules/no-iterator.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-iterator'>;\n}\ndeclare module 'eslint/lib/rules/no-label-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-label-var'>;\n}\ndeclare module 'eslint/lib/rules/no-labels.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-labels'>;\n}\ndeclare module 'eslint/lib/rules/no-lone-blocks.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-lone-blocks'>;\n}\ndeclare module 'eslint/lib/rules/no-lonely-if.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-lonely-if'>;\n}\ndeclare module 'eslint/lib/rules/no-loop-func.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-loop-func'>;\n}\ndeclare module 'eslint/lib/rules/no-magic-numbers.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-magic-numbers'>;\n}\ndeclare module 'eslint/lib/rules/no-mixed-operators.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-mixed-operators'>;\n}\ndeclare module 'eslint/lib/rules/no-mixed-requires.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-mixed-requires'>;\n}\ndeclare module 'eslint/lib/rules/no-mixed-spaces-and-tabs.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-mixed-spaces-and-tabs'>;\n}\ndeclare module 'eslint/lib/rules/no-multi-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-multi-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-multi-spaces.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-multi-spaces'>;\n}\ndeclare module 'eslint/lib/rules/no-multi-str.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-multi-str'>;\n}\ndeclare module 'eslint/lib/rules/no-multiple-empty-lines.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-multiple-empty-lines'>;\n}\ndeclare module 'eslint/lib/rules/no-native-reassign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-native-reassign'>;\n}\ndeclare module 'eslint/lib/rules/no-negated-condition.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-negated-condition'>;\n}\ndeclare module 'eslint/lib/rules/no-negated-in-lhs.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-negated-in-lhs'>;\n}\ndeclare module 'eslint/lib/rules/no-nested-ternary.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-nested-ternary'>;\n}\ndeclare module 'eslint/lib/rules/no-new-func.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new-func'>;\n}\ndeclare module 'eslint/lib/rules/no-new-object.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new-object'>;\n}\ndeclare module 'eslint/lib/rules/no-new-require.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new-require'>;\n}\ndeclare module 'eslint/lib/rules/no-new-symbol.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new-symbol'>;\n}\ndeclare module 'eslint/lib/rules/no-new-wrappers.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new-wrappers'>;\n}\ndeclare module 'eslint/lib/rules/no-new.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-new'>;\n}\ndeclare module 'eslint/lib/rules/no-obj-calls.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-obj-calls'>;\n}\ndeclare module 'eslint/lib/rules/no-octal-escape.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-octal-escape'>;\n}\ndeclare module 'eslint/lib/rules/no-octal.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-octal'>;\n}\ndeclare module 'eslint/lib/rules/no-param-reassign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-param-reassign'>;\n}\ndeclare module 'eslint/lib/rules/no-path-concat.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-path-concat'>;\n}\ndeclare module 'eslint/lib/rules/no-plusplus.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-plusplus'>;\n}\ndeclare module 'eslint/lib/rules/no-process-env.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-process-env'>;\n}\ndeclare module 'eslint/lib/rules/no-process-exit.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-process-exit'>;\n}\ndeclare module 'eslint/lib/rules/no-proto.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-proto'>;\n}\ndeclare module 'eslint/lib/rules/no-prototype-builtins.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-prototype-builtins'>;\n}\ndeclare module 'eslint/lib/rules/no-redeclare.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-redeclare'>;\n}\ndeclare module 'eslint/lib/rules/no-regex-spaces.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-regex-spaces'>;\n}\ndeclare module 'eslint/lib/rules/no-restricted-globals.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-restricted-globals'>;\n}\ndeclare module 'eslint/lib/rules/no-restricted-imports.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-restricted-imports'>;\n}\ndeclare module 'eslint/lib/rules/no-restricted-modules.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-restricted-modules'>;\n}\ndeclare module 'eslint/lib/rules/no-restricted-properties.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-restricted-properties'>;\n}\ndeclare module 'eslint/lib/rules/no-restricted-syntax.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-restricted-syntax'>;\n}\ndeclare module 'eslint/lib/rules/no-return-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-return-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-return-await.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-return-await'>;\n}\ndeclare module 'eslint/lib/rules/no-script-url.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-script-url'>;\n}\ndeclare module 'eslint/lib/rules/no-self-assign.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-self-assign'>;\n}\ndeclare module 'eslint/lib/rules/no-self-compare.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-self-compare'>;\n}\ndeclare module 'eslint/lib/rules/no-sequences.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-sequences'>;\n}\ndeclare module 'eslint/lib/rules/no-shadow-restricted-names.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-shadow-restricted-names'>;\n}\ndeclare module 'eslint/lib/rules/no-shadow.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-shadow'>;\n}\ndeclare module 'eslint/lib/rules/no-spaced-func.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-spaced-func'>;\n}\ndeclare module 'eslint/lib/rules/no-sparse-arrays.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-sparse-arrays'>;\n}\ndeclare module 'eslint/lib/rules/no-sync.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-sync'>;\n}\ndeclare module 'eslint/lib/rules/no-tabs.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-tabs'>;\n}\ndeclare module 'eslint/lib/rules/no-template-curly-in-string.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-template-curly-in-string'>;\n}\ndeclare module 'eslint/lib/rules/no-ternary.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-ternary'>;\n}\ndeclare module 'eslint/lib/rules/no-this-before-super.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-this-before-super'>;\n}\ndeclare module 'eslint/lib/rules/no-throw-literal.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-throw-literal'>;\n}\ndeclare module 'eslint/lib/rules/no-trailing-spaces.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-trailing-spaces'>;\n}\ndeclare module 'eslint/lib/rules/no-undef-init.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-undef-init'>;\n}\ndeclare module 'eslint/lib/rules/no-undef.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-undef'>;\n}\ndeclare module 'eslint/lib/rules/no-undefined.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-undefined'>;\n}\ndeclare module 'eslint/lib/rules/no-underscore-dangle.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-underscore-dangle'>;\n}\ndeclare module 'eslint/lib/rules/no-unexpected-multiline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unexpected-multiline'>;\n}\ndeclare module 'eslint/lib/rules/no-unmodified-loop-condition.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unmodified-loop-condition'>;\n}\ndeclare module 'eslint/lib/rules/no-unneeded-ternary.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unneeded-ternary'>;\n}\ndeclare module 'eslint/lib/rules/no-unreachable.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unreachable'>;\n}\ndeclare module 'eslint/lib/rules/no-unsafe-finally.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-finally'>;\n}\ndeclare module 'eslint/lib/rules/no-unsafe-negation.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-negation'>;\n}\ndeclare module 'eslint/lib/rules/no-unused-expressions.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unused-expressions'>;\n}\ndeclare module 'eslint/lib/rules/no-unused-labels.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unused-labels'>;\n}\ndeclare module 'eslint/lib/rules/no-unused-vars.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-unused-vars'>;\n}\ndeclare module 'eslint/lib/rules/no-use-before-define.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-use-before-define'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-call.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-call'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-computed-key.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-computed-key'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-concat.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-concat'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-constructor.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-constructor'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-escape.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-escape'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-rename.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-rename'>;\n}\ndeclare module 'eslint/lib/rules/no-useless-return.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-useless-return'>;\n}\ndeclare module 'eslint/lib/rules/no-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-var'>;\n}\ndeclare module 'eslint/lib/rules/no-void.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-void'>;\n}\ndeclare module 'eslint/lib/rules/no-warning-comments.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-warning-comments'>;\n}\ndeclare module 'eslint/lib/rules/no-whitespace-before-property.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-whitespace-before-property'>;\n}\ndeclare module 'eslint/lib/rules/no-with.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/no-with'>;\n}\ndeclare module 'eslint/lib/rules/nonblock-statement-body-position.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/nonblock-statement-body-position'>;\n}\ndeclare module 'eslint/lib/rules/object-curly-newline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/object-curly-newline'>;\n}\ndeclare module 'eslint/lib/rules/object-curly-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/object-curly-spacing'>;\n}\ndeclare module 'eslint/lib/rules/object-property-newline.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/object-property-newline'>;\n}\ndeclare module 'eslint/lib/rules/object-shorthand.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/object-shorthand'>;\n}\ndeclare module 'eslint/lib/rules/one-var-declaration-per-line.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/one-var-declaration-per-line'>;\n}\ndeclare module 'eslint/lib/rules/one-var.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/one-var'>;\n}\ndeclare module 'eslint/lib/rules/operator-assignment.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/operator-assignment'>;\n}\ndeclare module 'eslint/lib/rules/operator-linebreak.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/operator-linebreak'>;\n}\ndeclare module 'eslint/lib/rules/padded-blocks.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/padded-blocks'>;\n}\ndeclare module 'eslint/lib/rules/padding-line-between-statements.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/padding-line-between-statements'>;\n}\ndeclare module 'eslint/lib/rules/prefer-arrow-callback.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-arrow-callback'>;\n}\ndeclare module 'eslint/lib/rules/prefer-const.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-const'>;\n}\ndeclare module 'eslint/lib/rules/prefer-destructuring.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-destructuring'>;\n}\ndeclare module 'eslint/lib/rules/prefer-numeric-literals.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-numeric-literals'>;\n}\ndeclare module 'eslint/lib/rules/prefer-promise-reject-errors.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-promise-reject-errors'>;\n}\ndeclare module 'eslint/lib/rules/prefer-reflect.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-reflect'>;\n}\ndeclare module 'eslint/lib/rules/prefer-rest-params.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-rest-params'>;\n}\ndeclare module 'eslint/lib/rules/prefer-spread.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-spread'>;\n}\ndeclare module 'eslint/lib/rules/prefer-template.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/prefer-template'>;\n}\ndeclare module 'eslint/lib/rules/quote-props.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/quote-props'>;\n}\ndeclare module 'eslint/lib/rules/quotes.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/quotes'>;\n}\ndeclare module 'eslint/lib/rules/radix.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/radix'>;\n}\ndeclare module 'eslint/lib/rules/require-await.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/require-await'>;\n}\ndeclare module 'eslint/lib/rules/require-jsdoc.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/require-jsdoc'>;\n}\ndeclare module 'eslint/lib/rules/require-yield.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/require-yield'>;\n}\ndeclare module 'eslint/lib/rules/rest-spread-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/rest-spread-spacing'>;\n}\ndeclare module 'eslint/lib/rules/semi-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/semi-spacing'>;\n}\ndeclare module 'eslint/lib/rules/semi-style.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/semi-style'>;\n}\ndeclare module 'eslint/lib/rules/semi.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/semi'>;\n}\ndeclare module 'eslint/lib/rules/sort-imports.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/sort-imports'>;\n}\ndeclare module 'eslint/lib/rules/sort-keys.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/sort-keys'>;\n}\ndeclare module 'eslint/lib/rules/sort-vars.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/sort-vars'>;\n}\ndeclare module 'eslint/lib/rules/space-before-blocks.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/space-before-blocks'>;\n}\ndeclare module 'eslint/lib/rules/space-before-function-paren.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/space-before-function-paren'>;\n}\ndeclare module 'eslint/lib/rules/space-in-parens.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/space-in-parens'>;\n}\ndeclare module 'eslint/lib/rules/space-infix-ops.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/space-infix-ops'>;\n}\ndeclare module 'eslint/lib/rules/space-unary-ops.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/space-unary-ops'>;\n}\ndeclare module 'eslint/lib/rules/spaced-comment.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/spaced-comment'>;\n}\ndeclare module 'eslint/lib/rules/strict.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/strict'>;\n}\ndeclare module 'eslint/lib/rules/switch-colon-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/switch-colon-spacing'>;\n}\ndeclare module 'eslint/lib/rules/symbol-description.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/symbol-description'>;\n}\ndeclare module 'eslint/lib/rules/template-curly-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/template-curly-spacing'>;\n}\ndeclare module 'eslint/lib/rules/template-tag-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/template-tag-spacing'>;\n}\ndeclare module 'eslint/lib/rules/unicode-bom.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/unicode-bom'>;\n}\ndeclare module 'eslint/lib/rules/use-isnan.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/use-isnan'>;\n}\ndeclare module 'eslint/lib/rules/valid-jsdoc.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/valid-jsdoc'>;\n}\ndeclare module 'eslint/lib/rules/valid-typeof.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/valid-typeof'>;\n}\ndeclare module 'eslint/lib/rules/vars-on-top.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/vars-on-top'>;\n}\ndeclare module 'eslint/lib/rules/wrap-iife.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/wrap-iife'>;\n}\ndeclare module 'eslint/lib/rules/wrap-regex.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/wrap-regex'>;\n}\ndeclare module 'eslint/lib/rules/yield-star-spacing.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/yield-star-spacing'>;\n}\ndeclare module 'eslint/lib/rules/yoda.js' {\n  declare module.exports: $Exports<'eslint/lib/rules/yoda'>;\n}\ndeclare module 'eslint/lib/testers/rule-tester.js' {\n  declare module.exports: $Exports<'eslint/lib/testers/rule-tester'>;\n}\ndeclare module 'eslint/lib/timing.js' {\n  declare module.exports: $Exports<'eslint/lib/timing'>;\n}\ndeclare module 'eslint/lib/token-store/backward-token-comment-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/backward-token-comment-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/backward-token-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/backward-token-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/cursor'>;\n}\ndeclare module 'eslint/lib/token-store/cursors.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/cursors'>;\n}\ndeclare module 'eslint/lib/token-store/decorative-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/decorative-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/filter-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/filter-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/forward-token-comment-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/forward-token-comment-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/forward-token-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/forward-token-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/index.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/index'>;\n}\ndeclare module 'eslint/lib/token-store/limit-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/limit-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/padded-token-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/padded-token-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/skip-cursor.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/skip-cursor'>;\n}\ndeclare module 'eslint/lib/token-store/utils.js' {\n  declare module.exports: $Exports<'eslint/lib/token-store/utils'>;\n}\ndeclare module 'eslint/lib/util/ajv.js' {\n  declare module.exports: $Exports<'eslint/lib/util/ajv'>;\n}\ndeclare module 'eslint/lib/util/apply-disable-directives.js' {\n  declare module.exports: $Exports<'eslint/lib/util/apply-disable-directives'>;\n}\ndeclare module 'eslint/lib/util/fix-tracker.js' {\n  declare module.exports: $Exports<'eslint/lib/util/fix-tracker'>;\n}\ndeclare module 'eslint/lib/util/glob-util.js' {\n  declare module.exports: $Exports<'eslint/lib/util/glob-util'>;\n}\ndeclare module 'eslint/lib/util/glob.js' {\n  declare module.exports: $Exports<'eslint/lib/util/glob'>;\n}\ndeclare module 'eslint/lib/util/hash.js' {\n  declare module.exports: $Exports<'eslint/lib/util/hash'>;\n}\ndeclare module 'eslint/lib/util/interpolate.js' {\n  declare module.exports: $Exports<'eslint/lib/util/interpolate'>;\n}\ndeclare module 'eslint/lib/util/keywords.js' {\n  declare module.exports: $Exports<'eslint/lib/util/keywords'>;\n}\ndeclare module 'eslint/lib/util/module-resolver.js' {\n  declare module.exports: $Exports<'eslint/lib/util/module-resolver'>;\n}\ndeclare module 'eslint/lib/util/naming.js' {\n  declare module.exports: $Exports<'eslint/lib/util/naming'>;\n}\ndeclare module 'eslint/lib/util/node-event-generator.js' {\n  declare module.exports: $Exports<'eslint/lib/util/node-event-generator'>;\n}\ndeclare module 'eslint/lib/util/npm-util.js' {\n  declare module.exports: $Exports<'eslint/lib/util/npm-util'>;\n}\ndeclare module 'eslint/lib/util/path-util.js' {\n  declare module.exports: $Exports<'eslint/lib/util/path-util'>;\n}\ndeclare module 'eslint/lib/util/patterns/letters.js' {\n  declare module.exports: $Exports<'eslint/lib/util/patterns/letters'>;\n}\ndeclare module 'eslint/lib/util/rule-fixer.js' {\n  declare module.exports: $Exports<'eslint/lib/util/rule-fixer'>;\n}\ndeclare module 'eslint/lib/util/safe-emitter.js' {\n  declare module.exports: $Exports<'eslint/lib/util/safe-emitter'>;\n}\ndeclare module 'eslint/lib/util/source-code-fixer.js' {\n  declare module.exports: $Exports<'eslint/lib/util/source-code-fixer'>;\n}\ndeclare module 'eslint/lib/util/source-code-util.js' {\n  declare module.exports: $Exports<'eslint/lib/util/source-code-util'>;\n}\ndeclare module 'eslint/lib/util/source-code.js' {\n  declare module.exports: $Exports<'eslint/lib/util/source-code'>;\n}\ndeclare module 'eslint/lib/util/traverser.js' {\n  declare module.exports: $Exports<'eslint/lib/util/traverser'>;\n}\ndeclare module 'eslint/lib/util/xml-escape.js' {\n  declare module.exports: $Exports<'eslint/lib/util/xml-escape'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/expo-server-sdk_vx.x.x.js",
    "content": "// flow-typed signature: 3f270976cb128c991faff0ddfc6f6aa3\n// flow-typed version: <<STUB>>/expo-server-sdk_v2.3.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'expo-server-sdk'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'expo-server-sdk' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/expo_vx.x.x.js",
    "content": "// flow-typed signature: 0ab3677c8ee0ecd2c38c9d3b9a511bf2\n// flow-typed version: <<STUB>>/expo_v25.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'expo'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'expo' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/express-enforces-ssl_vx.x.x.js",
    "content": "// flow-typed signature: e36181803629e2d4387bbfd37640c8e6\n// flow-typed version: <<STUB>>/express-enforces-ssl_v1.1.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'express-enforces-ssl'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'express-enforces-ssl' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'express-enforces-ssl/index' {\n  declare module.exports: $Exports<'express-enforces-ssl'>;\n}\ndeclare module 'express-enforces-ssl/index.js' {\n  declare module.exports: $Exports<'express-enforces-ssl'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/express-hot-shots_vx.x.x.js",
    "content": "// flow-typed signature: 1cdaa5e3b96efaeacdd3cbc4b45b40d3\n// flow-typed version: <<STUB>>/express-hot-shots_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'express-hot-shots'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'express-hot-shots' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'express-hot-shots/Gruntfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-hot-shots/lib/express-hot-shots' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-hot-shots/test/express-hot-shots' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-hot-shots/test/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'express-hot-shots/Gruntfile.js' {\n  declare module.exports: $Exports<'express-hot-shots/Gruntfile'>;\n}\ndeclare module 'express-hot-shots/lib/express-hot-shots.js' {\n  declare module.exports: $Exports<'express-hot-shots/lib/express-hot-shots'>;\n}\ndeclare module 'express-hot-shots/test/express-hot-shots.js' {\n  declare module.exports: $Exports<'express-hot-shots/test/express-hot-shots'>;\n}\ndeclare module 'express-hot-shots/test/utils.js' {\n  declare module.exports: $Exports<'express-hot-shots/test/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/express-session_vx.x.x.js",
    "content": "// flow-typed signature: d8aa1a3f1477f62d348c0919d3e44c4c\n// flow-typed version: <<STUB>>/express-session_v^1.15.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'express-session'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'express-session' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'express-session/session/cookie' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-session/session/memory' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-session/session/session' {\n  declare module.exports: any;\n}\n\ndeclare module 'express-session/session/store' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'express-session/index' {\n  declare module.exports: $Exports<'express-session'>;\n}\ndeclare module 'express-session/index.js' {\n  declare module.exports: $Exports<'express-session'>;\n}\ndeclare module 'express-session/session/cookie.js' {\n  declare module.exports: $Exports<'express-session/session/cookie'>;\n}\ndeclare module 'express-session/session/memory.js' {\n  declare module.exports: $Exports<'express-session/session/memory'>;\n}\ndeclare module 'express-session/session/session.js' {\n  declare module.exports: $Exports<'express-session/session/session'>;\n}\ndeclare module 'express-session/session/store.js' {\n  declare module.exports: $Exports<'express-session/session/store'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/express_v4.x.x.js",
    "content": "// flow-typed signature: 730b5b5f47f89c6e5871c0d9e9cd72d9\n// flow-typed version: 8d3bb346ba/express_v4.x.x/flow_>=v0.32.x\n\nimport type { Server } from 'http';\nimport type { Socket } from 'net';\n\ndeclare type express$RouterOptions = {\n  caseSensitive?: boolean,\n  mergeParams?: boolean,\n  strict?: boolean,\n};\n\ndeclare class express$RequestResponseBase {\n  app: express$Application,\n  get(field: string): string | void,\n}\n\ndeclare type express$RequestParams = {\n  [param: string]: string,\n};\n\ndeclare class express$Request extends http$IncomingMessage {\n  baseUrl: string,\n  body: any,\n  cookies: { [cookie: string]: string },\n  connection: Socket,\n  fresh: boolean,\n  hostname: string,\n  ip: string,\n  ips: Array<string>,\n  method: string,\n  originalUrl: string,\n  params: express$RequestParams,\n  path: string,\n  protocol: 'https' | 'http',\n  query: { [name: string]: string | Array<string> },\n  route: string,\n  secure: boolean,\n  signedCookies: { [signedCookie: string]: string },\n  stale: boolean,\n  subdomains: Array<string>,\n  xhr: boolean,\n  accepts(types: string): string | false,\n  accepts(types: Array<string>): string | false,\n  acceptsCharsets(...charsets: Array<string>): string | false,\n  acceptsEncodings(...encoding: Array<string>): string | false,\n  acceptsLanguages(...lang: Array<string>): string | false,\n  header(field: string): string | void,\n  is(type: string): boolean,\n  param(name: string, defaultValue?: string): string | void,\n}\n\ndeclare type express$CookieOptions = {\n  domain?: string,\n  encode?: (value: string) => string,\n  expires?: Date,\n  httpOnly?: boolean,\n  maxAge?: number,\n  path?: string,\n  secure?: boolean,\n  signed?: boolean,\n};\n\ndeclare type express$RenderCallback = (\n  err: Error | null,\n  html?: string\n) => mixed;\n\ndeclare type express$SendFileOptions = {\n  maxAge?: number,\n  root?: string,\n  lastModified?: boolean,\n  headers?: { [name: string]: string },\n  dotfiles?: 'allow' | 'deny' | 'ignore',\n};\n\ndeclare class express$Response extends http$ServerResponse {\n  headersSent: boolean,\n  locals: { [name: string]: mixed },\n  append(field: string, value?: string): this,\n  attachment(filename?: string): this,\n  cookie(name: string, value: string, options?: express$CookieOptions): this,\n  clearCookie(name: string, options?: express$CookieOptions): this,\n  download(\n    path: string,\n    filename?: string,\n    callback?: (err?: ?Error) => void\n  ): this,\n  format(typesObject: { [type: string]: Function }): this,\n  json(body?: mixed): this,\n  jsonp(body?: mixed): this,\n  links(links: { [name: string]: string }): this,\n  location(path: string): this,\n  redirect(url: string, ...args: Array<void>): this,\n  redirect(status: number, url: string, ...args: Array<void>): this,\n  render(\n    view: string,\n    locals?: { [name: string]: mixed },\n    callback?: express$RenderCallback\n  ): this,\n  send(body?: mixed): this,\n  sendFile(\n    path: string,\n    options?: express$SendFileOptions,\n    callback?: (err?: ?Error) => mixed\n  ): this,\n  sendStatus(statusCode: number): this,\n  header(field: string, value?: string): this,\n  header(headers: { [name: string]: string }): this,\n  set(field: string, value?: string | string[]): this,\n  set(headers: { [name: string]: string }): this,\n  status(statusCode: number): this,\n  type(type: string): this,\n  vary(field: string): this,\n  req: express$Request,\n}\n\ndeclare type express$NextFunction = (err?: ?Error | 'route') => mixed;\ndeclare type express$Middleware =\n  | ((\n      req: $Subtype<express$Request>,\n      res: express$Response,\n      next: express$NextFunction\n    ) => mixed)\n  | ((\n      error: ?Error,\n      req: $Subtype<express$Request>,\n      res: express$Response,\n      next: express$NextFunction\n    ) => mixed);\ndeclare interface express$RouteMethodType<T> {\n  (middleware: express$Middleware): T,\n  (...middleware: Array<express$Middleware>): T,\n  (\n    path: string | RegExp | string[],\n    ...middleware: Array<express$Middleware>\n  ): T,\n}\ndeclare class express$Route {\n  all: express$RouteMethodType<this>,\n  get: express$RouteMethodType<this>,\n  post: express$RouteMethodType<this>,\n  put: express$RouteMethodType<this>,\n  head: express$RouteMethodType<this>,\n  delete: express$RouteMethodType<this>,\n  options: express$RouteMethodType<this>,\n  trace: express$RouteMethodType<this>,\n  copy: express$RouteMethodType<this>,\n  lock: express$RouteMethodType<this>,\n  mkcol: express$RouteMethodType<this>,\n  move: express$RouteMethodType<this>,\n  purge: express$RouteMethodType<this>,\n  propfind: express$RouteMethodType<this>,\n  proppatch: express$RouteMethodType<this>,\n  unlock: express$RouteMethodType<this>,\n  report: express$RouteMethodType<this>,\n  mkactivity: express$RouteMethodType<this>,\n  checkout: express$RouteMethodType<this>,\n  merge: express$RouteMethodType<this>,\n\n  // @TODO Missing 'm-search' but get flow illegal name error.\n\n  notify: express$RouteMethodType<this>,\n  subscribe: express$RouteMethodType<this>,\n  unsubscribe: express$RouteMethodType<this>,\n  patch: express$RouteMethodType<this>,\n  search: express$RouteMethodType<this>,\n  connect: express$RouteMethodType<this>,\n}\n\ndeclare class express$Router extends express$Route {\n  constructor(options?: express$RouterOptions): void,\n  route(path: string): express$Route,\n  static (options?: express$RouterOptions): express$Router,\n  use(middleware: express$Middleware): this,\n  use(...middleware: Array<express$Middleware>): this,\n  use(\n    path: string | RegExp | string[],\n    ...middleware: Array<express$Middleware>\n  ): this,\n  use(path: string, router: express$Router): this,\n  handle(\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next: express$NextFunction\n  ): void,\n\n  // Can't use regular callable signature syntax due to https://github.com/facebook/flow/issues/3084\n  $call: (\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next?: ?express$NextFunction\n  ) => void,\n}\n\ndeclare class express$Application extends express$Router {\n  constructor(): void,\n  locals: { [name: string]: mixed },\n  mountpath: string,\n  listen(\n    port: number,\n    hostname?: string,\n    backlog?: number,\n    callback?: (err?: ?Error) => mixed\n  ): Server,\n  listen(\n    port: number,\n    hostname?: string,\n    callback?: (err?: ?Error) => mixed\n  ): Server,\n  listen(port: number, callback?: (err?: ?Error) => mixed): Server,\n  listen(path: string, callback?: (err?: ?Error) => mixed): Server,\n  listen(handle: Object, callback?: (err?: ?Error) => mixed): Server,\n  disable(name: string): void,\n  disabled(name: string): boolean,\n  enable(name: string): express$Application,\n  enabled(name: string): boolean,\n  engine(name: string, callback: Function): void,\n  /**\n   * Mixed will not be taken as a value option. Issue around using the GET http method name and the get for settings.\n   */\n  //   get(name: string): mixed;\n  set(name: string, value: mixed): mixed,\n  render(\n    name: string,\n    optionsOrFunction: { [name: string]: mixed },\n    callback: express$RenderCallback\n  ): void,\n  handle(\n    req: http$IncomingMessage,\n    res: http$ServerResponse,\n    next?: ?express$NextFunction\n  ): void,\n}\n\ndeclare module 'express' {\n  declare export type RouterOptions = express$RouterOptions;\n  declare export type CookieOptions = express$CookieOptions;\n  declare export type Middleware = express$Middleware;\n  declare export type NextFunction = express$NextFunction;\n  declare export type RequestParams = express$RequestParams;\n  declare export type $Response = express$Response;\n  declare export type $Request = express$Request;\n  declare export type $Application = express$Application;\n\n  declare module.exports: {\n    (): express$Application, // If you try to call like a function, it will use this signature\n    static: (root: string, options?: Object) => express$Middleware, // `static` property on the function\n    Router: typeof express$Router, // `Router` property on the function\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/faker_vx.x.x.js",
    "content": "// flow-typed signature: cfa901aa04a97e9872865b4c29a8ad88\n// flow-typed version: <<STUB>>/faker_v^4.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'faker'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'faker' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'faker/lib/address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/commerce' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/company' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/database' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/date' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/fake' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/finance' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/hacker' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/iban' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/image' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/internet' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/address/street_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/az/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/street' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/address/time_zone' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/cz/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/company/legal_form' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/nobility_title_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_AT/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/address/country_code' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de_CH/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/company/legal_form' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/nobility_title_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/de/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/address/county' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/app/author' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/app/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/app/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/app/version' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/business/credit_card_expiry_dates' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/business/credit_card_numbers' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/business/credit_card_types' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/business/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/american_express' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/discover' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/maestro' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/mastercard' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/credit_card/visa' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/finance/account_type' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/finance/currency' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/finance/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/finance/transaction_type' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/hacker/abbreviation' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/hacker/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/hacker/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/hacker/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/hacker/verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/internet/avatar_uri' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/team/creature' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/team/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/el/team/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/region' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/name/ocker_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_au_ocker/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_AU/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_BORK/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_BORK/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_BORK/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_CA/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/address/county' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/address/uk_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_GB/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/address/county' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IE/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_IND/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/address/postcode_by_state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/phone_number/area_code' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/phone_number/exchange_code' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en_US/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/country_code' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/county' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/postcode_by_state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/address/time_zone' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/app/author' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/app/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/app/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/app/version' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/business/credit_card_expiry_dates' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/business/credit_card_numbers' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/business/credit_card_types' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/business/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/american_express' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/diners_club' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/discover' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/jcb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/laser' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/maestro' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/mastercard' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/solo' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/switch' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/credit_card/visa' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/database/collation' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/database/column' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/database/engine' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/database/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/database/type' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/finance/account_type' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/finance/currency' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/finance/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/finance/transaction_type' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/abbreviation' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/ingverb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/hacker/verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/internet/avatar_uri' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/internet/example_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/system/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/system/mimeTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/team/creature' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/team/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/en/team/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/street' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/address/time_zone' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/team/creature' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/team/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es_MX/team/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/province' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/address/time_zone' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/es/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fa/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fa/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fa/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fa/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fa/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr_CA/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/fr/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/address/street_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ge/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/female_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/male_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/id_ID/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/it/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ja/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ko/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/address/street_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/lv/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/city_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/common_street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/feminine_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/masculine_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nb_NO/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nep/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/name/tussenvoegsel' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/nl/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/adjetive' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/bs_adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pl/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/pt_BR/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/address/street_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/female_middle_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/male_middle_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/ru/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/street' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/address/time_zone' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/adjective' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/bs_noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/bs_verb' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/descriptor' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/noun' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/lorem/supplemental' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sk/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/common_street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/cell_phone/common_cell_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/commerce/color' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/commerce/department' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/commerce/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/commerce/product_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/date/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/date/month' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/date/weekday' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/first_name_men' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/first_name_women' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/team/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/team/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/sv/team/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/address/street_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/phone_number/area_code' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/tr/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/city_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/secondary_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/street_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/address/street_title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/company/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/internet/free_email' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/female_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/female_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/female_middle_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/male_first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/male_last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/male_middle_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/name/title' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/uk/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/address/city_root' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/address/county' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/cell_phone/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/cell_phone/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/company/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/company/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/company/prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/internet/domain_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/internet/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/lorem/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/lorem/words' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/vi/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_CN/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/building_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/city_prefix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/city_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/city' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/default_country' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/postcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/state_abbr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/street_address' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/street_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/address/street_suffix' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/name/first_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/name/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/name/last_name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/name/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/phone_number/formats' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/locales/zh_TW/phone_number/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/lorem' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/name' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/phone_number' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/random' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/lib/system' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/az' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/cz' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/de_AT' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/de_CH' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/de' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_au_ocker' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_AU' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_BORK' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_CA' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_GB' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_IE' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_IND' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en_US' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/en' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/es_MX' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/es' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/fa' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/fr_CA' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/fr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/ge' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/id_ID' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/it' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/ja' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/ko' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/nb_NO' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/nep' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/nl' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/pl' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/pt_BR' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/ru' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/sk' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/sv' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/tr' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/uk' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/vi' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/zh_CN' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/locale/zh_TW' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/package' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/vendor/mersenne' {\n  declare module.exports: any;\n}\n\ndeclare module 'faker/vendor/user-agent' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'faker/index' {\n  declare module.exports: $Exports<'faker'>;\n}\ndeclare module 'faker/index.js' {\n  declare module.exports: $Exports<'faker'>;\n}\ndeclare module 'faker/lib/address.js' {\n  declare module.exports: $Exports<'faker/lib/address'>;\n}\ndeclare module 'faker/lib/commerce.js' {\n  declare module.exports: $Exports<'faker/lib/commerce'>;\n}\ndeclare module 'faker/lib/company.js' {\n  declare module.exports: $Exports<'faker/lib/company'>;\n}\ndeclare module 'faker/lib/database.js' {\n  declare module.exports: $Exports<'faker/lib/database'>;\n}\ndeclare module 'faker/lib/date.js' {\n  declare module.exports: $Exports<'faker/lib/date'>;\n}\ndeclare module 'faker/lib/fake.js' {\n  declare module.exports: $Exports<'faker/lib/fake'>;\n}\ndeclare module 'faker/lib/finance.js' {\n  declare module.exports: $Exports<'faker/lib/finance'>;\n}\ndeclare module 'faker/lib/hacker.js' {\n  declare module.exports: $Exports<'faker/lib/hacker'>;\n}\ndeclare module 'faker/lib/helpers.js' {\n  declare module.exports: $Exports<'faker/lib/helpers'>;\n}\ndeclare module 'faker/lib/iban.js' {\n  declare module.exports: $Exports<'faker/lib/iban'>;\n}\ndeclare module 'faker/lib/image.js' {\n  declare module.exports: $Exports<'faker/lib/image'>;\n}\ndeclare module 'faker/lib/index.js' {\n  declare module.exports: $Exports<'faker/lib/index'>;\n}\ndeclare module 'faker/lib/internet.js' {\n  declare module.exports: $Exports<'faker/lib/internet'>;\n}\ndeclare module 'faker/lib/locales.js' {\n  declare module.exports: $Exports<'faker/lib/locales'>;\n}\ndeclare module 'faker/lib/locales/az/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/az/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/az/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/city'>;\n}\ndeclare module 'faker/lib/locales/az/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/country'>;\n}\ndeclare module 'faker/lib/locales/az/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/az/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/index'>;\n}\ndeclare module 'faker/lib/locales/az/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/az/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/az/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/state'>;\n}\ndeclare module 'faker/lib/locales/az/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/az/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/az/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/az/address/street_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/address/street_title'>;\n}\ndeclare module 'faker/lib/locales/az/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/az/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/az/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/az/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/az/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/company/index'>;\n}\ndeclare module 'faker/lib/locales/az/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/company/name'>;\n}\ndeclare module 'faker/lib/locales/az/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/az/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/az/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/date/index'>;\n}\ndeclare module 'faker/lib/locales/az/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/date/month'>;\n}\ndeclare module 'faker/lib/locales/az/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/az/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/index'>;\n}\ndeclare module 'faker/lib/locales/az/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/az/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/az/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/internet/index'>;\n}\ndeclare module 'faker/lib/locales/az/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/az/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/az/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/index'>;\n}\ndeclare module 'faker/lib/locales/az/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/az/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/az/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/name'>;\n}\ndeclare module 'faker/lib/locales/az/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/az/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/az/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/az/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/az/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/cz/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/cz/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/cz/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/city'>;\n}\ndeclare module 'faker/lib/locales/cz/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/country'>;\n}\ndeclare module 'faker/lib/locales/cz/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/cz/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/index'>;\n}\ndeclare module 'faker/lib/locales/cz/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/cz/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/cz/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/cz/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/state'>;\n}\ndeclare module 'faker/lib/locales/cz/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/cz/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/cz/address/street.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/street'>;\n}\ndeclare module 'faker/lib/locales/cz/address/time_zone.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/address/time_zone'>;\n}\ndeclare module 'faker/lib/locales/cz/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/cz/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/cz/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/cz/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/cz/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/index'>;\n}\ndeclare module 'faker/lib/locales/cz/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/name'>;\n}\ndeclare module 'faker/lib/locales/cz/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/noun'>;\n}\ndeclare module 'faker/lib/locales/cz/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/cz/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/date/index'>;\n}\ndeclare module 'faker/lib/locales/cz/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/date/month'>;\n}\ndeclare module 'faker/lib/locales/cz/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/cz/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/index'>;\n}\ndeclare module 'faker/lib/locales/cz/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/cz/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/cz/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/internet/index'>;\n}\ndeclare module 'faker/lib/locales/cz/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/cz/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/cz/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/cz/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/cz/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/cz/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/index'>;\n}\ndeclare module 'faker/lib/locales/cz/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/cz/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/cz/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/name'>;\n}\ndeclare module 'faker/lib/locales/cz/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/cz/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/cz/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/name/title'>;\n}\ndeclare module 'faker/lib/locales/cz/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/cz/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/cz/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/city'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/country'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/state'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/de_AT/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/de_AT/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/company/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/company/legal_form.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/company/legal_form'>;\n}\ndeclare module 'faker/lib/locales/de_AT/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/company/name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/de_AT/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/de_AT/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/de_AT/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/internet/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/index'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/name'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/nobility_title_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/nobility_title_prefix'>;\n}\ndeclare module 'faker/lib/locales/de_AT/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/de_AT/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/de_AT/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_AT/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/address/country_code.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/address/country_code'>;\n}\ndeclare module 'faker/lib/locales/de_CH/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/de_CH/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/address/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/de_CH/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/company/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/company/name'>;\n}\ndeclare module 'faker/lib/locales/de_CH/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/de_CH/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/de_CH/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/internet/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/de_CH/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/name/index'>;\n}\ndeclare module 'faker/lib/locales/de_CH/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/de_CH/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/name/name'>;\n}\ndeclare module 'faker/lib/locales/de_CH/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/de_CH/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/de_CH/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de_CH/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/de/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/de/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/de/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/de/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/city'>;\n}\ndeclare module 'faker/lib/locales/de/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/country'>;\n}\ndeclare module 'faker/lib/locales/de/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/de/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/index'>;\n}\ndeclare module 'faker/lib/locales/de/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/de/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/de/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/de/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/state'>;\n}\ndeclare module 'faker/lib/locales/de/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/de/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/de/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/de/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/de/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/de/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/company/index'>;\n}\ndeclare module 'faker/lib/locales/de/company/legal_form.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/company/legal_form'>;\n}\ndeclare module 'faker/lib/locales/de/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/company/name'>;\n}\ndeclare module 'faker/lib/locales/de/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/de/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/index'>;\n}\ndeclare module 'faker/lib/locales/de/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/de/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/de/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/internet/index'>;\n}\ndeclare module 'faker/lib/locales/de/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/de/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/de/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/de/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/index'>;\n}\ndeclare module 'faker/lib/locales/de/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/de/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/name'>;\n}\ndeclare module 'faker/lib/locales/de/name/nobility_title_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/nobility_title_prefix'>;\n}\ndeclare module 'faker/lib/locales/de/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/de/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/de/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/de/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/el/address/county.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/address/county'>;\n}\ndeclare module 'faker/lib/locales/el/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/el/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/address/index'>;\n}\ndeclare module 'faker/lib/locales/el/app/author.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/app/author'>;\n}\ndeclare module 'faker/lib/locales/el/app/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/app/index'>;\n}\ndeclare module 'faker/lib/locales/el/app/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/app/name'>;\n}\ndeclare module 'faker/lib/locales/el/app/version.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/app/version'>;\n}\ndeclare module 'faker/lib/locales/el/business/credit_card_expiry_dates.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/business/credit_card_expiry_dates'>;\n}\ndeclare module 'faker/lib/locales/el/business/credit_card_numbers.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/business/credit_card_numbers'>;\n}\ndeclare module 'faker/lib/locales/el/business/credit_card_types.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/business/credit_card_types'>;\n}\ndeclare module 'faker/lib/locales/el/business/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/business/index'>;\n}\ndeclare module 'faker/lib/locales/el/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/el/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/el/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/el/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/el/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/el/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/el/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/el/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/el/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/el/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/el/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/el/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/index'>;\n}\ndeclare module 'faker/lib/locales/el/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/name'>;\n}\ndeclare module 'faker/lib/locales/el/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/noun'>;\n}\ndeclare module 'faker/lib/locales/el/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/american_express.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/american_express'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/discover.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/discover'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/index'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/maestro.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/maestro'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/mastercard.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/mastercard'>;\n}\ndeclare module 'faker/lib/locales/el/credit_card/visa.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/credit_card/visa'>;\n}\ndeclare module 'faker/lib/locales/el/finance/account_type.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/finance/account_type'>;\n}\ndeclare module 'faker/lib/locales/el/finance/currency.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/finance/currency'>;\n}\ndeclare module 'faker/lib/locales/el/finance/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/finance/index'>;\n}\ndeclare module 'faker/lib/locales/el/finance/transaction_type.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/finance/transaction_type'>;\n}\ndeclare module 'faker/lib/locales/el/hacker/abbreviation.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/hacker/abbreviation'>;\n}\ndeclare module 'faker/lib/locales/el/hacker/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/hacker/adjective'>;\n}\ndeclare module 'faker/lib/locales/el/hacker/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/hacker/index'>;\n}\ndeclare module 'faker/lib/locales/el/hacker/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/hacker/noun'>;\n}\ndeclare module 'faker/lib/locales/el/hacker/verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/hacker/verb'>;\n}\ndeclare module 'faker/lib/locales/el/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/index'>;\n}\ndeclare module 'faker/lib/locales/el/internet/avatar_uri.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/internet/avatar_uri'>;\n}\ndeclare module 'faker/lib/locales/el/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/el/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/el/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/internet/index'>;\n}\ndeclare module 'faker/lib/locales/el/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/el/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/el/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/el/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/el/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/index'>;\n}\ndeclare module 'faker/lib/locales/el/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/el/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/name'>;\n}\ndeclare module 'faker/lib/locales/el/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/el/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/name/title'>;\n}\ndeclare module 'faker/lib/locales/el/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/el/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/el/team/creature.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/team/creature'>;\n}\ndeclare module 'faker/lib/locales/el/team/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/team/index'>;\n}\ndeclare module 'faker/lib/locales/el/team/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/el/team/name'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/city'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/region.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/region'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/state'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/company/index'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/index'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/name/index'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/name/ocker_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/name/ocker_first_name'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_au_ocker/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_au_ocker/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/state'>;\n}\ndeclare module 'faker/lib/locales/en_AU/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_AU/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/company/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/en_AU/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_AU/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/en_AU/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/name/index'>;\n}\ndeclare module 'faker/lib/locales/en_AU/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/en_AU/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_AU/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_AU/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_BORK/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_BORK/index'>;\n}\ndeclare module 'faker/lib/locales/en_BORK/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_BORK/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/en_BORK/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_BORK/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/en_CA/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_CA/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_CA/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en_CA/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/en_CA/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/address/state'>;\n}\ndeclare module 'faker/lib/locales/en_CA/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/index'>;\n}\ndeclare module 'faker/lib/locales/en_CA/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_CA/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/en_CA/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_CA/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_CA/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_CA/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_GB/address/county.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/address/county'>;\n}\ndeclare module 'faker/lib/locales/en_GB/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_GB/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_GB/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en_GB/address/uk_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/address/uk_country'>;\n}\ndeclare module 'faker/lib/locales/en_GB/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/en_GB/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/en_GB/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/index'>;\n}\ndeclare module 'faker/lib/locales/en_GB/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_GB/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_GB/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_GB/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_GB/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_IE/address/county.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/address/county'>;\n}\ndeclare module 'faker/lib/locales/en_IE/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_IE/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_IE/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/en_IE/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/en_IE/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/index'>;\n}\ndeclare module 'faker/lib/locales/en_IE/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_IE/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_IE/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_IE/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IE/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_IND/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en_IND/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/en_IND/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/address/state'>;\n}\ndeclare module 'faker/lib/locales/en_IND/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/company/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/en_IND/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_IND/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/en_IND/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/en_IND/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/name/index'>;\n}\ndeclare module 'faker/lib/locales/en_IND/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/en_IND/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en_IND/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_IND/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en_US/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en_US/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/address/index'>;\n}\ndeclare module 'faker/lib/locales/en_US/address/postcode_by_state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/address/postcode_by_state'>;\n}\ndeclare module 'faker/lib/locales/en_US/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/index'>;\n}\ndeclare module 'faker/lib/locales/en_US/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en_US/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en_US/phone_number/area_code.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/phone_number/area_code'>;\n}\ndeclare module 'faker/lib/locales/en_US/phone_number/exchange_code.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/phone_number/exchange_code'>;\n}\ndeclare module 'faker/lib/locales/en_US/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en_US/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/en/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/en/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/en/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/city'>;\n}\ndeclare module 'faker/lib/locales/en/address/country_code.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/country_code'>;\n}\ndeclare module 'faker/lib/locales/en/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/country'>;\n}\ndeclare module 'faker/lib/locales/en/address/county.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/county'>;\n}\ndeclare module 'faker/lib/locales/en/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/en/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/index'>;\n}\ndeclare module 'faker/lib/locales/en/address/postcode_by_state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/postcode_by_state'>;\n}\ndeclare module 'faker/lib/locales/en/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/en/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/en/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/en/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/state'>;\n}\ndeclare module 'faker/lib/locales/en/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/en/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/en/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/en/address/time_zone.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/address/time_zone'>;\n}\ndeclare module 'faker/lib/locales/en/app/author.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/app/author'>;\n}\ndeclare module 'faker/lib/locales/en/app/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/app/index'>;\n}\ndeclare module 'faker/lib/locales/en/app/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/app/name'>;\n}\ndeclare module 'faker/lib/locales/en/app/version.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/app/version'>;\n}\ndeclare module 'faker/lib/locales/en/business/credit_card_expiry_dates.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/business/credit_card_expiry_dates'>;\n}\ndeclare module 'faker/lib/locales/en/business/credit_card_numbers.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/business/credit_card_numbers'>;\n}\ndeclare module 'faker/lib/locales/en/business/credit_card_types.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/business/credit_card_types'>;\n}\ndeclare module 'faker/lib/locales/en/business/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/business/index'>;\n}\ndeclare module 'faker/lib/locales/en/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/en/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/en/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/en/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/en/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/en/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/en/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/en/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/en/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/en/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/en/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/en/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/index'>;\n}\ndeclare module 'faker/lib/locales/en/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/name'>;\n}\ndeclare module 'faker/lib/locales/en/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/noun'>;\n}\ndeclare module 'faker/lib/locales/en/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/american_express.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/american_express'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/diners_club.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/diners_club'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/discover.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/discover'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/index'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/jcb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/jcb'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/laser.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/laser'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/maestro.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/maestro'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/mastercard.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/mastercard'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/solo.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/solo'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/switch.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/switch'>;\n}\ndeclare module 'faker/lib/locales/en/credit_card/visa.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/credit_card/visa'>;\n}\ndeclare module 'faker/lib/locales/en/database/collation.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/database/collation'>;\n}\ndeclare module 'faker/lib/locales/en/database/column.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/database/column'>;\n}\ndeclare module 'faker/lib/locales/en/database/engine.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/database/engine'>;\n}\ndeclare module 'faker/lib/locales/en/database/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/database/index'>;\n}\ndeclare module 'faker/lib/locales/en/database/type.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/database/type'>;\n}\ndeclare module 'faker/lib/locales/en/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/date/index'>;\n}\ndeclare module 'faker/lib/locales/en/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/date/month'>;\n}\ndeclare module 'faker/lib/locales/en/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/en/finance/account_type.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/finance/account_type'>;\n}\ndeclare module 'faker/lib/locales/en/finance/currency.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/finance/currency'>;\n}\ndeclare module 'faker/lib/locales/en/finance/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/finance/index'>;\n}\ndeclare module 'faker/lib/locales/en/finance/transaction_type.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/finance/transaction_type'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/abbreviation.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/abbreviation'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/adjective'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/index'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/ingverb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/ingverb'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/noun'>;\n}\ndeclare module 'faker/lib/locales/en/hacker/verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/hacker/verb'>;\n}\ndeclare module 'faker/lib/locales/en/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/index'>;\n}\ndeclare module 'faker/lib/locales/en/internet/avatar_uri.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/internet/avatar_uri'>;\n}\ndeclare module 'faker/lib/locales/en/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/en/internet/example_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/internet/example_email'>;\n}\ndeclare module 'faker/lib/locales/en/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/en/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/internet/index'>;\n}\ndeclare module 'faker/lib/locales/en/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/en/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/en/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/en/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/en/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/index'>;\n}\ndeclare module 'faker/lib/locales/en/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/en/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/name'>;\n}\ndeclare module 'faker/lib/locales/en/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/en/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/en/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/name/title'>;\n}\ndeclare module 'faker/lib/locales/en/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/en/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/en/system/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/system/index'>;\n}\ndeclare module 'faker/lib/locales/en/system/mimeTypes.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/system/mimeTypes'>;\n}\ndeclare module 'faker/lib/locales/en/team/creature.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/team/creature'>;\n}\ndeclare module 'faker/lib/locales/en/team/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/team/index'>;\n}\ndeclare module 'faker/lib/locales/en/team/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/en/team/name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/city'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/country'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/state'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/street.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/street'>;\n}\ndeclare module 'faker/lib/locales/es_MX/address/time_zone.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/address/time_zone'>;\n}\ndeclare module 'faker/lib/locales/es_MX/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/es_MX/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/es_MX/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/es_MX/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/noun'>;\n}\ndeclare module 'faker/lib/locales/es_MX/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/es_MX/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/internet/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/es_MX/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/name'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/es_MX/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/name/title'>;\n}\ndeclare module 'faker/lib/locales/es_MX/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/es_MX/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/team/creature.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/team/creature'>;\n}\ndeclare module 'faker/lib/locales/es_MX/team/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/team/index'>;\n}\ndeclare module 'faker/lib/locales/es_MX/team/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es_MX/team/name'>;\n}\ndeclare module 'faker/lib/locales/es/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/es/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/es/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/city'>;\n}\ndeclare module 'faker/lib/locales/es/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/country'>;\n}\ndeclare module 'faker/lib/locales/es/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/es/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/index'>;\n}\ndeclare module 'faker/lib/locales/es/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/es/address/province.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/province'>;\n}\ndeclare module 'faker/lib/locales/es/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/es/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/es/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/state'>;\n}\ndeclare module 'faker/lib/locales/es/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/es/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/es/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/es/address/time_zone.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/address/time_zone'>;\n}\ndeclare module 'faker/lib/locales/es/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/es/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/es/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/es/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/es/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/index'>;\n}\ndeclare module 'faker/lib/locales/es/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/name'>;\n}\ndeclare module 'faker/lib/locales/es/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/noun'>;\n}\ndeclare module 'faker/lib/locales/es/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/es/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/index'>;\n}\ndeclare module 'faker/lib/locales/es/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/es/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/es/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/internet/index'>;\n}\ndeclare module 'faker/lib/locales/es/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/es/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/index'>;\n}\ndeclare module 'faker/lib/locales/es/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/es/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/name'>;\n}\ndeclare module 'faker/lib/locales/es/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/es/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/es/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/name/title'>;\n}\ndeclare module 'faker/lib/locales/es/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/es/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/es/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/fa/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fa/index'>;\n}\ndeclare module 'faker/lib/locales/fa/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fa/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/fa/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fa/name/index'>;\n}\ndeclare module 'faker/lib/locales/fa/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fa/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/fa/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fa/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/address/index'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/address/state'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/index'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/internet/index'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/fr_CA/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr_CA/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/fr/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/fr/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/fr/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/city'>;\n}\ndeclare module 'faker/lib/locales/fr/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/fr/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/index'>;\n}\ndeclare module 'faker/lib/locales/fr/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/fr/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/fr/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/state'>;\n}\ndeclare module 'faker/lib/locales/fr/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/fr/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/fr/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/fr/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/fr/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/fr/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/fr/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/fr/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/fr/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/fr/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/index'>;\n}\ndeclare module 'faker/lib/locales/fr/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/name'>;\n}\ndeclare module 'faker/lib/locales/fr/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/noun'>;\n}\ndeclare module 'faker/lib/locales/fr/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/fr/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/index'>;\n}\ndeclare module 'faker/lib/locales/fr/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/fr/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/fr/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/internet/index'>;\n}\ndeclare module 'faker/lib/locales/fr/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/fr/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/fr/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/fr/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/fr/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/index'>;\n}\ndeclare module 'faker/lib/locales/fr/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/fr/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/name'>;\n}\ndeclare module 'faker/lib/locales/fr/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/fr/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/name/title'>;\n}\ndeclare module 'faker/lib/locales/fr/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/fr/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/fr/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/ge/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/ge/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/ge/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/ge/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/ge/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/city'>;\n}\ndeclare module 'faker/lib/locales/ge/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/country'>;\n}\ndeclare module 'faker/lib/locales/ge/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/ge/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/index'>;\n}\ndeclare module 'faker/lib/locales/ge/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/ge/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/ge/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/ge/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/ge/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/ge/address/street_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/address/street_title'>;\n}\ndeclare module 'faker/lib/locales/ge/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/ge/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/ge/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/company/index'>;\n}\ndeclare module 'faker/lib/locales/ge/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/company/name'>;\n}\ndeclare module 'faker/lib/locales/ge/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/ge/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/ge/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/index'>;\n}\ndeclare module 'faker/lib/locales/ge/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/ge/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/ge/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/internet/index'>;\n}\ndeclare module 'faker/lib/locales/ge/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/ge/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/index'>;\n}\ndeclare module 'faker/lib/locales/ge/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/ge/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/name'>;\n}\ndeclare module 'faker/lib/locales/ge/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/ge/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/name/title'>;\n}\ndeclare module 'faker/lib/locales/ge/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/ge/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ge/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/city'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/state'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/company/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/company/name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/date/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/date/month'>;\n}\ndeclare module 'faker/lib/locales/id_ID/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/id_ID/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/id_ID/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/internet/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/female_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/female_title'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/index'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/male_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/male_title'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/name'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/id_ID/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/id_ID/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/id_ID/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/it/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/it/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/it/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/it/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/city'>;\n}\ndeclare module 'faker/lib/locales/it/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/country'>;\n}\ndeclare module 'faker/lib/locales/it/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/it/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/index'>;\n}\ndeclare module 'faker/lib/locales/it/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/it/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/it/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/it/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/state'>;\n}\ndeclare module 'faker/lib/locales/it/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/it/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/it/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/it/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/it/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/it/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/it/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/it/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/it/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/index'>;\n}\ndeclare module 'faker/lib/locales/it/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/name'>;\n}\ndeclare module 'faker/lib/locales/it/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/noun'>;\n}\ndeclare module 'faker/lib/locales/it/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/it/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/index'>;\n}\ndeclare module 'faker/lib/locales/it/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/it/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/it/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/internet/index'>;\n}\ndeclare module 'faker/lib/locales/it/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/it/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/index'>;\n}\ndeclare module 'faker/lib/locales/it/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/it/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/name'>;\n}\ndeclare module 'faker/lib/locales/it/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/it/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/it/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/it/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/it/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/ja/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/ja/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/ja/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/city'>;\n}\ndeclare module 'faker/lib/locales/ja/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/index'>;\n}\ndeclare module 'faker/lib/locales/ja/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/ja/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/ja/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/state'>;\n}\ndeclare module 'faker/lib/locales/ja/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/ja/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/ja/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/ja/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/index'>;\n}\ndeclare module 'faker/lib/locales/ja/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/ja/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/name/index'>;\n}\ndeclare module 'faker/lib/locales/ja/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/ja/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/name/name'>;\n}\ndeclare module 'faker/lib/locales/ja/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/ja/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ja/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/ko/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/ko/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/ko/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/city'>;\n}\ndeclare module 'faker/lib/locales/ko/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/index'>;\n}\ndeclare module 'faker/lib/locales/ko/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/ko/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/ko/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/state'>;\n}\ndeclare module 'faker/lib/locales/ko/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/ko/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/ko/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/ko/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/company/index'>;\n}\ndeclare module 'faker/lib/locales/ko/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/company/name'>;\n}\ndeclare module 'faker/lib/locales/ko/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/ko/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/ko/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/index'>;\n}\ndeclare module 'faker/lib/locales/ko/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/ko/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/ko/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/internet/index'>;\n}\ndeclare module 'faker/lib/locales/ko/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/ko/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/ko/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/ko/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/name/index'>;\n}\ndeclare module 'faker/lib/locales/ko/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/ko/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/name/name'>;\n}\ndeclare module 'faker/lib/locales/ko/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/ko/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ko/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/lv/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/lv/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/lv/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/city'>;\n}\ndeclare module 'faker/lib/locales/lv/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/country'>;\n}\ndeclare module 'faker/lib/locales/lv/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/lv/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/index'>;\n}\ndeclare module 'faker/lib/locales/lv/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/lv/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/lv/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/state'>;\n}\ndeclare module 'faker/lib/locales/lv/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/lv/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/lv/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/lv/address/street_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/address/street_title'>;\n}\ndeclare module 'faker/lib/locales/lv/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/lv/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/lv/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/lv/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/lv/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/lv/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/lv/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/company/index'>;\n}\ndeclare module 'faker/lib/locales/lv/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/company/name'>;\n}\ndeclare module 'faker/lib/locales/lv/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/lv/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/lv/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/date/index'>;\n}\ndeclare module 'faker/lib/locales/lv/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/date/month'>;\n}\ndeclare module 'faker/lib/locales/lv/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/lv/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/index'>;\n}\ndeclare module 'faker/lib/locales/lv/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/lv/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/lv/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/internet/index'>;\n}\ndeclare module 'faker/lib/locales/lv/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/lv/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/lv/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/lv/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/lv/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/lv/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/index'>;\n}\ndeclare module 'faker/lib/locales/lv/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/lv/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/lv/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/name'>;\n}\ndeclare module 'faker/lib/locales/lv/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/lv/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/lv/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/name/title'>;\n}\ndeclare module 'faker/lib/locales/lv/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/lv/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/lv/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/city_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/city_root'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/city'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/common_street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/common_street_suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/state'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/company/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/company/name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/internet/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/feminine_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/feminine_name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/index'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/masculine_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/masculine_name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/name'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/nb_NO/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nb_NO/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/nep/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/address/city'>;\n}\ndeclare module 'faker/lib/locales/nep/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/nep/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/address/index'>;\n}\ndeclare module 'faker/lib/locales/nep/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/nep/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/address/state'>;\n}\ndeclare module 'faker/lib/locales/nep/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/company/index'>;\n}\ndeclare module 'faker/lib/locales/nep/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/nep/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/index'>;\n}\ndeclare module 'faker/lib/locales/nep/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/nep/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/nep/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/internet/index'>;\n}\ndeclare module 'faker/lib/locales/nep/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/nep/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/name/index'>;\n}\ndeclare module 'faker/lib/locales/nep/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/nep/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/nep/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nep/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/nl/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/nl/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/nl/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/nl/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/city'>;\n}\ndeclare module 'faker/lib/locales/nl/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/country'>;\n}\ndeclare module 'faker/lib/locales/nl/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/nl/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/index'>;\n}\ndeclare module 'faker/lib/locales/nl/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/nl/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/nl/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/state'>;\n}\ndeclare module 'faker/lib/locales/nl/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/nl/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/nl/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/nl/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/company/index'>;\n}\ndeclare module 'faker/lib/locales/nl/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/nl/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/index'>;\n}\ndeclare module 'faker/lib/locales/nl/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/nl/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/nl/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/internet/index'>;\n}\ndeclare module 'faker/lib/locales/nl/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/nl/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/nl/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/nl/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/nl/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/index'>;\n}\ndeclare module 'faker/lib/locales/nl/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/nl/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/name'>;\n}\ndeclare module 'faker/lib/locales/nl/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/nl/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/nl/name/tussenvoegsel.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/name/tussenvoegsel'>;\n}\ndeclare module 'faker/lib/locales/nl/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/nl/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/nl/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/pl/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/pl/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/pl/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/city'>;\n}\ndeclare module 'faker/lib/locales/pl/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/country'>;\n}\ndeclare module 'faker/lib/locales/pl/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/pl/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/index'>;\n}\ndeclare module 'faker/lib/locales/pl/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/pl/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/pl/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/pl/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/state'>;\n}\ndeclare module 'faker/lib/locales/pl/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/pl/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/pl/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/pl/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/pl/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/pl/company/adjetive.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/adjetive'>;\n}\ndeclare module 'faker/lib/locales/pl/company/bs_adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/bs_adjective'>;\n}\ndeclare module 'faker/lib/locales/pl/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/pl/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/pl/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/pl/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/index'>;\n}\ndeclare module 'faker/lib/locales/pl/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/name'>;\n}\ndeclare module 'faker/lib/locales/pl/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/noun'>;\n}\ndeclare module 'faker/lib/locales/pl/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/pl/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/index'>;\n}\ndeclare module 'faker/lib/locales/pl/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/pl/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/pl/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/internet/index'>;\n}\ndeclare module 'faker/lib/locales/pl/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/pl/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/pl/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/pl/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/pl/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/index'>;\n}\ndeclare module 'faker/lib/locales/pl/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/pl/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/name'>;\n}\ndeclare module 'faker/lib/locales/pl/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/pl/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/name/title'>;\n}\ndeclare module 'faker/lib/locales/pl/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/pl/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pl/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/country'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/state'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/company/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/company/name'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/internet/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/name/index'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/pt_BR/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/pt_BR/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/ru/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/ru/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/ru/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/city'>;\n}\ndeclare module 'faker/lib/locales/ru/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/country'>;\n}\ndeclare module 'faker/lib/locales/ru/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/ru/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/index'>;\n}\ndeclare module 'faker/lib/locales/ru/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/ru/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/ru/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/state'>;\n}\ndeclare module 'faker/lib/locales/ru/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/ru/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/ru/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/ru/address/street_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/address/street_title'>;\n}\ndeclare module 'faker/lib/locales/ru/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/ru/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/ru/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/ru/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/ru/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/company/index'>;\n}\ndeclare module 'faker/lib/locales/ru/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/company/name'>;\n}\ndeclare module 'faker/lib/locales/ru/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/ru/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/ru/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/date/index'>;\n}\ndeclare module 'faker/lib/locales/ru/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/date/month'>;\n}\ndeclare module 'faker/lib/locales/ru/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/ru/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/index'>;\n}\ndeclare module 'faker/lib/locales/ru/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/ru/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/ru/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/internet/index'>;\n}\ndeclare module 'faker/lib/locales/ru/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/female_middle_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/female_middle_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/index'>;\n}\ndeclare module 'faker/lib/locales/ru/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/male_middle_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/male_middle_name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/name'>;\n}\ndeclare module 'faker/lib/locales/ru/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/ru/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/ru/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/ru/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/ru/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/sk/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/sk/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/sk/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/sk/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/sk/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/city'>;\n}\ndeclare module 'faker/lib/locales/sk/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/country'>;\n}\ndeclare module 'faker/lib/locales/sk/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/sk/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/index'>;\n}\ndeclare module 'faker/lib/locales/sk/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/sk/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/sk/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/sk/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/state'>;\n}\ndeclare module 'faker/lib/locales/sk/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/sk/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/sk/address/street.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/street'>;\n}\ndeclare module 'faker/lib/locales/sk/address/time_zone.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/address/time_zone'>;\n}\ndeclare module 'faker/lib/locales/sk/company/adjective.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/adjective'>;\n}\ndeclare module 'faker/lib/locales/sk/company/bs_noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/bs_noun'>;\n}\ndeclare module 'faker/lib/locales/sk/company/bs_verb.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/bs_verb'>;\n}\ndeclare module 'faker/lib/locales/sk/company/descriptor.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/descriptor'>;\n}\ndeclare module 'faker/lib/locales/sk/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/index'>;\n}\ndeclare module 'faker/lib/locales/sk/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/name'>;\n}\ndeclare module 'faker/lib/locales/sk/company/noun.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/noun'>;\n}\ndeclare module 'faker/lib/locales/sk/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/sk/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/index'>;\n}\ndeclare module 'faker/lib/locales/sk/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/sk/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/sk/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/internet/index'>;\n}\ndeclare module 'faker/lib/locales/sk/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/sk/lorem/supplemental.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/lorem/supplemental'>;\n}\ndeclare module 'faker/lib/locales/sk/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/sk/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/sk/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/sk/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/index'>;\n}\ndeclare module 'faker/lib/locales/sk/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/sk/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/sk/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/name'>;\n}\ndeclare module 'faker/lib/locales/sk/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/sk/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/sk/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/name/title'>;\n}\ndeclare module 'faker/lib/locales/sk/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/sk/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sk/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/sv/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/sv/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/sv/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/sv/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/city'>;\n}\ndeclare module 'faker/lib/locales/sv/address/common_street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/common_street_suffix'>;\n}\ndeclare module 'faker/lib/locales/sv/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/country'>;\n}\ndeclare module 'faker/lib/locales/sv/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/sv/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/index'>;\n}\ndeclare module 'faker/lib/locales/sv/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/sv/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/sv/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/state'>;\n}\ndeclare module 'faker/lib/locales/sv/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/sv/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/sv/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/sv/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/sv/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/sv/cell_phone/common_cell_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/cell_phone/common_cell_prefix'>;\n}\ndeclare module 'faker/lib/locales/sv/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/sv/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/sv/commerce/color.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/commerce/color'>;\n}\ndeclare module 'faker/lib/locales/sv/commerce/department.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/commerce/department'>;\n}\ndeclare module 'faker/lib/locales/sv/commerce/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/commerce/index'>;\n}\ndeclare module 'faker/lib/locales/sv/commerce/product_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/commerce/product_name'>;\n}\ndeclare module 'faker/lib/locales/sv/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/company/index'>;\n}\ndeclare module 'faker/lib/locales/sv/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/company/name'>;\n}\ndeclare module 'faker/lib/locales/sv/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/sv/date/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/date/index'>;\n}\ndeclare module 'faker/lib/locales/sv/date/month.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/date/month'>;\n}\ndeclare module 'faker/lib/locales/sv/date/weekday.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/date/weekday'>;\n}\ndeclare module 'faker/lib/locales/sv/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/index'>;\n}\ndeclare module 'faker/lib/locales/sv/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/sv/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/internet/index'>;\n}\ndeclare module 'faker/lib/locales/sv/name/first_name_men.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/first_name_men'>;\n}\ndeclare module 'faker/lib/locales/sv/name/first_name_women.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/first_name_women'>;\n}\ndeclare module 'faker/lib/locales/sv/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/index'>;\n}\ndeclare module 'faker/lib/locales/sv/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/sv/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/name'>;\n}\ndeclare module 'faker/lib/locales/sv/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/sv/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/name/title'>;\n}\ndeclare module 'faker/lib/locales/sv/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/sv/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/sv/team/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/team/index'>;\n}\ndeclare module 'faker/lib/locales/sv/team/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/team/name'>;\n}\ndeclare module 'faker/lib/locales/sv/team/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/sv/team/suffix'>;\n}\ndeclare module 'faker/lib/locales/tr/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/tr/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/city'>;\n}\ndeclare module 'faker/lib/locales/tr/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/country'>;\n}\ndeclare module 'faker/lib/locales/tr/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/tr/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/index'>;\n}\ndeclare module 'faker/lib/locales/tr/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/tr/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/tr/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/tr/address/street_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/address/street_root'>;\n}\ndeclare module 'faker/lib/locales/tr/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/tr/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/tr/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/index'>;\n}\ndeclare module 'faker/lib/locales/tr/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/tr/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/internet/index'>;\n}\ndeclare module 'faker/lib/locales/tr/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/tr/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/tr/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/tr/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/name/index'>;\n}\ndeclare module 'faker/lib/locales/tr/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/tr/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/name/name'>;\n}\ndeclare module 'faker/lib/locales/tr/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/tr/phone_number/area_code.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/phone_number/area_code'>;\n}\ndeclare module 'faker/lib/locales/tr/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/tr/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/tr/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/uk/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/uk/address/city_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/city_name'>;\n}\ndeclare module 'faker/lib/locales/uk/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/uk/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/uk/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/city'>;\n}\ndeclare module 'faker/lib/locales/uk/address/country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/country'>;\n}\ndeclare module 'faker/lib/locales/uk/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/uk/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/index'>;\n}\ndeclare module 'faker/lib/locales/uk/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/uk/address/secondary_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/secondary_address'>;\n}\ndeclare module 'faker/lib/locales/uk/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/state'>;\n}\ndeclare module 'faker/lib/locales/uk/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/uk/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/uk/address/street_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/street_prefix'>;\n}\ndeclare module 'faker/lib/locales/uk/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/uk/address/street_title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/address/street_title'>;\n}\ndeclare module 'faker/lib/locales/uk/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/company/index'>;\n}\ndeclare module 'faker/lib/locales/uk/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/company/name'>;\n}\ndeclare module 'faker/lib/locales/uk/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/uk/company/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/company/suffix'>;\n}\ndeclare module 'faker/lib/locales/uk/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/index'>;\n}\ndeclare module 'faker/lib/locales/uk/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/uk/internet/free_email.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/internet/free_email'>;\n}\ndeclare module 'faker/lib/locales/uk/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/internet/index'>;\n}\ndeclare module 'faker/lib/locales/uk/name/female_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/female_first_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/female_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/female_last_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/female_middle_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/female_middle_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/index'>;\n}\ndeclare module 'faker/lib/locales/uk/name/male_first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/male_first_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/male_last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/male_last_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/male_middle_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/male_middle_name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/name'>;\n}\ndeclare module 'faker/lib/locales/uk/name/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/prefix'>;\n}\ndeclare module 'faker/lib/locales/uk/name/suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/suffix'>;\n}\ndeclare module 'faker/lib/locales/uk/name/title.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/name/title'>;\n}\ndeclare module 'faker/lib/locales/uk/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/uk/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/uk/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/vi/address/city_root.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/address/city_root'>;\n}\ndeclare module 'faker/lib/locales/vi/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/address/city'>;\n}\ndeclare module 'faker/lib/locales/vi/address/county.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/address/county'>;\n}\ndeclare module 'faker/lib/locales/vi/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/vi/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/address/index'>;\n}\ndeclare module 'faker/lib/locales/vi/cell_phone/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/cell_phone/formats'>;\n}\ndeclare module 'faker/lib/locales/vi/cell_phone/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/cell_phone/index'>;\n}\ndeclare module 'faker/lib/locales/vi/company/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/company/index'>;\n}\ndeclare module 'faker/lib/locales/vi/company/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/company/name'>;\n}\ndeclare module 'faker/lib/locales/vi/company/prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/company/prefix'>;\n}\ndeclare module 'faker/lib/locales/vi/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/index'>;\n}\ndeclare module 'faker/lib/locales/vi/internet/domain_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/internet/domain_suffix'>;\n}\ndeclare module 'faker/lib/locales/vi/internet/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/internet/index'>;\n}\ndeclare module 'faker/lib/locales/vi/lorem/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/lorem/index'>;\n}\ndeclare module 'faker/lib/locales/vi/lorem/words.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/lorem/words'>;\n}\ndeclare module 'faker/lib/locales/vi/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/vi/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/name/index'>;\n}\ndeclare module 'faker/lib/locales/vi/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/vi/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/name/name'>;\n}\ndeclare module 'faker/lib/locales/vi/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/vi/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/vi/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/city'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/index'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/state'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/index'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/name/index'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/name/name'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/zh_CN/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_CN/phone_number/index'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/building_number.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/building_number'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/city_prefix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/city_prefix'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/city_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/city_suffix'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/city.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/city'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/default_country.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/default_country'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/index'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/postcode.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/postcode'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/state_abbr.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/state_abbr'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/state.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/state'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/street_address.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/street_address'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/street_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/street_name'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/address/street_suffix.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/address/street_suffix'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/index'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/name/first_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/name/first_name'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/name/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/name/index'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/name/last_name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/name/last_name'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/name/name.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/name/name'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/phone_number/formats.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/phone_number/formats'>;\n}\ndeclare module 'faker/lib/locales/zh_TW/phone_number/index.js' {\n  declare module.exports: $Exports<'faker/lib/locales/zh_TW/phone_number/index'>;\n}\ndeclare module 'faker/lib/lorem.js' {\n  declare module.exports: $Exports<'faker/lib/lorem'>;\n}\ndeclare module 'faker/lib/name.js' {\n  declare module.exports: $Exports<'faker/lib/name'>;\n}\ndeclare module 'faker/lib/phone_number.js' {\n  declare module.exports: $Exports<'faker/lib/phone_number'>;\n}\ndeclare module 'faker/lib/random.js' {\n  declare module.exports: $Exports<'faker/lib/random'>;\n}\ndeclare module 'faker/lib/system.js' {\n  declare module.exports: $Exports<'faker/lib/system'>;\n}\ndeclare module 'faker/locale/az.js' {\n  declare module.exports: $Exports<'faker/locale/az'>;\n}\ndeclare module 'faker/locale/cz.js' {\n  declare module.exports: $Exports<'faker/locale/cz'>;\n}\ndeclare module 'faker/locale/de_AT.js' {\n  declare module.exports: $Exports<'faker/locale/de_AT'>;\n}\ndeclare module 'faker/locale/de_CH.js' {\n  declare module.exports: $Exports<'faker/locale/de_CH'>;\n}\ndeclare module 'faker/locale/de.js' {\n  declare module.exports: $Exports<'faker/locale/de'>;\n}\ndeclare module 'faker/locale/en_au_ocker.js' {\n  declare module.exports: $Exports<'faker/locale/en_au_ocker'>;\n}\ndeclare module 'faker/locale/en_AU.js' {\n  declare module.exports: $Exports<'faker/locale/en_AU'>;\n}\ndeclare module 'faker/locale/en_BORK.js' {\n  declare module.exports: $Exports<'faker/locale/en_BORK'>;\n}\ndeclare module 'faker/locale/en_CA.js' {\n  declare module.exports: $Exports<'faker/locale/en_CA'>;\n}\ndeclare module 'faker/locale/en_GB.js' {\n  declare module.exports: $Exports<'faker/locale/en_GB'>;\n}\ndeclare module 'faker/locale/en_IE.js' {\n  declare module.exports: $Exports<'faker/locale/en_IE'>;\n}\ndeclare module 'faker/locale/en_IND.js' {\n  declare module.exports: $Exports<'faker/locale/en_IND'>;\n}\ndeclare module 'faker/locale/en_US.js' {\n  declare module.exports: $Exports<'faker/locale/en_US'>;\n}\ndeclare module 'faker/locale/en.js' {\n  declare module.exports: $Exports<'faker/locale/en'>;\n}\ndeclare module 'faker/locale/es_MX.js' {\n  declare module.exports: $Exports<'faker/locale/es_MX'>;\n}\ndeclare module 'faker/locale/es.js' {\n  declare module.exports: $Exports<'faker/locale/es'>;\n}\ndeclare module 'faker/locale/fa.js' {\n  declare module.exports: $Exports<'faker/locale/fa'>;\n}\ndeclare module 'faker/locale/fr_CA.js' {\n  declare module.exports: $Exports<'faker/locale/fr_CA'>;\n}\ndeclare module 'faker/locale/fr.js' {\n  declare module.exports: $Exports<'faker/locale/fr'>;\n}\ndeclare module 'faker/locale/ge.js' {\n  declare module.exports: $Exports<'faker/locale/ge'>;\n}\ndeclare module 'faker/locale/id_ID.js' {\n  declare module.exports: $Exports<'faker/locale/id_ID'>;\n}\ndeclare module 'faker/locale/it.js' {\n  declare module.exports: $Exports<'faker/locale/it'>;\n}\ndeclare module 'faker/locale/ja.js' {\n  declare module.exports: $Exports<'faker/locale/ja'>;\n}\ndeclare module 'faker/locale/ko.js' {\n  declare module.exports: $Exports<'faker/locale/ko'>;\n}\ndeclare module 'faker/locale/nb_NO.js' {\n  declare module.exports: $Exports<'faker/locale/nb_NO'>;\n}\ndeclare module 'faker/locale/nep.js' {\n  declare module.exports: $Exports<'faker/locale/nep'>;\n}\ndeclare module 'faker/locale/nl.js' {\n  declare module.exports: $Exports<'faker/locale/nl'>;\n}\ndeclare module 'faker/locale/pl.js' {\n  declare module.exports: $Exports<'faker/locale/pl'>;\n}\ndeclare module 'faker/locale/pt_BR.js' {\n  declare module.exports: $Exports<'faker/locale/pt_BR'>;\n}\ndeclare module 'faker/locale/ru.js' {\n  declare module.exports: $Exports<'faker/locale/ru'>;\n}\ndeclare module 'faker/locale/sk.js' {\n  declare module.exports: $Exports<'faker/locale/sk'>;\n}\ndeclare module 'faker/locale/sv.js' {\n  declare module.exports: $Exports<'faker/locale/sv'>;\n}\ndeclare module 'faker/locale/tr.js' {\n  declare module.exports: $Exports<'faker/locale/tr'>;\n}\ndeclare module 'faker/locale/uk.js' {\n  declare module.exports: $Exports<'faker/locale/uk'>;\n}\ndeclare module 'faker/locale/vi.js' {\n  declare module.exports: $Exports<'faker/locale/vi'>;\n}\ndeclare module 'faker/locale/zh_CN.js' {\n  declare module.exports: $Exports<'faker/locale/zh_CN'>;\n}\ndeclare module 'faker/locale/zh_TW.js' {\n  declare module.exports: $Exports<'faker/locale/zh_TW'>;\n}\ndeclare module 'faker/package.js' {\n  declare module.exports: $Exports<'faker/package'>;\n}\ndeclare module 'faker/vendor/mersenne.js' {\n  declare module.exports: $Exports<'faker/vendor/mersenne'>;\n}\ndeclare module 'faker/vendor/user-agent.js' {\n  declare module.exports: $Exports<'faker/vendor/user-agent'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/find-with-regex_vx.x.x.js",
    "content": "// flow-typed signature: ea9375fa3f0b4460bb925b8d38939da9\n// flow-typed version: <<STUB>>/find-with-regex_v^1.0.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'find-with-regex'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'find-with-regex' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'find-with-regex/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'find-with-regex/lib/index.js' {\n  declare module.exports: $Exports<'find-with-regex/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/flow-bin_v0.x.x.js",
    "content": "// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583\n// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x\n\ndeclare module 'flow-bin' {\n  declare module.exports: string;\n}\n"
  },
  {
    "path": "flow-typed/npm/flow-typed_vx.x.x.js",
    "content": "// flow-typed signature: 877ccd9f736270ac4812cb3a5319a621\n// flow-typed version: <<STUB>>/flow-typed_v^2.1.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'flow-typed'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'flow-typed' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'flow-typed/dist/cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/create-stub' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/install' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/runTests' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/search' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/update-cache' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/update' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/validateDefs' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/commands/version' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/cacheRepoUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/codeSign' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/fileUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/flowProjectUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/flowVersion' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/git' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/github' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/isInFlowTypedRepo' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/libDefs' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/npm/npmLibDefs' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/npm/npmProjectUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/semver' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/stubUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'flow-typed/dist/lib/validationErrors' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'flow-typed/dist/cli.js' {\n  declare module.exports: $Exports<'flow-typed/dist/cli'>;\n}\ndeclare module 'flow-typed/dist/commands/create-stub.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/create-stub'>;\n}\ndeclare module 'flow-typed/dist/commands/install.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/install'>;\n}\ndeclare module 'flow-typed/dist/commands/runTests.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/runTests'>;\n}\ndeclare module 'flow-typed/dist/commands/search.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/search'>;\n}\ndeclare module 'flow-typed/dist/commands/update-cache.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/update-cache'>;\n}\ndeclare module 'flow-typed/dist/commands/update.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/update'>;\n}\ndeclare module 'flow-typed/dist/commands/validateDefs.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/validateDefs'>;\n}\ndeclare module 'flow-typed/dist/commands/version.js' {\n  declare module.exports: $Exports<'flow-typed/dist/commands/version'>;\n}\ndeclare module 'flow-typed/dist/lib/cacheRepoUtils.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/cacheRepoUtils'>;\n}\ndeclare module 'flow-typed/dist/lib/codeSign.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/codeSign'>;\n}\ndeclare module 'flow-typed/dist/lib/fileUtils.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/fileUtils'>;\n}\ndeclare module 'flow-typed/dist/lib/flowProjectUtils.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/flowProjectUtils'>;\n}\ndeclare module 'flow-typed/dist/lib/flowVersion.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/flowVersion'>;\n}\ndeclare module 'flow-typed/dist/lib/git.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/git'>;\n}\ndeclare module 'flow-typed/dist/lib/github.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/github'>;\n}\ndeclare module 'flow-typed/dist/lib/isInFlowTypedRepo.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/isInFlowTypedRepo'>;\n}\ndeclare module 'flow-typed/dist/lib/libDefs.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/libDefs'>;\n}\ndeclare module 'flow-typed/dist/lib/node.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/node'>;\n}\ndeclare module 'flow-typed/dist/lib/npm/npmLibDefs.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmLibDefs'>;\n}\ndeclare module 'flow-typed/dist/lib/npm/npmProjectUtils.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmProjectUtils'>;\n}\ndeclare module 'flow-typed/dist/lib/semver.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/semver'>;\n}\ndeclare module 'flow-typed/dist/lib/stubUtils.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/stubUtils'>;\n}\ndeclare module 'flow-typed/dist/lib/validationErrors.js' {\n  declare module.exports: $Exports<'flow-typed/dist/lib/validationErrors'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-cost-analysis_vx.x.x.js",
    "content": "// flow-typed signature: 6f34cd04ffc6c219f3ffa1bbc8b006a0\n// flow-typed version: <<STUB>>/graphql-cost-analysis_v0.1.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-cost-analysis'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-cost-analysis' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-cost-analysis/dist/costAnalysis' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-cost-analysis/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-cost-analysis/dist/costAnalysis.js' {\n  declare module.exports: $Exports<'graphql-cost-analysis/dist/costAnalysis'>;\n}\ndeclare module 'graphql-cost-analysis/dist/index.js' {\n  declare module.exports: $Exports<'graphql-cost-analysis/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-date_vx.x.x.js",
    "content": "// flow-typed signature: 1c72c3b4cfd91eb48e0ad98292d2747f\n// flow-typed version: <<STUB>>/graphql-date_v^1.0.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-date'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-date' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-date/test/graphql-date.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-date/test/legacy.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-date/index' {\n  declare module.exports: $Exports<'graphql-date'>;\n}\ndeclare module 'graphql-date/index.js' {\n  declare module.exports: $Exports<'graphql-date'>;\n}\ndeclare module 'graphql-date/test/graphql-date.test.js' {\n  declare module.exports: $Exports<'graphql-date/test/graphql-date.test'>;\n}\ndeclare module 'graphql-date/test/legacy.test.js' {\n  declare module.exports: $Exports<'graphql-date/test/legacy.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-depth-limit_vx.x.x.js",
    "content": "// flow-typed signature: 5c212600a16cd77c524a6fdb88265c97\n// flow-typed version: <<STUB>>/graphql-depth-limit_v1.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-depth-limit'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-depth-limit' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'graphql-depth-limit/index' {\n  declare module.exports: $Exports<'graphql-depth-limit'>;\n}\ndeclare module 'graphql-depth-limit/index.js' {\n  declare module.exports: $Exports<'graphql-depth-limit'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-log_vx.x.x.js",
    "content": "// flow-typed signature: 7900a943a169970aa21d013eacbd331d\n// flow-typed version: <<STUB>>/graphql-log_v0.1.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-log'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-log' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-log/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-polyfill_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-env_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-es2015_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-stage-2_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/deep-for-each_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/eslint-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/husky_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/is-function_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/prettier_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/flow-typed/npm/rimraf_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-log/src/test/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-log/dist/index.js' {\n  declare module.exports: $Exports<'graphql-log/dist/index'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-polyfill_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-polyfill_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-env_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-preset-env_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-es2015_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-preset-es2015_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-preset-flow_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/babel-preset-stage-2_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/babel-preset-stage-2_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/deep-for-each_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/deep-for-each_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/eslint-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/eslint-plugin-babel_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/husky_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/husky_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/is-function_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/is-function_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/prettier_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/prettier_vx.x.x'>;\n}\ndeclare module 'graphql-log/flow-typed/npm/rimraf_vx.x.x.js' {\n  declare module.exports: $Exports<'graphql-log/flow-typed/npm/rimraf_vx.x.x'>;\n}\ndeclare module 'graphql-log/src/index.js' {\n  declare module.exports: $Exports<'graphql-log/src/index'>;\n}\ndeclare module 'graphql-log/src/test/index.test.js' {\n  declare module.exports: $Exports<'graphql-log/src/test/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-redis-subscriptions_vx.x.x.js",
    "content": "// flow-typed signature: fd16369878a28a2d09c30a654556daaa\n// flow-typed version: <<STUB>>/graphql-redis-subscriptions_v^1.3.1/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-redis-subscriptions'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-redis-subscriptions' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-redis-subscriptions/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/pubsub-async-iterator' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/redis-pubsub' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/test/benchmark' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/test/integration-tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/test/tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-redis-subscriptions/dist/with-filter' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-redis-subscriptions/dist/index.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/index'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/pubsub-async-iterator.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/pubsub-async-iterator'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/redis-pubsub.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/redis-pubsub'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/test/benchmark.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/test/benchmark'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/test/integration-tests.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/test/integration-tests'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/test/tests.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/test/tests'>;\n}\ndeclare module 'graphql-redis-subscriptions/dist/with-filter.js' {\n  declare module.exports: $Exports<'graphql-redis-subscriptions/dist/with-filter'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-server-express_vx.x.x.js",
    "content": "// flow-typed signature: 4966d6a53f25b78ad61e1baabada4370\n// flow-typed version: <<STUB>>/graphql-server-express_v1.3.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-server-express'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-server-express' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-server-express/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-server-express/dist/index.js' {\n  declare module.exports: $Exports<'graphql-server-express/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-subscriptions_vx.x.x.js",
    "content": "// flow-typed signature: 0e96f5c40170f0a767935cd15c8cb65b\n// flow-typed version: <<STUB>>/graphql-subscriptions_v0.5.6/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-subscriptions'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-subscriptions' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-subscriptions/dist/event-emitter-to-async-iterator' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/pubsub-engine' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/pubsub' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/subscriptions-manager' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/validation' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-subscriptions/dist/with-filter' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-subscriptions/dist/event-emitter-to-async-iterator.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/event-emitter-to-async-iterator'>;\n}\ndeclare module 'graphql-subscriptions/dist/index.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/index'>;\n}\ndeclare module 'graphql-subscriptions/dist/pubsub-engine.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/pubsub-engine'>;\n}\ndeclare module 'graphql-subscriptions/dist/pubsub.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/pubsub'>;\n}\ndeclare module 'graphql-subscriptions/dist/subscriptions-manager.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/subscriptions-manager'>;\n}\ndeclare module 'graphql-subscriptions/dist/validation.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/validation'>;\n}\ndeclare module 'graphql-subscriptions/dist/with-filter.js' {\n  declare module.exports: $Exports<'graphql-subscriptions/dist/with-filter'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-tag_vx.x.x.js",
    "content": "// flow-typed signature: 0a3303fe3521a89f0794428c58ea2147\n// flow-typed version: <<STUB>>/graphql-tag_v2.6.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-tag'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-tag' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-tag/lib/graphql-tag.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tag/loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tag/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-tag/lib/graphql-tag.umd.js' {\n  declare module.exports: $Exports<'graphql-tag/lib/graphql-tag.umd'>;\n}\ndeclare module 'graphql-tag/loader.js' {\n  declare module.exports: $Exports<'graphql-tag/loader'>;\n}\ndeclare module 'graphql-tag/src/index.js' {\n  declare module.exports: $Exports<'graphql-tag/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql-tools_vx.x.x.js",
    "content": "// flow-typed signature: e8f91a42baf321253f225b362b1b3d06\n// flow-typed version: <<STUB>>/graphql-tools_v1.2.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql-tools'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql-tools' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql-tools/dist/autopublish' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tools/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tools/dist/Interfaces' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tools/dist/Logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tools/dist/mock' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql-tools/dist/schemaGenerator' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql-tools/dist/autopublish.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/autopublish'>;\n}\ndeclare module 'graphql-tools/dist/index.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/index'>;\n}\ndeclare module 'graphql-tools/dist/Interfaces.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/Interfaces'>;\n}\ndeclare module 'graphql-tools/dist/Logger.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/Logger'>;\n}\ndeclare module 'graphql-tools/dist/mock.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/mock'>;\n}\ndeclare module 'graphql-tools/dist/schemaGenerator.js' {\n  declare module.exports: $Exports<'graphql-tools/dist/schemaGenerator'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/graphql_vx.x.x.js",
    "content": "// flow-typed signature: 6a9a54e28cf27a72dac12624b4202f2d\n// flow-typed version: <<STUB>>/graphql_v0.10.5/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'graphql'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'graphql' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'graphql/error/formatError' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/error/GraphQLError' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/error/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/error/locatedError' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/error/syntaxError' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/execution/execute' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/execution/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/execution/values' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/graphql' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/dedent' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/find' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/invariant' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/isInvalid' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/isNullish' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/keyMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/keyValMap' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/quotedOrList' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/jsutils/suggestionList' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/ast' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/kinds' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/lexer' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/location' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/printer' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/source' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/language/visitor' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/subscription/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/subscription/mapAsyncIterator' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/subscription/subscribe' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/definition' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/directives' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/introspection' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/scalars' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/type/schema' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/assertValidName' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/astFromValue' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/buildASTSchema' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/buildClientSchema' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/concatAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/extendSchema' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/findBreakingChanges' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/findDeprecatedUsages' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/getOperationAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/introspectionQuery' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/isValidJSValue' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/isValidLiteralValue' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/schemaPrinter' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/separateOperations' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/typeComparators' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/typeFromAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/TypeInfo' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/utilities/valueFromAST' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/ArgumentsOfCorrectType' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/DefaultValuesOfCorrectType' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/FieldsOnCorrectType' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/FragmentsOnCompositeTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/KnownArgumentNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/KnownDirectives' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/KnownFragmentNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/KnownTypeNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/LoneAnonymousOperation' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/NoFragmentCycles' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/NoUndefinedVariables' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/NoUnusedFragments' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/NoUnusedVariables' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/OverlappingFieldsCanBeMerged' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/PossibleFragmentSpreads' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/ProvidedNonNullArguments' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/ScalarLeafs' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/SingleFieldSubscriptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueArgumentNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueDirectivesPerLocation' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueFragmentNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueInputFieldNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueOperationNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/UniqueVariableNames' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/VariablesAreInputTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/rules/VariablesInAllowedPosition' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/specifiedRules' {\n  declare module.exports: any;\n}\n\ndeclare module 'graphql/validation/validate' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'graphql/error/formatError.js' {\n  declare module.exports: $Exports<'graphql/error/formatError'>;\n}\ndeclare module 'graphql/error/GraphQLError.js' {\n  declare module.exports: $Exports<'graphql/error/GraphQLError'>;\n}\ndeclare module 'graphql/error/index.js' {\n  declare module.exports: $Exports<'graphql/error/index'>;\n}\ndeclare module 'graphql/error/locatedError.js' {\n  declare module.exports: $Exports<'graphql/error/locatedError'>;\n}\ndeclare module 'graphql/error/syntaxError.js' {\n  declare module.exports: $Exports<'graphql/error/syntaxError'>;\n}\ndeclare module 'graphql/execution/execute.js' {\n  declare module.exports: $Exports<'graphql/execution/execute'>;\n}\ndeclare module 'graphql/execution/index.js' {\n  declare module.exports: $Exports<'graphql/execution/index'>;\n}\ndeclare module 'graphql/execution/values.js' {\n  declare module.exports: $Exports<'graphql/execution/values'>;\n}\ndeclare module 'graphql/graphql.js' {\n  declare module.exports: $Exports<'graphql/graphql'>;\n}\ndeclare module 'graphql/index' {\n  declare module.exports: $Exports<'graphql'>;\n}\ndeclare module 'graphql/index.js' {\n  declare module.exports: $Exports<'graphql'>;\n}\ndeclare module 'graphql/jsutils/dedent.js' {\n  declare module.exports: $Exports<'graphql/jsutils/dedent'>;\n}\ndeclare module 'graphql/jsutils/find.js' {\n  declare module.exports: $Exports<'graphql/jsutils/find'>;\n}\ndeclare module 'graphql/jsutils/invariant.js' {\n  declare module.exports: $Exports<'graphql/jsutils/invariant'>;\n}\ndeclare module 'graphql/jsutils/isInvalid.js' {\n  declare module.exports: $Exports<'graphql/jsutils/isInvalid'>;\n}\ndeclare module 'graphql/jsutils/isNullish.js' {\n  declare module.exports: $Exports<'graphql/jsutils/isNullish'>;\n}\ndeclare module 'graphql/jsutils/keyMap.js' {\n  declare module.exports: $Exports<'graphql/jsutils/keyMap'>;\n}\ndeclare module 'graphql/jsutils/keyValMap.js' {\n  declare module.exports: $Exports<'graphql/jsutils/keyValMap'>;\n}\ndeclare module 'graphql/jsutils/quotedOrList.js' {\n  declare module.exports: $Exports<'graphql/jsutils/quotedOrList'>;\n}\ndeclare module 'graphql/jsutils/suggestionList.js' {\n  declare module.exports: $Exports<'graphql/jsutils/suggestionList'>;\n}\ndeclare module 'graphql/language/ast.js' {\n  declare module.exports: $Exports<'graphql/language/ast'>;\n}\ndeclare module 'graphql/language/index.js' {\n  declare module.exports: $Exports<'graphql/language/index'>;\n}\ndeclare module 'graphql/language/kinds.js' {\n  declare module.exports: $Exports<'graphql/language/kinds'>;\n}\ndeclare module 'graphql/language/lexer.js' {\n  declare module.exports: $Exports<'graphql/language/lexer'>;\n}\ndeclare module 'graphql/language/location.js' {\n  declare module.exports: $Exports<'graphql/language/location'>;\n}\ndeclare module 'graphql/language/parser.js' {\n  declare module.exports: $Exports<'graphql/language/parser'>;\n}\ndeclare module 'graphql/language/printer.js' {\n  declare module.exports: $Exports<'graphql/language/printer'>;\n}\ndeclare module 'graphql/language/source.js' {\n  declare module.exports: $Exports<'graphql/language/source'>;\n}\ndeclare module 'graphql/language/visitor.js' {\n  declare module.exports: $Exports<'graphql/language/visitor'>;\n}\ndeclare module 'graphql/subscription/index.js' {\n  declare module.exports: $Exports<'graphql/subscription/index'>;\n}\ndeclare module 'graphql/subscription/mapAsyncIterator.js' {\n  declare module.exports: $Exports<'graphql/subscription/mapAsyncIterator'>;\n}\ndeclare module 'graphql/subscription/subscribe.js' {\n  declare module.exports: $Exports<'graphql/subscription/subscribe'>;\n}\ndeclare module 'graphql/type/definition.js' {\n  declare module.exports: $Exports<'graphql/type/definition'>;\n}\ndeclare module 'graphql/type/directives.js' {\n  declare module.exports: $Exports<'graphql/type/directives'>;\n}\ndeclare module 'graphql/type/index.js' {\n  declare module.exports: $Exports<'graphql/type/index'>;\n}\ndeclare module 'graphql/type/introspection.js' {\n  declare module.exports: $Exports<'graphql/type/introspection'>;\n}\ndeclare module 'graphql/type/scalars.js' {\n  declare module.exports: $Exports<'graphql/type/scalars'>;\n}\ndeclare module 'graphql/type/schema.js' {\n  declare module.exports: $Exports<'graphql/type/schema'>;\n}\ndeclare module 'graphql/utilities/assertValidName.js' {\n  declare module.exports: $Exports<'graphql/utilities/assertValidName'>;\n}\ndeclare module 'graphql/utilities/astFromValue.js' {\n  declare module.exports: $Exports<'graphql/utilities/astFromValue'>;\n}\ndeclare module 'graphql/utilities/buildASTSchema.js' {\n  declare module.exports: $Exports<'graphql/utilities/buildASTSchema'>;\n}\ndeclare module 'graphql/utilities/buildClientSchema.js' {\n  declare module.exports: $Exports<'graphql/utilities/buildClientSchema'>;\n}\ndeclare module 'graphql/utilities/concatAST.js' {\n  declare module.exports: $Exports<'graphql/utilities/concatAST'>;\n}\ndeclare module 'graphql/utilities/extendSchema.js' {\n  declare module.exports: $Exports<'graphql/utilities/extendSchema'>;\n}\ndeclare module 'graphql/utilities/findBreakingChanges.js' {\n  declare module.exports: $Exports<'graphql/utilities/findBreakingChanges'>;\n}\ndeclare module 'graphql/utilities/findDeprecatedUsages.js' {\n  declare module.exports: $Exports<'graphql/utilities/findDeprecatedUsages'>;\n}\ndeclare module 'graphql/utilities/getOperationAST.js' {\n  declare module.exports: $Exports<'graphql/utilities/getOperationAST'>;\n}\ndeclare module 'graphql/utilities/index.js' {\n  declare module.exports: $Exports<'graphql/utilities/index'>;\n}\ndeclare module 'graphql/utilities/introspectionQuery.js' {\n  declare module.exports: $Exports<'graphql/utilities/introspectionQuery'>;\n}\ndeclare module 'graphql/utilities/isValidJSValue.js' {\n  declare module.exports: $Exports<'graphql/utilities/isValidJSValue'>;\n}\ndeclare module 'graphql/utilities/isValidLiteralValue.js' {\n  declare module.exports: $Exports<'graphql/utilities/isValidLiteralValue'>;\n}\ndeclare module 'graphql/utilities/schemaPrinter.js' {\n  declare module.exports: $Exports<'graphql/utilities/schemaPrinter'>;\n}\ndeclare module 'graphql/utilities/separateOperations.js' {\n  declare module.exports: $Exports<'graphql/utilities/separateOperations'>;\n}\ndeclare module 'graphql/utilities/typeComparators.js' {\n  declare module.exports: $Exports<'graphql/utilities/typeComparators'>;\n}\ndeclare module 'graphql/utilities/typeFromAST.js' {\n  declare module.exports: $Exports<'graphql/utilities/typeFromAST'>;\n}\ndeclare module 'graphql/utilities/TypeInfo.js' {\n  declare module.exports: $Exports<'graphql/utilities/TypeInfo'>;\n}\ndeclare module 'graphql/utilities/valueFromAST.js' {\n  declare module.exports: $Exports<'graphql/utilities/valueFromAST'>;\n}\ndeclare module 'graphql/validation/index.js' {\n  declare module.exports: $Exports<'graphql/validation/index'>;\n}\ndeclare module 'graphql/validation/rules/ArgumentsOfCorrectType.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/ArgumentsOfCorrectType'>;\n}\ndeclare module 'graphql/validation/rules/DefaultValuesOfCorrectType.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/DefaultValuesOfCorrectType'>;\n}\ndeclare module 'graphql/validation/rules/FieldsOnCorrectType.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/FieldsOnCorrectType'>;\n}\ndeclare module 'graphql/validation/rules/FragmentsOnCompositeTypes.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/FragmentsOnCompositeTypes'>;\n}\ndeclare module 'graphql/validation/rules/KnownArgumentNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/KnownArgumentNames'>;\n}\ndeclare module 'graphql/validation/rules/KnownDirectives.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/KnownDirectives'>;\n}\ndeclare module 'graphql/validation/rules/KnownFragmentNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/KnownFragmentNames'>;\n}\ndeclare module 'graphql/validation/rules/KnownTypeNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/KnownTypeNames'>;\n}\ndeclare module 'graphql/validation/rules/LoneAnonymousOperation.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/LoneAnonymousOperation'>;\n}\ndeclare module 'graphql/validation/rules/NoFragmentCycles.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/NoFragmentCycles'>;\n}\ndeclare module 'graphql/validation/rules/NoUndefinedVariables.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/NoUndefinedVariables'>;\n}\ndeclare module 'graphql/validation/rules/NoUnusedFragments.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/NoUnusedFragments'>;\n}\ndeclare module 'graphql/validation/rules/NoUnusedVariables.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/NoUnusedVariables'>;\n}\ndeclare module 'graphql/validation/rules/OverlappingFieldsCanBeMerged.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/OverlappingFieldsCanBeMerged'>;\n}\ndeclare module 'graphql/validation/rules/PossibleFragmentSpreads.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/PossibleFragmentSpreads'>;\n}\ndeclare module 'graphql/validation/rules/ProvidedNonNullArguments.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/ProvidedNonNullArguments'>;\n}\ndeclare module 'graphql/validation/rules/ScalarLeafs.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/ScalarLeafs'>;\n}\ndeclare module 'graphql/validation/rules/SingleFieldSubscriptions.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/SingleFieldSubscriptions'>;\n}\ndeclare module 'graphql/validation/rules/UniqueArgumentNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueArgumentNames'>;\n}\ndeclare module 'graphql/validation/rules/UniqueDirectivesPerLocation.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueDirectivesPerLocation'>;\n}\ndeclare module 'graphql/validation/rules/UniqueFragmentNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueFragmentNames'>;\n}\ndeclare module 'graphql/validation/rules/UniqueInputFieldNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueInputFieldNames'>;\n}\ndeclare module 'graphql/validation/rules/UniqueOperationNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueOperationNames'>;\n}\ndeclare module 'graphql/validation/rules/UniqueVariableNames.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/UniqueVariableNames'>;\n}\ndeclare module 'graphql/validation/rules/VariablesAreInputTypes.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/VariablesAreInputTypes'>;\n}\ndeclare module 'graphql/validation/rules/VariablesInAllowedPosition.js' {\n  declare module.exports: $Exports<'graphql/validation/rules/VariablesInAllowedPosition'>;\n}\ndeclare module 'graphql/validation/specifiedRules.js' {\n  declare module.exports: $Exports<'graphql/validation/specifiedRules'>;\n}\ndeclare module 'graphql/validation/validate.js' {\n  declare module.exports: $Exports<'graphql/validation/validate'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/helmet_vx.x.x.js",
    "content": "// flow-typed signature: 19d40d2c859c3e988d6ee67e3677f306\n// flow-typed version: <<STUB>>/helmet_v3.14.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'helmet'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'helmet' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'helmet/index' {\n  declare module.exports: $Exports<'helmet'>;\n}\ndeclare module 'helmet/index.js' {\n  declare module.exports: $Exports<'helmet'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/highlight.js_vx.x.x.js",
    "content": "// flow-typed signature: 36c532a87674cc47f69d6017b230bd24\n// flow-typed version: <<STUB>>/highlight.js_v^9.10.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'highlight.js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'highlight.js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'highlight.js/lib/highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/1c' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/abnf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/accesslog' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/actionscript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ada' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/apache' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/applescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/arduino' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/armasm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/asciidoc' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/aspectj' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/autohotkey' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/autoit' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/avrasm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/awk' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/axapta' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/bash' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/basic' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/bnf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/brainfuck' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/cal' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/capnproto' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ceylon' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/clean' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/clojure-repl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/clojure' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/cmake' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/coffeescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/coq' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/cos' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/cpp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/crmsh' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/crystal' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/cs' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/csp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/css' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/d' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dart' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/delphi' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/diff' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/django' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dns' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dockerfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dos' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dsconfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dts' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/dust' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ebnf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/elixir' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/elm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/erb' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/erlang-repl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/erlang' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/excel' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/fix' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/flix' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/fortran' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/fsharp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/gams' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/gauss' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/gcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/gherkin' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/glsl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/go' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/golo' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/gradle' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/groovy' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/haml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/handlebars' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/haskell' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/haxe' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/hsp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/htmlbars' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/hy' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/inform7' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ini' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/irpf90' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/java' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/javascript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/jboss-cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/json' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/julia-repl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/julia' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/kotlin' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/lasso' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ldif' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/leaf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/less' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/lisp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/livecodeserver' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/livescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/llvm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/lsl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/lua' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/makefile' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/markdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mathematica' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/matlab' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/maxima' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mel' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mercury' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mipsasm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mizar' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/mojolicious' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/monkey' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/moonscript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/n1ql' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/nginx' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/nimrod' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/nix' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/nsis' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/objectivec' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ocaml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/openscad' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/oxygene' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/parser3' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/perl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/pf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/php' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/pony' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/powershell' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/processing' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/profile' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/prolog' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/protobuf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/puppet' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/purebasic' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/python' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/q' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/qml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/r' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/rib' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/roboconf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/routeros' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/rsl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ruby' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/ruleslanguage' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/rust' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/scala' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/scheme' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/scilab' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/scss' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/shell' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/smali' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/smalltalk' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/sml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/sqf' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/sql' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/stan' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/stata' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/step21' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/stylus' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/subunit' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/swift' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/taggerscript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/tap' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/tcl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/tex' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/thrift' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/tp' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/twig' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/typescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vala' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vbnet' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vbscript-html' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vbscript' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/verilog' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vhdl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/vim' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/x86asm' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/xl' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/xml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/xquery' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/yaml' {\n  declare module.exports: any;\n}\n\ndeclare module 'highlight.js/lib/languages/zephir' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'highlight.js/lib/highlight.js' {\n  declare module.exports: $Exports<'highlight.js/lib/highlight'>;\n}\ndeclare module 'highlight.js/lib/index.js' {\n  declare module.exports: $Exports<'highlight.js/lib/index'>;\n}\ndeclare module 'highlight.js/lib/languages/1c.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/1c'>;\n}\ndeclare module 'highlight.js/lib/languages/abnf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/abnf'>;\n}\ndeclare module 'highlight.js/lib/languages/accesslog.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/accesslog'>;\n}\ndeclare module 'highlight.js/lib/languages/actionscript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/actionscript'>;\n}\ndeclare module 'highlight.js/lib/languages/ada.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ada'>;\n}\ndeclare module 'highlight.js/lib/languages/apache.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/apache'>;\n}\ndeclare module 'highlight.js/lib/languages/applescript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/applescript'>;\n}\ndeclare module 'highlight.js/lib/languages/arduino.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/arduino'>;\n}\ndeclare module 'highlight.js/lib/languages/armasm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/armasm'>;\n}\ndeclare module 'highlight.js/lib/languages/asciidoc.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/asciidoc'>;\n}\ndeclare module 'highlight.js/lib/languages/aspectj.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/aspectj'>;\n}\ndeclare module 'highlight.js/lib/languages/autohotkey.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/autohotkey'>;\n}\ndeclare module 'highlight.js/lib/languages/autoit.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/autoit'>;\n}\ndeclare module 'highlight.js/lib/languages/avrasm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/avrasm'>;\n}\ndeclare module 'highlight.js/lib/languages/awk.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/awk'>;\n}\ndeclare module 'highlight.js/lib/languages/axapta.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/axapta'>;\n}\ndeclare module 'highlight.js/lib/languages/bash.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/bash'>;\n}\ndeclare module 'highlight.js/lib/languages/basic.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/basic'>;\n}\ndeclare module 'highlight.js/lib/languages/bnf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/bnf'>;\n}\ndeclare module 'highlight.js/lib/languages/brainfuck.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/brainfuck'>;\n}\ndeclare module 'highlight.js/lib/languages/cal.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/cal'>;\n}\ndeclare module 'highlight.js/lib/languages/capnproto.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/capnproto'>;\n}\ndeclare module 'highlight.js/lib/languages/ceylon.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ceylon'>;\n}\ndeclare module 'highlight.js/lib/languages/clean.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/clean'>;\n}\ndeclare module 'highlight.js/lib/languages/clojure-repl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/clojure-repl'>;\n}\ndeclare module 'highlight.js/lib/languages/clojure.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/clojure'>;\n}\ndeclare module 'highlight.js/lib/languages/cmake.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/cmake'>;\n}\ndeclare module 'highlight.js/lib/languages/coffeescript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/coffeescript'>;\n}\ndeclare module 'highlight.js/lib/languages/coq.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/coq'>;\n}\ndeclare module 'highlight.js/lib/languages/cos.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/cos'>;\n}\ndeclare module 'highlight.js/lib/languages/cpp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/cpp'>;\n}\ndeclare module 'highlight.js/lib/languages/crmsh.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/crmsh'>;\n}\ndeclare module 'highlight.js/lib/languages/crystal.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/crystal'>;\n}\ndeclare module 'highlight.js/lib/languages/cs.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/cs'>;\n}\ndeclare module 'highlight.js/lib/languages/csp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/csp'>;\n}\ndeclare module 'highlight.js/lib/languages/css.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/css'>;\n}\ndeclare module 'highlight.js/lib/languages/d.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/d'>;\n}\ndeclare module 'highlight.js/lib/languages/dart.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dart'>;\n}\ndeclare module 'highlight.js/lib/languages/delphi.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/delphi'>;\n}\ndeclare module 'highlight.js/lib/languages/diff.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/diff'>;\n}\ndeclare module 'highlight.js/lib/languages/django.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/django'>;\n}\ndeclare module 'highlight.js/lib/languages/dns.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dns'>;\n}\ndeclare module 'highlight.js/lib/languages/dockerfile.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dockerfile'>;\n}\ndeclare module 'highlight.js/lib/languages/dos.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dos'>;\n}\ndeclare module 'highlight.js/lib/languages/dsconfig.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dsconfig'>;\n}\ndeclare module 'highlight.js/lib/languages/dts.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dts'>;\n}\ndeclare module 'highlight.js/lib/languages/dust.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/dust'>;\n}\ndeclare module 'highlight.js/lib/languages/ebnf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ebnf'>;\n}\ndeclare module 'highlight.js/lib/languages/elixir.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/elixir'>;\n}\ndeclare module 'highlight.js/lib/languages/elm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/elm'>;\n}\ndeclare module 'highlight.js/lib/languages/erb.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/erb'>;\n}\ndeclare module 'highlight.js/lib/languages/erlang-repl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/erlang-repl'>;\n}\ndeclare module 'highlight.js/lib/languages/erlang.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/erlang'>;\n}\ndeclare module 'highlight.js/lib/languages/excel.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/excel'>;\n}\ndeclare module 'highlight.js/lib/languages/fix.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/fix'>;\n}\ndeclare module 'highlight.js/lib/languages/flix.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/flix'>;\n}\ndeclare module 'highlight.js/lib/languages/fortran.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/fortran'>;\n}\ndeclare module 'highlight.js/lib/languages/fsharp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/fsharp'>;\n}\ndeclare module 'highlight.js/lib/languages/gams.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/gams'>;\n}\ndeclare module 'highlight.js/lib/languages/gauss.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/gauss'>;\n}\ndeclare module 'highlight.js/lib/languages/gcode.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/gcode'>;\n}\ndeclare module 'highlight.js/lib/languages/gherkin.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/gherkin'>;\n}\ndeclare module 'highlight.js/lib/languages/glsl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/glsl'>;\n}\ndeclare module 'highlight.js/lib/languages/go.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/go'>;\n}\ndeclare module 'highlight.js/lib/languages/golo.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/golo'>;\n}\ndeclare module 'highlight.js/lib/languages/gradle.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/gradle'>;\n}\ndeclare module 'highlight.js/lib/languages/groovy.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/groovy'>;\n}\ndeclare module 'highlight.js/lib/languages/haml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/haml'>;\n}\ndeclare module 'highlight.js/lib/languages/handlebars.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/handlebars'>;\n}\ndeclare module 'highlight.js/lib/languages/haskell.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/haskell'>;\n}\ndeclare module 'highlight.js/lib/languages/haxe.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/haxe'>;\n}\ndeclare module 'highlight.js/lib/languages/hsp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/hsp'>;\n}\ndeclare module 'highlight.js/lib/languages/htmlbars.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/htmlbars'>;\n}\ndeclare module 'highlight.js/lib/languages/http.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/http'>;\n}\ndeclare module 'highlight.js/lib/languages/hy.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/hy'>;\n}\ndeclare module 'highlight.js/lib/languages/inform7.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/inform7'>;\n}\ndeclare module 'highlight.js/lib/languages/ini.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ini'>;\n}\ndeclare module 'highlight.js/lib/languages/irpf90.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/irpf90'>;\n}\ndeclare module 'highlight.js/lib/languages/java.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/java'>;\n}\ndeclare module 'highlight.js/lib/languages/javascript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/javascript'>;\n}\ndeclare module 'highlight.js/lib/languages/jboss-cli.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/jboss-cli'>;\n}\ndeclare module 'highlight.js/lib/languages/json.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/json'>;\n}\ndeclare module 'highlight.js/lib/languages/julia-repl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/julia-repl'>;\n}\ndeclare module 'highlight.js/lib/languages/julia.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/julia'>;\n}\ndeclare module 'highlight.js/lib/languages/kotlin.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/kotlin'>;\n}\ndeclare module 'highlight.js/lib/languages/lasso.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/lasso'>;\n}\ndeclare module 'highlight.js/lib/languages/ldif.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ldif'>;\n}\ndeclare module 'highlight.js/lib/languages/leaf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/leaf'>;\n}\ndeclare module 'highlight.js/lib/languages/less.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/less'>;\n}\ndeclare module 'highlight.js/lib/languages/lisp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/lisp'>;\n}\ndeclare module 'highlight.js/lib/languages/livecodeserver.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/livecodeserver'>;\n}\ndeclare module 'highlight.js/lib/languages/livescript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/livescript'>;\n}\ndeclare module 'highlight.js/lib/languages/llvm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/llvm'>;\n}\ndeclare module 'highlight.js/lib/languages/lsl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/lsl'>;\n}\ndeclare module 'highlight.js/lib/languages/lua.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/lua'>;\n}\ndeclare module 'highlight.js/lib/languages/makefile.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/makefile'>;\n}\ndeclare module 'highlight.js/lib/languages/markdown.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/markdown'>;\n}\ndeclare module 'highlight.js/lib/languages/mathematica.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mathematica'>;\n}\ndeclare module 'highlight.js/lib/languages/matlab.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/matlab'>;\n}\ndeclare module 'highlight.js/lib/languages/maxima.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/maxima'>;\n}\ndeclare module 'highlight.js/lib/languages/mel.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mel'>;\n}\ndeclare module 'highlight.js/lib/languages/mercury.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mercury'>;\n}\ndeclare module 'highlight.js/lib/languages/mipsasm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mipsasm'>;\n}\ndeclare module 'highlight.js/lib/languages/mizar.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mizar'>;\n}\ndeclare module 'highlight.js/lib/languages/mojolicious.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/mojolicious'>;\n}\ndeclare module 'highlight.js/lib/languages/monkey.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/monkey'>;\n}\ndeclare module 'highlight.js/lib/languages/moonscript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/moonscript'>;\n}\ndeclare module 'highlight.js/lib/languages/n1ql.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/n1ql'>;\n}\ndeclare module 'highlight.js/lib/languages/nginx.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/nginx'>;\n}\ndeclare module 'highlight.js/lib/languages/nimrod.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/nimrod'>;\n}\ndeclare module 'highlight.js/lib/languages/nix.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/nix'>;\n}\ndeclare module 'highlight.js/lib/languages/nsis.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/nsis'>;\n}\ndeclare module 'highlight.js/lib/languages/objectivec.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/objectivec'>;\n}\ndeclare module 'highlight.js/lib/languages/ocaml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ocaml'>;\n}\ndeclare module 'highlight.js/lib/languages/openscad.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/openscad'>;\n}\ndeclare module 'highlight.js/lib/languages/oxygene.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/oxygene'>;\n}\ndeclare module 'highlight.js/lib/languages/parser3.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/parser3'>;\n}\ndeclare module 'highlight.js/lib/languages/perl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/perl'>;\n}\ndeclare module 'highlight.js/lib/languages/pf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/pf'>;\n}\ndeclare module 'highlight.js/lib/languages/php.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/php'>;\n}\ndeclare module 'highlight.js/lib/languages/pony.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/pony'>;\n}\ndeclare module 'highlight.js/lib/languages/powershell.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/powershell'>;\n}\ndeclare module 'highlight.js/lib/languages/processing.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/processing'>;\n}\ndeclare module 'highlight.js/lib/languages/profile.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/profile'>;\n}\ndeclare module 'highlight.js/lib/languages/prolog.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/prolog'>;\n}\ndeclare module 'highlight.js/lib/languages/protobuf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/protobuf'>;\n}\ndeclare module 'highlight.js/lib/languages/puppet.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/puppet'>;\n}\ndeclare module 'highlight.js/lib/languages/purebasic.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/purebasic'>;\n}\ndeclare module 'highlight.js/lib/languages/python.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/python'>;\n}\ndeclare module 'highlight.js/lib/languages/q.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/q'>;\n}\ndeclare module 'highlight.js/lib/languages/qml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/qml'>;\n}\ndeclare module 'highlight.js/lib/languages/r.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/r'>;\n}\ndeclare module 'highlight.js/lib/languages/rib.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/rib'>;\n}\ndeclare module 'highlight.js/lib/languages/roboconf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/roboconf'>;\n}\ndeclare module 'highlight.js/lib/languages/routeros.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/routeros'>;\n}\ndeclare module 'highlight.js/lib/languages/rsl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/rsl'>;\n}\ndeclare module 'highlight.js/lib/languages/ruby.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ruby'>;\n}\ndeclare module 'highlight.js/lib/languages/ruleslanguage.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/ruleslanguage'>;\n}\ndeclare module 'highlight.js/lib/languages/rust.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/rust'>;\n}\ndeclare module 'highlight.js/lib/languages/scala.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/scala'>;\n}\ndeclare module 'highlight.js/lib/languages/scheme.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/scheme'>;\n}\ndeclare module 'highlight.js/lib/languages/scilab.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/scilab'>;\n}\ndeclare module 'highlight.js/lib/languages/scss.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/scss'>;\n}\ndeclare module 'highlight.js/lib/languages/shell.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/shell'>;\n}\ndeclare module 'highlight.js/lib/languages/smali.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/smali'>;\n}\ndeclare module 'highlight.js/lib/languages/smalltalk.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/smalltalk'>;\n}\ndeclare module 'highlight.js/lib/languages/sml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/sml'>;\n}\ndeclare module 'highlight.js/lib/languages/sqf.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/sqf'>;\n}\ndeclare module 'highlight.js/lib/languages/sql.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/sql'>;\n}\ndeclare module 'highlight.js/lib/languages/stan.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/stan'>;\n}\ndeclare module 'highlight.js/lib/languages/stata.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/stata'>;\n}\ndeclare module 'highlight.js/lib/languages/step21.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/step21'>;\n}\ndeclare module 'highlight.js/lib/languages/stylus.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/stylus'>;\n}\ndeclare module 'highlight.js/lib/languages/subunit.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/subunit'>;\n}\ndeclare module 'highlight.js/lib/languages/swift.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/swift'>;\n}\ndeclare module 'highlight.js/lib/languages/taggerscript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/taggerscript'>;\n}\ndeclare module 'highlight.js/lib/languages/tap.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/tap'>;\n}\ndeclare module 'highlight.js/lib/languages/tcl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/tcl'>;\n}\ndeclare module 'highlight.js/lib/languages/tex.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/tex'>;\n}\ndeclare module 'highlight.js/lib/languages/thrift.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/thrift'>;\n}\ndeclare module 'highlight.js/lib/languages/tp.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/tp'>;\n}\ndeclare module 'highlight.js/lib/languages/twig.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/twig'>;\n}\ndeclare module 'highlight.js/lib/languages/typescript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/typescript'>;\n}\ndeclare module 'highlight.js/lib/languages/vala.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vala'>;\n}\ndeclare module 'highlight.js/lib/languages/vbnet.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vbnet'>;\n}\ndeclare module 'highlight.js/lib/languages/vbscript-html.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vbscript-html'>;\n}\ndeclare module 'highlight.js/lib/languages/vbscript.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vbscript'>;\n}\ndeclare module 'highlight.js/lib/languages/verilog.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/verilog'>;\n}\ndeclare module 'highlight.js/lib/languages/vhdl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vhdl'>;\n}\ndeclare module 'highlight.js/lib/languages/vim.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/vim'>;\n}\ndeclare module 'highlight.js/lib/languages/x86asm.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/x86asm'>;\n}\ndeclare module 'highlight.js/lib/languages/xl.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/xl'>;\n}\ndeclare module 'highlight.js/lib/languages/xml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/xml'>;\n}\ndeclare module 'highlight.js/lib/languages/xquery.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/xquery'>;\n}\ndeclare module 'highlight.js/lib/languages/yaml.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/yaml'>;\n}\ndeclare module 'highlight.js/lib/languages/zephir.js' {\n  declare module.exports: $Exports<'highlight.js/lib/languages/zephir'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/history_vx.x.x.js",
    "content": "// flow-typed signature: d4a044f216b4ec7ee8273ce1fb5995bb\n// flow-typed version: <<STUB>>/history_v^4.6.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'history'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'history' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'history/createBrowserHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/createHashHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/createMemoryHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/createTransitionManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/DOMUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/createBrowserHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/createHashHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/createMemoryHistory' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/createTransitionManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/DOMUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/LocationUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/es/PathUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/LocationUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/PathUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/umd/history' {\n  declare module.exports: any;\n}\n\ndeclare module 'history/umd/history.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'history/createBrowserHistory.js' {\n  declare module.exports: $Exports<'history/createBrowserHistory'>;\n}\ndeclare module 'history/createHashHistory.js' {\n  declare module.exports: $Exports<'history/createHashHistory'>;\n}\ndeclare module 'history/createMemoryHistory.js' {\n  declare module.exports: $Exports<'history/createMemoryHistory'>;\n}\ndeclare module 'history/createTransitionManager.js' {\n  declare module.exports: $Exports<'history/createTransitionManager'>;\n}\ndeclare module 'history/DOMUtils.js' {\n  declare module.exports: $Exports<'history/DOMUtils'>;\n}\ndeclare module 'history/es/createBrowserHistory.js' {\n  declare module.exports: $Exports<'history/es/createBrowserHistory'>;\n}\ndeclare module 'history/es/createHashHistory.js' {\n  declare module.exports: $Exports<'history/es/createHashHistory'>;\n}\ndeclare module 'history/es/createMemoryHistory.js' {\n  declare module.exports: $Exports<'history/es/createMemoryHistory'>;\n}\ndeclare module 'history/es/createTransitionManager.js' {\n  declare module.exports: $Exports<'history/es/createTransitionManager'>;\n}\ndeclare module 'history/es/DOMUtils.js' {\n  declare module.exports: $Exports<'history/es/DOMUtils'>;\n}\ndeclare module 'history/es/index.js' {\n  declare module.exports: $Exports<'history/es/index'>;\n}\ndeclare module 'history/es/LocationUtils.js' {\n  declare module.exports: $Exports<'history/es/LocationUtils'>;\n}\ndeclare module 'history/es/PathUtils.js' {\n  declare module.exports: $Exports<'history/es/PathUtils'>;\n}\ndeclare module 'history/index' {\n  declare module.exports: $Exports<'history'>;\n}\ndeclare module 'history/index.js' {\n  declare module.exports: $Exports<'history'>;\n}\ndeclare module 'history/LocationUtils.js' {\n  declare module.exports: $Exports<'history/LocationUtils'>;\n}\ndeclare module 'history/PathUtils.js' {\n  declare module.exports: $Exports<'history/PathUtils'>;\n}\ndeclare module 'history/umd/history.js' {\n  declare module.exports: $Exports<'history/umd/history'>;\n}\ndeclare module 'history/umd/history.min.js' {\n  declare module.exports: $Exports<'history/umd/history.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/hoist-non-react-statics_vx.x.x.js",
    "content": "// flow-typed signature: 5c4c1cf0c9d4b4c777a07f0967c78ef8\n// flow-typed version: <<STUB>>/hoist-non-react-statics_v^2.3.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'hoist-non-react-statics'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'hoist-non-react-statics' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'hoist-non-react-statics/index' {\n  declare module.exports: $Exports<'hoist-non-react-statics'>;\n}\ndeclare module 'hoist-non-react-statics/index.js' {\n  declare module.exports: $Exports<'hoist-non-react-statics'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/host-validation_vx.x.x.js",
    "content": "// flow-typed signature: fc353630324340213e1109c7c5d291c2\n// flow-typed version: <<STUB>>/host-validation_v1.1.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'host-validation'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'host-validation' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'host-validation/example' {\n  declare module.exports: any;\n}\n\ndeclare module 'host-validation/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'host-validation/example.js' {\n  declare module.exports: $Exports<'host-validation/example'>;\n}\ndeclare module 'host-validation/index' {\n  declare module.exports: $Exports<'host-validation'>;\n}\ndeclare module 'host-validation/index.js' {\n  declare module.exports: $Exports<'host-validation'>;\n}\ndeclare module 'host-validation/test.js' {\n  declare module.exports: $Exports<'host-validation/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/hot-shots_vx.x.x.js",
    "content": "// flow-typed signature: ddf4dd814629ae123ef685c9db868bef\n// flow-typed version: <<STUB>>/hot-shots_v5.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'hot-shots'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'hot-shots' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'hot-shots/lib/helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'hot-shots/lib/statsd' {\n  declare module.exports: any;\n}\n\ndeclare module 'hot-shots/lib/statsFunctions' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'hot-shots/index' {\n  declare module.exports: $Exports<'hot-shots'>;\n}\ndeclare module 'hot-shots/index.js' {\n  declare module.exports: $Exports<'hot-shots'>;\n}\ndeclare module 'hot-shots/lib/helpers.js' {\n  declare module.exports: $Exports<'hot-shots/lib/helpers'>;\n}\ndeclare module 'hot-shots/lib/statsd.js' {\n  declare module.exports: $Exports<'hot-shots/lib/statsd'>;\n}\ndeclare module 'hot-shots/lib/statsFunctions.js' {\n  declare module.exports: $Exports<'hot-shots/lib/statsFunctions'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/hpp_vx.x.x.js",
    "content": "// flow-typed signature: df2e71f248afaf87aae6d3100e3eefc6\n// flow-typed version: <<STUB>>/hpp_v0.2.2/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'hpp'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'hpp' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'hpp/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'hpp/lib/index.js' {\n  declare module.exports: $Exports<'hpp/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/hsts_vx.x.x.js",
    "content": "// flow-typed signature: 9df3b65568692b49a7bd33daa52cb704\n// flow-typed version: <<STUB>>/hsts_v2.1.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'hsts'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'hsts' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'hsts/index' {\n  declare module.exports: $Exports<'hsts'>;\n}\ndeclare module 'hsts/index.js' {\n  declare module.exports: $Exports<'hsts'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/http-proxy-middleware_vx.x.x.js",
    "content": "// flow-typed signature: 67cf2d3ff15b95f034d672d221a52ebc\n// flow-typed version: <<STUB>>/http-proxy-middleware_v1.0.4/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'http-proxy-middleware'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'http-proxy-middleware' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'http-proxy-middleware/dist/config-factory' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/context-matcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/errors' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/handlers' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/http-proxy-middleware' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/path-rewriter' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/router' {\n  declare module.exports: any;\n}\n\ndeclare module 'http-proxy-middleware/dist/types' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'http-proxy-middleware/dist/config-factory.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/config-factory'>;\n}\ndeclare module 'http-proxy-middleware/dist/context-matcher.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/context-matcher'>;\n}\ndeclare module 'http-proxy-middleware/dist/errors.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/errors'>;\n}\ndeclare module 'http-proxy-middleware/dist/handlers.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/handlers'>;\n}\ndeclare module 'http-proxy-middleware/dist/http-proxy-middleware.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/http-proxy-middleware'>;\n}\ndeclare module 'http-proxy-middleware/dist/index' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist'>;\n}\ndeclare module 'http-proxy-middleware/dist/index.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist'>;\n}\ndeclare module 'http-proxy-middleware/dist/logger.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/logger'>;\n}\ndeclare module 'http-proxy-middleware/dist/path-rewriter.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/path-rewriter'>;\n}\ndeclare module 'http-proxy-middleware/dist/router.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/router'>;\n}\ndeclare module 'http-proxy-middleware/dist/types.js' {\n  declare module.exports: $Exports<'http-proxy-middleware/dist/types'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/idx_v2.x.x.js",
    "content": "// flow-typed signature: aeb1419f64937fdd64367e23af4f80d0\n// flow-typed version: 75f67f047c/idx_v2.x.x/flow_>=v0.33.x\n\n// From: https://github.com/facebookincubator/idx/blob/master/packages/idx/src/idx.js.flow\n\ndeclare module idx {\n  declare module.exports: $Facebookism$Idx;\n}\n"
  },
  {
    "path": "flow-typed/npm/imgix-core-js_vx.x.x.js",
    "content": "// flow-typed signature: 30170b0155da4a81783cd5dac0f8d4b1\n// flow-typed version: <<STUB>>/imgix-core-js_v^1.0.6/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'imgix-core-js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'imgix-core-js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'imgix-core-js/assert_version' {\n  declare module.exports: any;\n}\n\ndeclare module 'imgix-core-js/dist/imgix-core-js' {\n  declare module.exports: any;\n}\n\ndeclare module 'imgix-core-js/dist/imgix-core-js.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'imgix-core-js/test/test-client' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'imgix-core-js/assert_version.js' {\n  declare module.exports: $Exports<'imgix-core-js/assert_version'>;\n}\ndeclare module 'imgix-core-js/dist/imgix-core-js.js' {\n  declare module.exports: $Exports<'imgix-core-js/dist/imgix-core-js'>;\n}\ndeclare module 'imgix-core-js/dist/imgix-core-js.min.js' {\n  declare module.exports: $Exports<'imgix-core-js/dist/imgix-core-js.min'>;\n}\ndeclare module 'imgix-core-js/test/test-client.js' {\n  declare module.exports: $Exports<'imgix-core-js/test/test-client'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/immutability-helper_vx.x.x.js",
    "content": "// flow-typed signature: 5bcf872a6cd3fbaad22e951b72e1e0ff\n// flow-typed version: <<STUB>>/immutability-helper_v^2.2.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'immutability-helper'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'immutability-helper' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'immutability-helper/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'immutability-helper/index' {\n  declare module.exports: $Exports<'immutability-helper'>;\n}\ndeclare module 'immutability-helper/index.js' {\n  declare module.exports: $Exports<'immutability-helper'>;\n}\ndeclare module 'immutability-helper/test.js' {\n  declare module.exports: $Exports<'immutability-helper/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/ioredis_vx.x.x.js",
    "content": "// flow-typed signature: 212434ef140f4ad1df5b2591c14eae35\n// flow-typed version: <<STUB>>/ioredis_v4.2.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'ioredis'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'ioredis' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'ioredis/built/cluster/ClusterOptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/cluster/ClusterSubscriber' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/cluster/ConnectionPool' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/cluster/DelayQueue' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/cluster/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/cluster/util' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/command' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/commander' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/AbstractConnector' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/SentinelConnector/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/SentinelConnector/SentinelIterator' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/SentinelConnector/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/connectors/StandaloneConnector' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/errors/ClusterAllFailedError' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/errors/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/errors/MaxRetriesPerRequestError' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/pipeline' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/promiseContainer' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/redis' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/redis/event_handler' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/redis/parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/ScanStream' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/script' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/SubscriptionSet' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/transaction' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/utils/debug' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'ioredis/built/utils/lodash' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'ioredis/built/cluster/ClusterOptions.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/ClusterOptions'>;\n}\ndeclare module 'ioredis/built/cluster/ClusterSubscriber.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/ClusterSubscriber'>;\n}\ndeclare module 'ioredis/built/cluster/ConnectionPool.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/ConnectionPool'>;\n}\ndeclare module 'ioredis/built/cluster/DelayQueue.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/DelayQueue'>;\n}\ndeclare module 'ioredis/built/cluster/index.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/index'>;\n}\ndeclare module 'ioredis/built/cluster/util.js' {\n  declare module.exports: $Exports<'ioredis/built/cluster/util'>;\n}\ndeclare module 'ioredis/built/command.js' {\n  declare module.exports: $Exports<'ioredis/built/command'>;\n}\ndeclare module 'ioredis/built/commander.js' {\n  declare module.exports: $Exports<'ioredis/built/commander'>;\n}\ndeclare module 'ioredis/built/connectors/AbstractConnector.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/AbstractConnector'>;\n}\ndeclare module 'ioredis/built/connectors/index.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/index'>;\n}\ndeclare module 'ioredis/built/connectors/SentinelConnector/index.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/SentinelConnector/index'>;\n}\ndeclare module 'ioredis/built/connectors/SentinelConnector/SentinelIterator.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/SentinelConnector/SentinelIterator'>;\n}\ndeclare module 'ioredis/built/connectors/SentinelConnector/types.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/SentinelConnector/types'>;\n}\ndeclare module 'ioredis/built/connectors/StandaloneConnector.js' {\n  declare module.exports: $Exports<'ioredis/built/connectors/StandaloneConnector'>;\n}\ndeclare module 'ioredis/built/errors/ClusterAllFailedError.js' {\n  declare module.exports: $Exports<'ioredis/built/errors/ClusterAllFailedError'>;\n}\ndeclare module 'ioredis/built/errors/index.js' {\n  declare module.exports: $Exports<'ioredis/built/errors/index'>;\n}\ndeclare module 'ioredis/built/errors/MaxRetriesPerRequestError.js' {\n  declare module.exports: $Exports<'ioredis/built/errors/MaxRetriesPerRequestError'>;\n}\ndeclare module 'ioredis/built/index.js' {\n  declare module.exports: $Exports<'ioredis/built/index'>;\n}\ndeclare module 'ioredis/built/pipeline.js' {\n  declare module.exports: $Exports<'ioredis/built/pipeline'>;\n}\ndeclare module 'ioredis/built/promiseContainer.js' {\n  declare module.exports: $Exports<'ioredis/built/promiseContainer'>;\n}\ndeclare module 'ioredis/built/redis.js' {\n  declare module.exports: $Exports<'ioredis/built/redis'>;\n}\ndeclare module 'ioredis/built/redis/event_handler.js' {\n  declare module.exports: $Exports<'ioredis/built/redis/event_handler'>;\n}\ndeclare module 'ioredis/built/redis/parser.js' {\n  declare module.exports: $Exports<'ioredis/built/redis/parser'>;\n}\ndeclare module 'ioredis/built/ScanStream.js' {\n  declare module.exports: $Exports<'ioredis/built/ScanStream'>;\n}\ndeclare module 'ioredis/built/script.js' {\n  declare module.exports: $Exports<'ioredis/built/script'>;\n}\ndeclare module 'ioredis/built/SubscriptionSet.js' {\n  declare module.exports: $Exports<'ioredis/built/SubscriptionSet'>;\n}\ndeclare module 'ioredis/built/transaction.js' {\n  declare module.exports: $Exports<'ioredis/built/transaction'>;\n}\ndeclare module 'ioredis/built/types.js' {\n  declare module.exports: $Exports<'ioredis/built/types'>;\n}\ndeclare module 'ioredis/built/utils/debug.js' {\n  declare module.exports: $Exports<'ioredis/built/utils/debug'>;\n}\ndeclare module 'ioredis/built/utils/index.js' {\n  declare module.exports: $Exports<'ioredis/built/utils/index'>;\n}\ndeclare module 'ioredis/built/utils/lodash.js' {\n  declare module.exports: $Exports<'ioredis/built/utils/lodash'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/is-html_vx.x.x.js",
    "content": "// flow-typed signature: 9fa009c72365bb6aac18eebef2857f11\n// flow-typed version: <<STUB>>/is-html_v^1.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'is-html'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'is-html' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'is-html/index' {\n  declare module.exports: $Exports<'is-html'>;\n}\ndeclare module 'is-html/index.js' {\n  declare module.exports: $Exports<'is-html'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/isomorphic-fetch_v2.x.x.js",
    "content": "// flow-typed signature: 47370d221401bec823c43c3598266e26\n// flow-typed version: ec28077c25/isomorphic-fetch_v2.x.x/flow_>=v0.25.x\n\n\ndeclare module 'isomorphic-fetch' {\n    declare module.exports: (input: string | Request | URL, init?: RequestOptions) => Promise<Response>;\n}\n"
  },
  {
    "path": "flow-typed/npm/iterall_vx.x.x.js",
    "content": "// flow-typed signature: d6997ee6fbc8acc419d3044fe689ae91\n// flow-typed version: <<STUB>>/iterall_v1.2.2/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'iterall'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'iterall' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'iterall/index' {\n  declare module.exports: $Exports<'iterall'>;\n}\ndeclare module 'iterall/index.js' {\n  declare module.exports: $Exports<'iterall'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/jest_v22.x.x.js",
    "content": "// flow-typed signature: 6e1fc0a644aa956f79029fec0709e597\n// flow-typed version: 07ebad4796/jest_v22.x.x/flow_>=v0.39.x\n\ntype JestMockFn<TArguments: $ReadOnlyArray<*>, TReturn> = {\n  (...args: TArguments): TReturn,\n  /**\n   * An object for introspecting mock calls\n   */\n  mock: {\n    /**\n     * An array that represents all calls that have been made into this mock\n     * function. Each call is represented by an array of arguments that were\n     * passed during the call.\n     */\n    calls: Array<TArguments>,\n    /**\n     * An array that contains all the object instances that have been\n     * instantiated from this mock function.\n     */\n    instances: Array<TReturn>\n  },\n  /**\n   * Resets all information stored in the mockFn.mock.calls and\n   * mockFn.mock.instances arrays. Often this is useful when you want to clean\n   * up a mock's usage data between two assertions.\n   */\n  mockClear(): void,\n  /**\n   * Resets all information stored in the mock. This is useful when you want to\n   * completely restore a mock back to its initial state.\n   */\n  mockReset(): void,\n  /**\n   * Removes the mock and restores the initial implementation. This is useful\n   * when you want to mock functions in certain test cases and restore the\n   * original implementation in others. Beware that mockFn.mockRestore only\n   * works when mock was created with jest.spyOn. Thus you have to take care of\n   * restoration yourself when manually assigning jest.fn().\n   */\n  mockRestore(): void,\n  /**\n   * Accepts a function that should be used as the implementation of the mock.\n   * The mock itself will still record all calls that go into and instances\n   * that come from itself -- the only difference is that the implementation\n   * will also be executed when the mock is called.\n   */\n  mockImplementation(\n    fn: (...args: TArguments) => TReturn\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Accepts a function that will be used as an implementation of the mock for\n   * one call to the mocked function. Can be chained so that multiple function\n   * calls produce different results.\n   */\n  mockImplementationOnce(\n    fn: (...args: TArguments) => TReturn\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Just a simple sugar function for returning `this`\n   */\n  mockReturnThis(): void,\n  /**\n   * Deprecated: use jest.fn(() => value) instead\n   */\n  mockReturnValue(value: TReturn): JestMockFn<TArguments, TReturn>,\n  /**\n   * Sugar for only returning a value once inside your mock\n   */\n  mockReturnValueOnce(value: TReturn): JestMockFn<TArguments, TReturn>\n};\n\ntype JestAsymmetricEqualityType = {\n  /**\n   * A custom Jasmine equality tester\n   */\n  asymmetricMatch(value: mixed): boolean\n};\n\ntype JestCallsType = {\n  allArgs(): mixed,\n  all(): mixed,\n  any(): boolean,\n  count(): number,\n  first(): mixed,\n  mostRecent(): mixed,\n  reset(): void\n};\n\ntype JestClockType = {\n  install(): void,\n  mockDate(date: Date): void,\n  tick(milliseconds?: number): void,\n  uninstall(): void\n};\n\ntype JestMatcherResult = {\n  message?: string | (() => string),\n  pass: boolean\n};\n\ntype JestMatcher = (actual: any, expected: any) => JestMatcherResult;\n\ntype JestPromiseType = {\n  /**\n   * Use rejects to unwrap the reason of a rejected promise so any other\n   * matcher can be chained. If the promise is fulfilled the assertion fails.\n   */\n  rejects: JestExpectType,\n  /**\n   * Use resolves to unwrap the value of a fulfilled promise so any other\n   * matcher can be chained. If the promise is rejected the assertion fails.\n   */\n  resolves: JestExpectType\n};\n\n/**\n *  Plugin: jest-enzyme\n */\ntype EnzymeMatchersType = {\n  toBeChecked(): void,\n  toBeDisabled(): void,\n  toBeEmpty(): void,\n  toBePresent(): void,\n  toContainReact(element: React$Element<any>): void,\n  toHaveClassName(className: string): void,\n  toHaveHTML(html: string): void,\n  toHaveProp(propKey: string, propValue?: any): void,\n  toHaveRef(refName: string): void,\n  toHaveState(stateKey: string, stateValue?: any): void,\n  toHaveStyle(styleKey: string, styleValue?: any): void,\n  toHaveTagName(tagName: string): void,\n  toHaveText(text: string): void,\n  toIncludeText(text: string): void,\n  toHaveValue(value: any): void,\n  toMatchElement(element: React$Element<any>): void,\n  toMatchSelector(selector: string): void\n};\n\ntype JestExpectType = {\n  not: JestExpectType & EnzymeMatchersType,\n  /**\n   * If you have a mock function, you can use .lastCalledWith to test what\n   * arguments it was last called with.\n   */\n  lastCalledWith(...args: Array<any>): void,\n  /**\n   * toBe just checks that a value is what you expect. It uses === to check\n   * strict equality.\n   */\n  toBe(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toBeCalled(): void,\n  /**\n   * Use .toBeCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toBeCalledWith(...args: Array<any>): void,\n  /**\n   * Using exact equality with floating point numbers is a bad idea. Rounding\n   * means that intuitive things fail.\n   */\n  toBeCloseTo(num: number, delta: any): void,\n  /**\n   * Use .toBeDefined to check that a variable is not undefined.\n   */\n  toBeDefined(): void,\n  /**\n   * Use .toBeFalsy when you don't care what a value is, you just want to\n   * ensure a value is false in a boolean context.\n   */\n  toBeFalsy(): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThan.\n   */\n  toBeGreaterThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeGreaterThanOrEqual.\n   */\n  toBeGreaterThanOrEqual(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThan.\n   */\n  toBeLessThan(number: number): void,\n  /**\n   * To compare floating point numbers, you can use toBeLessThanOrEqual.\n   */\n  toBeLessThanOrEqual(number: number): void,\n  /**\n   * Use .toBeInstanceOf(Class) to check that an object is an instance of a\n   * class.\n   */\n  toBeInstanceOf(cls: Class<*>): void,\n  /**\n   * .toBeNull() is the same as .toBe(null) but the error messages are a bit\n   * nicer.\n   */\n  toBeNull(): void,\n  /**\n   * Use .toBeTruthy when you don't care what a value is, you just want to\n   * ensure a value is true in a boolean context.\n   */\n  toBeTruthy(): void,\n  /**\n   * Use .toBeUndefined to check that a variable is undefined.\n   */\n  toBeUndefined(): void,\n  /**\n   * Use .toContain when you want to check that an item is in a list. For\n   * testing the items in the list, this uses ===, a strict equality check.\n   */\n  toContain(item: any): void,\n  /**\n   * Use .toContainEqual when you want to check that an item is in a list. For\n   * testing the items in the list, this matcher recursively checks the\n   * equality of all fields, rather than checking for object identity.\n   */\n  toContainEqual(item: any): void,\n  /**\n   * Use .toEqual when you want to check that two objects have the same value.\n   * This matcher recursively checks the equality of all fields, rather than\n   * checking for object identity.\n   */\n  toEqual(value: any): void,\n  /**\n   * Use .toHaveBeenCalled to ensure that a mock function got called.\n   */\n  toHaveBeenCalled(): void,\n  /**\n   * Use .toHaveBeenCalledTimes to ensure that a mock function got called exact\n   * number of times.\n   */\n  toHaveBeenCalledTimes(number: number): void,\n  /**\n   * Use .toHaveBeenCalledWith to ensure that a mock function was called with\n   * specific arguments.\n   */\n  toHaveBeenCalledWith(...args: Array<any>): void,\n  /**\n   * Use .toHaveBeenLastCalledWith to ensure that a mock function was last called\n   * with specific arguments.\n   */\n  toHaveBeenLastCalledWith(...args: Array<any>): void,\n  /**\n   * Check that an object has a .length property and it is set to a certain\n   * numeric value.\n   */\n  toHaveLength(number: number): void,\n  /**\n   *\n   */\n  toHaveProperty(propPath: string, value?: any): void,\n  /**\n   * Use .toMatch to check that a string matches a regular expression or string.\n   */\n  toMatch(regexpOrString: RegExp | string): void,\n  /**\n   * Use .toMatchObject to check that a javascript object matches a subset of the properties of an object.\n   */\n  toMatchObject(object: Object | Array<Object>): void,\n  /**\n   * This ensures that a React component matches the most recent snapshot.\n   */\n  toMatchSnapshot(name?: string): void,\n  /**\n   * Use .toThrow to test that a function throws when it is called.\n   * If you want to test that a specific error gets thrown, you can provide an\n   * argument to toThrow. The argument can be a string for the error message,\n   * a class for the error, or a regex that should match the error.\n   *\n   * Alias: .toThrowError\n   */\n  toThrow(message?: string | Error | Class<Error> | RegExp): void,\n  toThrowError(message?: string | Error | Class<Error> | RegExp): void,\n  /**\n   * Use .toThrowErrorMatchingSnapshot to test that a function throws a error\n   * matching the most recent snapshot when it is called.\n   */\n  toThrowErrorMatchingSnapshot(): void\n};\n\ntype JestObjectType = {\n  /**\n   *  Disables automatic mocking in the module loader.\n   *\n   *  After this method is called, all `require()`s will return the real\n   *  versions of each module (rather than a mocked version).\n   */\n  disableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of disableAutomock\n   */\n  autoMockOff(): JestObjectType,\n  /**\n   * Enables automatic mocking in the module loader.\n   */\n  enableAutomock(): JestObjectType,\n  /**\n   * An un-hoisted version of enableAutomock\n   */\n  autoMockOn(): JestObjectType,\n  /**\n   * Clears the mock.calls and mock.instances properties of all mocks.\n   * Equivalent to calling .mockClear() on every mocked function.\n   */\n  clearAllMocks(): JestObjectType,\n  /**\n   * Resets the state of all mocks. Equivalent to calling .mockReset() on every\n   * mocked function.\n   */\n  resetAllMocks(): JestObjectType,\n  /**\n   * Restores all mocks back to their original value.\n   */\n  restoreAllMocks(): JestObjectType,\n  /**\n   * Removes any pending timers from the timer system.\n   */\n  clearAllTimers(): void,\n  /**\n   * The same as `mock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  doMock(moduleName: string, moduleFactory?: any): JestObjectType,\n  /**\n   * The same as `unmock` but not moved to the top of the expectation by\n   * babel-jest.\n   */\n  dontMock(moduleName: string): JestObjectType,\n  /**\n   * Returns a new, unused mock function. Optionally takes a mock\n   * implementation.\n   */\n  fn<TArguments: $ReadOnlyArray<*>, TReturn>(\n    implementation?: (...args: TArguments) => TReturn\n  ): JestMockFn<TArguments, TReturn>,\n  /**\n   * Determines if the given function is a mocked function.\n   */\n  isMockFunction(fn: Function): boolean,\n  /**\n   * Given the name of a module, use the automatic mocking system to generate a\n   * mocked version of the module for you.\n   */\n  genMockFromModule(moduleName: string): any,\n  /**\n   * Mocks a module with an auto-mocked version when it is being required.\n   *\n   * The second argument can be used to specify an explicit module factory that\n   * is being run instead of using Jest's automocking feature.\n   *\n   * The third argument can be used to create virtual mocks -- mocks of modules\n   * that don't exist anywhere in the system.\n   */\n  mock(\n    moduleName: string,\n    moduleFactory?: any,\n    options?: Object\n  ): JestObjectType,\n  /**\n   * Returns the actual module instead of a mock, bypassing all checks on\n   * whether the module should receive a mock implementation or not.\n   */\n  requireActual(moduleName: string): any,\n  /**\n   * Returns a mock module instead of the actual module, bypassing all checks\n   * on whether the module should be required normally or not.\n   */\n  requireMock(moduleName: string): any,\n  /**\n   * Resets the module registry - the cache of all required modules. This is\n   * useful to isolate modules where local state might conflict between tests.\n   */\n  resetModules(): JestObjectType,\n  /**\n   * Exhausts the micro-task queue (usually interfaced in node via\n   * process.nextTick).\n   */\n  runAllTicks(): void,\n  /**\n   * Exhausts the macro-task queue (i.e., all tasks queued by setTimeout(),\n   * setInterval(), and setImmediate()).\n   */\n  runAllTimers(): void,\n  /**\n   * Exhausts all tasks queued by setImmediate().\n   */\n  runAllImmediates(): void,\n  /**\n   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()\n   * or setInterval() and setImmediate()).\n   */\n  runTimersToTime(msToRun: number): void,\n  /**\n   * Executes only the macro-tasks that are currently pending (i.e., only the\n   * tasks that have been queued by setTimeout() or setInterval() up to this\n   * point)\n   */\n  runOnlyPendingTimers(): void,\n  /**\n   * Explicitly supplies the mock object that the module system should return\n   * for the specified module. Note: It is recommended to use jest.mock()\n   * instead.\n   */\n  setMock(moduleName: string, moduleExports: any): JestObjectType,\n  /**\n   * Indicates that the module system should never return a mocked version of\n   * the specified module from require() (e.g. that it should always return the\n   * real module).\n   */\n  unmock(moduleName: string): JestObjectType,\n  /**\n   * Instructs Jest to use fake versions of the standard timer functions\n   * (setTimeout, setInterval, clearTimeout, clearInterval, nextTick,\n   * setImmediate and clearImmediate).\n   */\n  useFakeTimers(): JestObjectType,\n  /**\n   * Instructs Jest to use the real versions of the standard timer functions.\n   */\n  useRealTimers(): JestObjectType,\n  /**\n   * Creates a mock function similar to jest.fn but also tracks calls to\n   * object[methodName].\n   */\n  spyOn(object: Object, methodName: string): JestMockFn<any, any>,\n  /**\n   * Set the default timeout interval for tests and before/after hooks in milliseconds.\n   * Note: The default timeout interval is 5 seconds if this method is not called.\n   */\n  setTimeout(timeout: number): JestObjectType\n};\n\ntype JestSpyType = {\n  calls: JestCallsType\n};\n\n/** Runs this function after every test inside this context */\ndeclare function afterEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number\n): void;\n/** Runs this function before every test inside this context */\ndeclare function beforeEach(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number\n): void;\n/** Runs this function after all tests have finished inside this context */\ndeclare function afterAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number\n): void;\n/** Runs this function before any tests have started inside this context */\ndeclare function beforeAll(\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number\n): void;\n\n/** A context for grouping tests together */\ndeclare var describe: {\n  /**\n   * Creates a block that groups together several related tests in one \"test suite\"\n   */\n  (name: string, fn: () => void): void,\n\n  /**\n   * Only run this describe block\n   */\n  only(name: string, fn: () => void): void,\n\n  /**\n   * Skip running this describe block\n   */\n  skip(name: string, fn: () => void): void\n};\n\n/** An individual test unit */\ndeclare var it: {\n  /**\n   * An individual test unit\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  (\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Only run this test\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  only(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Skip running this test\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  skip(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Run the test concurrently\n   *\n   * @param {string} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  concurrent(\n    name: string,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void\n};\ndeclare function fit(\n  name: string,\n  fn: (done: () => void) => ?Promise<mixed>,\n  timeout?: number\n): void;\n/** An individual test unit */\ndeclare var test: typeof it;\n/** A disabled group of tests */\ndeclare var xdescribe: typeof describe;\n/** A focused group of tests */\ndeclare var fdescribe: typeof describe;\n/** A disabled individual test */\ndeclare var xit: typeof it;\n/** A disabled individual test */\ndeclare var xtest: typeof it;\n\n/** The expect function is used every time you want to test a value */\ndeclare var expect: {\n  /** The object that you want to make assertions against */\n  (value: any): JestExpectType & JestPromiseType & EnzymeMatchersType,\n  /** Add additional Jasmine matchers to Jest's roster */\n  extend(matchers: { [name: string]: JestMatcher }): void,\n  /** Add a module that formats application-specific data structures. */\n  addSnapshotSerializer(serializer: (input: Object) => string): void,\n  assertions(expectedAssertions: number): void,\n  hasAssertions(): void,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): void,\n  arrayContaining(value: Array<mixed>): void,\n  objectContaining(value: Object): void,\n  /** Matches any received string that contains the exact expected string. */\n  stringContaining(value: string): void,\n  stringMatching(value: string | RegExp): void\n};\n\n// TODO handle return type\n// http://jasmine.github.io/2.4/introduction.html#section-Spies\ndeclare function spyOn(value: mixed, method: string): Object;\n\n/** Holds all functions related to manipulating test runner */\ndeclare var jest: JestObjectType;\n\n/**\n * The global Jasmine object, this is generally not exposed as the public API,\n * using features inside here could break in later versions of Jest.\n */\ndeclare var jasmine: {\n  DEFAULT_TIMEOUT_INTERVAL: number,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): void,\n  arrayContaining(value: Array<mixed>): void,\n  clock(): JestClockType,\n  createSpy(name: string): JestSpyType,\n  createSpyObj(\n    baseName: string,\n    methodNames: Array<string>\n  ): { [methodName: string]: JestSpyType },\n  objectContaining(value: Object): void,\n  stringMatching(value: string): void\n};\n"
  },
  {
    "path": "flow-typed/npm/json-stringify-pretty-compact_vx.x.x.js",
    "content": "// flow-typed signature: 6bb459b7c579c9cdb27e1b2e6771b0af\n// flow-typed version: <<STUB>>/json-stringify-pretty-compact_v^1.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'json-stringify-pretty-compact'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'json-stringify-pretty-compact' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'json-stringify-pretty-compact/index' {\n  declare module.exports: $Exports<'json-stringify-pretty-compact'>;\n}\ndeclare module 'json-stringify-pretty-compact/index.js' {\n  declare module.exports: $Exports<'json-stringify-pretty-compact'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/jsonwebtoken_vx.x.x.js",
    "content": "// flow-typed signature: 58501c42740100306b22f9ad57d32267\n// flow-typed version: <<STUB>>/jsonwebtoken_v^8.0.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'jsonwebtoken'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'jsonwebtoken' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'jsonwebtoken/decode' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/lib/JsonWebTokenError' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/lib/NotBeforeError' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/lib/timespan' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/lib/TokenExpiredError' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/sign' {\n  declare module.exports: any;\n}\n\ndeclare module 'jsonwebtoken/verify' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'jsonwebtoken/decode.js' {\n  declare module.exports: $Exports<'jsonwebtoken/decode'>;\n}\ndeclare module 'jsonwebtoken/index' {\n  declare module.exports: $Exports<'jsonwebtoken'>;\n}\ndeclare module 'jsonwebtoken/index.js' {\n  declare module.exports: $Exports<'jsonwebtoken'>;\n}\ndeclare module 'jsonwebtoken/lib/JsonWebTokenError.js' {\n  declare module.exports: $Exports<'jsonwebtoken/lib/JsonWebTokenError'>;\n}\ndeclare module 'jsonwebtoken/lib/NotBeforeError.js' {\n  declare module.exports: $Exports<'jsonwebtoken/lib/NotBeforeError'>;\n}\ndeclare module 'jsonwebtoken/lib/timespan.js' {\n  declare module.exports: $Exports<'jsonwebtoken/lib/timespan'>;\n}\ndeclare module 'jsonwebtoken/lib/TokenExpiredError.js' {\n  declare module.exports: $Exports<'jsonwebtoken/lib/TokenExpiredError'>;\n}\ndeclare module 'jsonwebtoken/sign.js' {\n  declare module.exports: $Exports<'jsonwebtoken/sign'>;\n}\ndeclare module 'jsonwebtoken/verify.js' {\n  declare module.exports: $Exports<'jsonwebtoken/verify'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/keygrip_vx.x.x.js",
    "content": "// flow-typed signature: 950357983b984ecbd77d615994c93962\n// flow-typed version: <<STUB>>/keygrip_v1.0.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'keygrip'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'keygrip' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'keygrip/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'keygrip/index' {\n  declare module.exports: $Exports<'keygrip'>;\n}\ndeclare module 'keygrip/index.js' {\n  declare module.exports: $Exports<'keygrip'>;\n}\ndeclare module 'keygrip/test.js' {\n  declare module.exports: $Exports<'keygrip/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/linkify-it_vx.x.x.js",
    "content": "// flow-typed signature: c00367c8e8cae96d8caaf1de85b67e5b\n// flow-typed version: <<STUB>>/linkify-it_v^2.0.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'linkify-it'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'linkify-it' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'linkify-it/lib/re' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'linkify-it/index' {\n  declare module.exports: $Exports<'linkify-it'>;\n}\ndeclare module 'linkify-it/index.js' {\n  declare module.exports: $Exports<'linkify-it'>;\n}\ndeclare module 'linkify-it/lib/re.js' {\n  declare module.exports: $Exports<'linkify-it/lib/re'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/lint-staged_vx.x.x.js",
    "content": "// flow-typed signature: cf697eb540694ed31d4434db1de58c47\n// flow-typed version: <<STUB>>/lint-staged_v^3.3.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lint-staged'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'lint-staged' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'lint-staged/src/calcChunkSize' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/src/findBin' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/src/generateTasks' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/src/readConfigOption' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/src/runScript' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/__mocks__/execa' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/__mocks__/npm-which' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/calcChunkSize.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/findBin.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/generateTasks.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/readConfigOption.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/runScript-mock-findBin.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/runScript-mock-pMap.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/test/runScript.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'lint-staged/wallaby' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'lint-staged/index' {\n  declare module.exports: $Exports<'lint-staged'>;\n}\ndeclare module 'lint-staged/index.js' {\n  declare module.exports: $Exports<'lint-staged'>;\n}\ndeclare module 'lint-staged/src/calcChunkSize.js' {\n  declare module.exports: $Exports<'lint-staged/src/calcChunkSize'>;\n}\ndeclare module 'lint-staged/src/findBin.js' {\n  declare module.exports: $Exports<'lint-staged/src/findBin'>;\n}\ndeclare module 'lint-staged/src/generateTasks.js' {\n  declare module.exports: $Exports<'lint-staged/src/generateTasks'>;\n}\ndeclare module 'lint-staged/src/index.js' {\n  declare module.exports: $Exports<'lint-staged/src/index'>;\n}\ndeclare module 'lint-staged/src/readConfigOption.js' {\n  declare module.exports: $Exports<'lint-staged/src/readConfigOption'>;\n}\ndeclare module 'lint-staged/src/runScript.js' {\n  declare module.exports: $Exports<'lint-staged/src/runScript'>;\n}\ndeclare module 'lint-staged/test/__mocks__/execa.js' {\n  declare module.exports: $Exports<'lint-staged/test/__mocks__/execa'>;\n}\ndeclare module 'lint-staged/test/__mocks__/npm-which.js' {\n  declare module.exports: $Exports<'lint-staged/test/__mocks__/npm-which'>;\n}\ndeclare module 'lint-staged/test/calcChunkSize.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/calcChunkSize.spec'>;\n}\ndeclare module 'lint-staged/test/findBin.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/findBin.spec'>;\n}\ndeclare module 'lint-staged/test/generateTasks.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/generateTasks.spec'>;\n}\ndeclare module 'lint-staged/test/readConfigOption.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/readConfigOption.spec'>;\n}\ndeclare module 'lint-staged/test/runScript-mock-findBin.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/runScript-mock-findBin.spec'>;\n}\ndeclare module 'lint-staged/test/runScript-mock-pMap.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/runScript-mock-pMap.spec'>;\n}\ndeclare module 'lint-staged/test/runScript.spec.js' {\n  declare module.exports: $Exports<'lint-staged/test/runScript.spec'>;\n}\ndeclare module 'lint-staged/wallaby.js' {\n  declare module.exports: $Exports<'lint-staged/wallaby'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/localstorage-memory_vx.x.x.js",
    "content": "// flow-typed signature: 43d782f1119e4b4366b7e20d8ade28a1\n// flow-typed version: <<STUB>>/localstorage-memory_v^1.0.2/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'localstorage-memory'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'localstorage-memory' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'localstorage-memory/bin/test-browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'localstorage-memory/lib/localstorage-memory' {\n  declare module.exports: any;\n}\n\ndeclare module 'localstorage-memory/tests/node.setup' {\n  declare module.exports: any;\n}\n\ndeclare module 'localstorage-memory/tests/test.localstorage-memory' {\n  declare module.exports: any;\n}\n\ndeclare module 'localstorage-memory/tests/webrunner' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'localstorage-memory/bin/test-browser.js' {\n  declare module.exports: $Exports<'localstorage-memory/bin/test-browser'>;\n}\ndeclare module 'localstorage-memory/lib/localstorage-memory.js' {\n  declare module.exports: $Exports<'localstorage-memory/lib/localstorage-memory'>;\n}\ndeclare module 'localstorage-memory/tests/node.setup.js' {\n  declare module.exports: $Exports<'localstorage-memory/tests/node.setup'>;\n}\ndeclare module 'localstorage-memory/tests/test.localstorage-memory.js' {\n  declare module.exports: $Exports<'localstorage-memory/tests/test.localstorage-memory'>;\n}\ndeclare module 'localstorage-memory/tests/webrunner.js' {\n  declare module.exports: $Exports<'localstorage-memory/tests/webrunner'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/lodash.intersection_vx.x.x.js",
    "content": "// flow-typed signature: caa308b5bf27a5bd6e389df34770a27f\n// flow-typed version: <<STUB>>/lodash.intersection_v^4.4.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'lodash.intersection'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'lodash.intersection' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'lodash.intersection/index' {\n  declare module.exports: $Exports<'lodash.intersection'>;\n}\ndeclare module 'lodash.intersection/index.js' {\n  declare module.exports: $Exports<'lodash.intersection'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/lodash_v4.x.x.js",
    "content": "// flow-typed signature: 2d6372509af898546ea7b44735f2557d\n// flow-typed version: 8c150a1c24/lodash_v4.x.x/flow_>=v0.63.x\n\ndeclare module \"lodash\" {\n  declare type __CurriedFunction1<A, R, AA: A> = (...r: [AA]) => R;\n  declare type CurriedFunction1<A, R> = __CurriedFunction1<A, R, *>;\n\n  declare type __CurriedFunction2<A, B, R, AA: A, BB: B> = ((\n    ...r: [AA]\n  ) => CurriedFunction1<BB, R>) &\n    ((...r: [AA, BB]) => R);\n  declare type CurriedFunction2<A, B, R> = __CurriedFunction2<A, B, R, *, *>;\n\n  declare type __CurriedFunction3<A, B, C, R, AA: A, BB: B, CC: C> = ((\n    ...r: [AA]\n  ) => CurriedFunction2<BB, CC, R>) &\n    ((...r: [AA, BB]) => CurriedFunction1<CC, R>) &\n    ((...r: [AA, BB, CC]) => R);\n  declare type CurriedFunction3<A, B, C, R> = __CurriedFunction3<\n    A,\n    B,\n    C,\n    R,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction4<\n    A,\n    B,\n    C,\n    D,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D\n  > = ((...r: [AA]) => CurriedFunction3<BB, CC, DD, R>) &\n    ((...r: [AA, BB]) => CurriedFunction2<CC, DD, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction1<DD, R>) &\n    ((...r: [AA, BB, CC, DD]) => R);\n  declare type CurriedFunction4<A, B, C, D, R> = __CurriedFunction4<\n    A,\n    B,\n    C,\n    D,\n    R,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction5<\n    A,\n    B,\n    C,\n    D,\n    E,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D,\n    EE: E\n  > = ((...r: [AA]) => CurriedFunction4<BB, CC, DD, EE, R>) &\n    ((...r: [AA, BB]) => CurriedFunction3<CC, DD, EE, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction2<DD, EE, R>) &\n    ((...r: [AA, BB, CC, DD]) => CurriedFunction1<EE, R>) &\n    ((...r: [AA, BB, CC, DD, EE]) => R);\n  declare type CurriedFunction5<A, B, C, D, E, R> = __CurriedFunction5<\n    A,\n    B,\n    C,\n    D,\n    E,\n    R,\n    *,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction6<\n    A,\n    B,\n    C,\n    D,\n    E,\n    F,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D,\n    EE: E,\n    FF: F\n  > = ((...r: [AA]) => CurriedFunction5<BB, CC, DD, EE, FF, R>) &\n    ((...r: [AA, BB]) => CurriedFunction4<CC, DD, EE, FF, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction3<DD, EE, FF, R>) &\n    ((...r: [AA, BB, CC, DD]) => CurriedFunction2<EE, FF, R>) &\n    ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1<FF, R>) &\n    ((...r: [AA, BB, CC, DD, EE, FF]) => R);\n  declare type CurriedFunction6<A, B, C, D, E, F, R> = __CurriedFunction6<\n    A,\n    B,\n    C,\n    D,\n    E,\n    F,\n    R,\n    *,\n    *,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type Curry = (<A, R>((...r: [A]) => R) => CurriedFunction1<A, R>) &\n    (<A, B, R>((...r: [A, B]) => R) => CurriedFunction2<A, B, R>) &\n    (<A, B, C, R>((...r: [A, B, C]) => R) => CurriedFunction3<A, B, C, R>) &\n    (<A, B, C, D, R>(\n      (...r: [A, B, C, D]) => R\n    ) => CurriedFunction4<A, B, C, D, R>) &\n    (<A, B, C, D, E, R>(\n      (...r: [A, B, C, D, E]) => R\n    ) => CurriedFunction5<A, B, C, D, E, R>) &\n    (<A, B, C, D, E, F, R>(\n      (...r: [A, B, C, D, E, F]) => R\n    ) => CurriedFunction6<A, B, C, D, E, F, R>);\n\n  declare type UnaryFn<A, R> = (a: A) => R;\n\n  declare type TemplateSettings = {\n    escape?: RegExp,\n    evaluate?: RegExp,\n    imports?: Object,\n    interpolate?: RegExp,\n    variable?: string\n  };\n\n  declare type TruncateOptions = {\n    length?: number,\n    omission?: string,\n    separator?: RegExp | string\n  };\n\n  declare type DebounceOptions = {\n    leading?: boolean,\n    maxWait?: number,\n    trailing?: boolean\n  };\n\n  declare type ThrottleOptions = {\n    leading?: boolean,\n    trailing?: boolean\n  };\n\n  declare type NestedArray<T> = Array<Array<T>>;\n\n  declare type matchesIterateeShorthand = Object;\n  declare type matchesPropertyIterateeShorthand = [string, any];\n  declare type propertyIterateeShorthand = string;\n\n  declare type OPredicate<A, O> =\n    | ((value: A, key: string, object: O) => any)\n    | matchesIterateeShorthand\n    | matchesPropertyIterateeShorthand\n    | propertyIterateeShorthand;\n\n  declare type OIterateeWithResult<V, O, R> =\n    | Object\n    | string\n    | ((value: V, key: string, object: O) => R);\n  declare type OIteratee<O> = OIterateeWithResult<any, O, any>;\n  declare type OFlatMapIteratee<T, U> = OIterateeWithResult<any, T, Array<U>>;\n\n  declare type Predicate<T> =\n    | ((value: T, index: number, array: Array<T>) => any)\n    | matchesIterateeShorthand\n    | matchesPropertyIterateeShorthand\n    | propertyIterateeShorthand;\n\n  declare type _ValueOnlyIteratee<T> = (value: T) => mixed;\n  declare type ValueOnlyIteratee<T> = _ValueOnlyIteratee<T> | string;\n  declare type _Iteratee<T> = (\n    item: T,\n    index: number,\n    array: ?Array<T>\n  ) => mixed;\n  declare type Iteratee<T> = _Iteratee<T> | Object | string;\n  declare type FlatMapIteratee<T, U> =\n    | ((item: T, index: number, array: ?$ReadOnlyArray<T>) => Array<U>)\n    | Object\n    | string;\n  declare type Comparator<T> = (item: T, item2: T) => boolean;\n\n  declare type MapIterator<T, U> =\n    | ((item: T, index: number, array: Array<T>) => U)\n    | propertyIterateeShorthand;\n\n  declare type ReadOnlyMapIterator<T, U> =\n    | ((item: T, index: number, array: $ReadOnlyArray<T>) => U)\n    | propertyIterateeShorthand;\n\n  declare type OMapIterator<T, O, U> =\n    | ((item: T, key: string, object: O) => U)\n    | propertyIterateeShorthand;\n\n  declare class Lodash {\n    // Array\n    chunk<T>(array?: ?Array<T>, size?: ?number): Array<Array<T>>;\n    compact<T, N: ?T>(array?: ?Array<N>): Array<T>;\n    concat<T>(base?: ?Array<T>, ...elements: Array<any>): Array<T | any>;\n    difference<T>(array?: ?$ReadOnlyArray<T>, values?: ?$ReadOnlyArray<T>): Array<T>;\n    differenceBy<T>(\n      array?: ?$ReadOnlyArray<T>,\n      values?: ?$ReadOnlyArray<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): T[];\n    differenceWith<T>(array?: ?$ReadOnlyArray<T>, values?: ?$ReadOnlyArray<T>, comparator?: ?Comparator<T>): T[];\n    drop<T>(array?: ?Array<T>, n?: ?number): Array<T>;\n    dropRight<T>(array?: ?Array<T>, n?: ?number): Array<T>;\n    dropRightWhile<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    dropWhile<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    fill<T, U>(\n      array?: ?Array<T>,\n      value?: ?U,\n      start?: ?number,\n      end?: ?number\n    ): Array<T | U>;\n    findIndex<T>(\n      array: $ReadOnlyArray<T>,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): number;\n    findIndex<T>(\n      array: void | null,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): -1;\n    findLastIndex<T>(\n      array: $ReadOnlyArray<T>,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): number;\n    findLastIndex<T>(\n      array: void | null,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): -1;\n    // alias of _.head\n    first<T>(array: ?Array<T>): T;\n    flatten<T, X>(array?: ?Array<Array<T> | X>): Array<T | X>;\n    flattenDeep<T>(array?: ?any[]): Array<T>;\n    flattenDepth(array?: ?any[], depth?: ?number): any[];\n    fromPairs<A, B>(pairs?: ?Array<[A, B]>): { [key: A]: B };\n    head<T>(array: ?Array<T>): T;\n    indexOf<T>(array: Array<T>, value: T, fromIndex?: number): number;\n    indexOf<T>(array: void | null, value?: ?T, fromIndex?: ?number): -1;\n    initial<T>(array: ?Array<T>): Array<T>;\n    intersection<T>(...arrays?: Array<Array<T>>): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    intersectionBy<T>(a1?: ?Array<T>, iteratee?: ?ValueOnlyIteratee<T>): Array<T>;\n    intersectionBy<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): Array<T>;\n    intersectionBy<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      a3?: ?Array<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): Array<T>;\n    intersectionBy<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      a3?: ?Array<T>,\n      a4?: ?Array<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    intersectionWith<T>(a1?: ?Array<T>, comparator?: ?Comparator<T>): Array<T>;\n    intersectionWith<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      comparator?: ?Comparator<T>\n    ): Array<T>;\n    intersectionWith<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      a3?: ?Array<T>,\n      comparator?: ?Comparator<T>\n    ): Array<T>;\n    intersectionWith<T>(\n      a1?: ?Array<T>,\n      a2?: ?Array<T>,\n      a3?: ?Array<T>,\n      a4?: ?Array<T>,\n      comparator?: ?Comparator<T>\n    ): Array<T>;\n    join<T>(array: Array<T>, separator?: ?string): string;\n    join<T>(array: void | null, separator?: ?string): '';\n    last<T>(array: ?Array<T>): T;\n    lastIndexOf<T>(array: Array<T>, value?: ?T, fromIndex?: ?number): number;\n    lastIndexOf<T>(array: void | null, value?: ?T, fromIndex?: ?number): -1;\n    nth<T>(array: T[], n?: ?number): T;\n    nth(array: void | null, n?: ?number): void;\n    pull<T>(array: Array<T>, ...values?: Array<?T>): Array<T>;\n    pull<T: void | null>(array: T, ...values?: Array<?any>): T;\n    pullAll<T>(array: Array<T>, values?: ?Array<T>): Array<T>;\n    pullAll<T: void | null>(array: T, values?: ?Array<any>): T;\n    pullAllBy<T>(\n      array: Array<T>,\n      values?: ?Array<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): Array<T>;\n    pullAllBy<T: void | null>(\n      array: T,\n      values?: ?Array<any>,\n      iteratee?: ?ValueOnlyIteratee<any>\n    ): T;\n    pullAllWith<T>(array: T[], values?: ?T[], comparator?: ?Function): T[];\n    pullAllWith<T: void | null>(array: T, values?: ?Array<any>, comparator?: ?Function): T;\n    pullAt<T>(array?: ?Array<T>, ...indexed?: Array<?number>): Array<T>;\n    pullAt<T>(array?: ?Array<T>, indexed?: ?Array<number>): Array<T>;\n    remove<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    reverse<T>(array: Array<T>): Array<T>;\n    reverse<T: void | null>(array: T): T;\n    slice<T>(array?: ?Array<T>, start?: ?number, end?: ?number): Array<T>;\n    sortedIndex<T>(array: Array<T>, value: T): number;\n    sortedIndex<T>(array: void | null, value: ?T): 0;\n    sortedIndexBy<T>(\n      array: Array<T>,\n      value?: ?T,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): number;\n    sortedIndexBy<T>(\n      array: void | null,\n      value?: ?T,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): 0;\n    sortedIndexOf<T>(array: Array<T>, value: T): number;\n    sortedIndexOf<T>(array: void | null, value?: ?T): -1;\n    sortedLastIndex<T>(array: Array<T>, value: T): number;\n    sortedLastIndex<T>(array: void | null, value?: ?T): 0;\n    sortedLastIndexBy<T>(\n      array: Array<T>,\n      value: T,\n      iteratee?: ValueOnlyIteratee<T>\n    ): number;\n    sortedLastIndexBy<T>(\n      array: void | null,\n      value?: ?T,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): 0;\n    sortedLastIndexOf<T>(array: Array<T>, value: T): number;\n    sortedLastIndexOf<T>(array: void | null, value?: ?T): -1;\n    sortedUniq<T>(array?: ?Array<T>): Array<T>;\n    sortedUniqBy<T>(array?: ?Array<T>, iteratee?: ?(value: T) => mixed): Array<T>;\n    tail<T>(array?: ?Array<T>): Array<T>;\n    take<T>(array?: ?Array<T>, n?: ?number): Array<T>;\n    takeRight<T>(array?: ?Array<T>, n?: ?number): Array<T>;\n    takeRightWhile<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    takeWhile<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    union<T>(...arrays?: Array<Array<T>>): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    unionBy<T>(a1?: ?Array<T>, iteratee?: ?ValueOnlyIteratee<T>): Array<T>;\n    unionBy<T>(\n      a1?: ?Array<T>,\n      a2: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    unionBy<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    unionBy<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      a4: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    unionWith<T>(a1?: ?Array<T>, comparator?: ?Comparator<T>): Array<T>;\n    unionWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    unionWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    unionWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      a4: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    uniq<T>(array?: ?Array<T>): Array<T>;\n    uniqBy<T>(array?: ?Array<T>, iteratee?: ?ValueOnlyIteratee<T>): Array<T>;\n    uniqWith<T>(array?: ?Array<T>, comparator?: ?Comparator<T>): Array<T>;\n    unzip<T>(array?: ?Array<T>): Array<T>;\n    unzipWith<T>(array: ?Array<T>, iteratee?: ?Iteratee<T>): Array<T>;\n    without<T>(array?: ?Array<T>, ...values?: Array<?T>): Array<T>;\n    xor<T>(...array: Array<Array<T>>): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    xorBy<T>(a1?: ?Array<T>, iteratee?: ?ValueOnlyIteratee<T>): Array<T>;\n    xorBy<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    xorBy<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    xorBy<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      a4: Array<T>,\n      iteratee?: ValueOnlyIteratee<T>\n    ): Array<T>;\n    //Workaround until (...parameter: T, parameter2: U) works\n    xorWith<T>(a1?: ?Array<T>, comparator?: ?Comparator<T>): Array<T>;\n    xorWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    xorWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    xorWith<T>(\n      a1: Array<T>,\n      a2: Array<T>,\n      a3: Array<T>,\n      a4: Array<T>,\n      comparator?: Comparator<T>\n    ): Array<T>;\n    zip<A, B>(a1?: ?A[], a2?: ?B[]): Array<[A, B]>;\n    zip<A, B, C>(a1: A[], a2: B[], a3: C[]): Array<[A, B, C]>;\n    zip<A, B, C, D>(a1: A[], a2: B[], a3: C[], a4: D[]): Array<[A, B, C, D]>;\n    zip<A, B, C, D, E>(\n      a1: A[],\n      a2: B[],\n      a3: C[],\n      a4: D[],\n      a5: E[]\n    ): Array<[A, B, C, D, E]>;\n\n    zipObject<K, V>(props: Array<K>, values?: ?Array<V>): { [key: K]: V };\n    zipObject<K, V>(props: void | null, values?: ?Array<V>): {};\n    zipObjectDeep(props: any[], values?: ?any): Object;\n    zipObjectDeep(props: void | null, values?: ?any): {};\n\n    zipWith<A>(a1?: ?Array<A>): Array<[A]>;\n    zipWith<T, A>(a1: Array<A>, iteratee: (A) => T): Array<T>;\n\n    zipWith<A, B>(a1: Array<A>, a2: Array<B>): Array<[A, B]>;\n    zipWith<T, A, B>(\n      a1: Array<A>,\n      a2: Array<B>,\n      iteratee: (A, B) => T\n    ): Array<T>;\n\n    zipWith<A, B, C>(\n      a1: Array<A>,\n      a2: Array<B>,\n      a3: Array<C>\n    ): Array<[A, B, C]>;\n    zipWith<T, A, B, C>(\n      a1: Array<A>,\n      a2: Array<B>,\n      a3: Array<C>,\n      iteratee: (A, B, C) => T\n    ): Array<T>;\n\n    zipWith<A, B, C, D>(\n      a1: Array<A>,\n      a2: Array<B>,\n      a3: Array<C>,\n      a4: Array<D>\n    ): Array<[A, B, C, D]>;\n    zipWith<T, A, B, C, D>(\n      a1: Array<A>,\n      a2: Array<B>,\n      a3: Array<C>,\n      a4: Array<D>,\n      iteratee: (A, B, C, D) => T\n    ): Array<T>;\n\n    // Collection\n    countBy<T>(array: Array<T>, iteratee?: ?ValueOnlyIteratee<T>): Object;\n    countBy<T>(array: void | null, iteratee?: ?ValueOnlyIteratee<T>): {};\n    countBy<T: Object>(object: T, iteratee?: ?ValueOnlyIteratee<T>): Object;\n    // alias of _.forEach\n    each<T>(array: Array<T>, iteratee?: ?Iteratee<T>): Array<T>;\n    each<T: void | null>(array: T, iteratee?: ?Iteratee<any>): T;\n    each<T: Object>(object: T, iteratee?: ?OIteratee<T>): T;\n    // alias of _.forEachRight\n    eachRight<T>(array: Array<T>, iteratee?: ?Iteratee<T>): Array<T>;\n    eachRight<T: void | null>(array: T, iteratee?: ?Iteratee<any>): T;\n    eachRight<T: Object>(object: T, iteratee?: OIteratee<T>): T;\n    every<T>(array?: ?Array<T>, iteratee?: ?Iteratee<T>): boolean;\n    every<T: Object>(object: T, iteratee?: OIteratee<T>): boolean;\n    filter<T>(array?: ?Array<T>, predicate?: ?Predicate<T>): Array<T>;\n    filter<A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: OPredicate<A, T>\n    ): Array<A>;\n    find<T>(\n      array: $ReadOnlyArray<T>,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): T | void;\n    find<T>(\n      array: void | null,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): void;\n    find<V, A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: OPredicate<A, T>,\n      fromIndex?: number\n    ): V;\n    findLast<T>(\n      array: ?$ReadOnlyArray<T>,\n      predicate?: ?Predicate<T>,\n      fromIndex?: ?number\n    ): T | void;\n    findLast<V, A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): V;\n    flatMap<T, U>(\n      array?: ?$ReadOnlyArray<T>,\n      iteratee?: ?FlatMapIteratee<T, U>\n    ): Array<U>;\n    flatMap<T: Object, U>(\n      object: T,\n      iteratee?: OFlatMapIteratee<T, U>\n    ): Array<U>;\n    flatMapDeep<T, U>(\n      array?: ?$ReadOnlyArray<T>,\n      iteratee?: ?FlatMapIteratee<T, U>\n    ): Array<U>;\n    flatMapDeep<T: Object, U>(\n      object: T,\n      iteratee?: ?OFlatMapIteratee<T, U>\n    ): Array<U>;\n    flatMapDepth<T, U>(\n      array?: ?Array<T>,\n      iteratee?: ?FlatMapIteratee<T, U>,\n      depth?: ?number\n    ): Array<U>;\n    flatMapDepth<T: Object, U>(\n      object: T,\n      iteratee?: OFlatMapIteratee<T, U>,\n      depth?: number\n    ): Array<U>;\n    forEach<T>(array: Array<T>, iteratee?: ?Iteratee<T>): Array<T>;\n    forEach<T: void | null>(array: T, iteratee?: ?Iteratee<any>): T;\n    forEach<T: Object>(object: T, iteratee?: ?OIteratee<T>): T;\n    forEachRight<T>(array: Array<T>, iteratee?: ?Iteratee<T>): Array<T>;\n    forEachRight<T: void | null>(array: T, iteratee?: ?Iteratee<any>): T;\n    forEachRight<T: Object>(object: T, iteratee?: ?OIteratee<T>): T;\n    groupBy<V, T>(\n      array: $ReadOnlyArray<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): { [key: V]: Array<T> };\n    groupBy(\n      array: void | null,\n      iteratee?: ?ValueOnlyIteratee<any>\n    ): {};\n    groupBy<V, A, T: { [id: string]: A }>(\n      object: T,\n      iteratee?: ValueOnlyIteratee<A>\n    ): { [key: V]: Array<A> };\n    includes<T>(array: Array<T>, value: T, fromIndex?: ?number): boolean;\n    includes<T>(array: void | null, value?: ?T, fromIndex?: ?number): false;\n    includes<T: Object>(object: T, value: any, fromIndex?: number): boolean;\n    includes(str: string, value: string, fromIndex?: number): boolean;\n    invokeMap<T>(\n      array?: ?Array<T>,\n      path?: ?((value: T) => Array<string> | string) | Array<string> | string,\n      ...args?: Array<any>\n    ): Array<any>;\n    invokeMap<T: Object>(\n      object: T,\n      path: ((value: any) => Array<string> | string) | Array<string> | string,\n      ...args?: Array<any>\n    ): Array<any>;\n    keyBy<T, V>(\n      array: $ReadOnlyArray<T>,\n      iteratee?: ?ValueOnlyIteratee<T>\n    ): { [key: V]: ?T };\n    keyBy(\n      array: void | null,\n      iteratee?: ?ValueOnlyIteratee<*>\n    ): {};\n    keyBy<V, A, I, T: { [id: I]: A }>(\n      object: T,\n      iteratee?: ?ValueOnlyIteratee<A>\n    ): { [key: V]: ?A };\n    map<T, U>(array?: ?Array<T>, iteratee?: ?MapIterator<T, U>): Array<U>;\n    map<T, U>(\n      array: ?$ReadOnlyArray<T>,\n      iteratee?: ReadOnlyMapIterator<T, U>\n    ): Array<U>,\n    map<V, T: Object, U>(\n      object: ?T,\n      iteratee?: OMapIterator<V, T, U>\n    ): Array<U>;\n    map(\n      str: ?string,\n      iteratee?: (char: string, index: number, str: string) => any\n    ): string;\n    orderBy<T>(\n      array: $ReadOnlyArray<T>,\n      iteratees?: ?$ReadOnlyArray<Iteratee<T>> | ?string,\n      orders?: ?$ReadOnlyArray<\"asc\" | \"desc\"> | ?string\n    ): Array<T>;\n    orderBy<T>(\n      array: null | void,\n      iteratees?: ?$ReadOnlyArray<Iteratee<T>> | ?string,\n      orders?: ?$ReadOnlyArray<\"asc\" | \"desc\"> | ?string\n    ): Array<T>;\n    orderBy<V, T: Object>(\n      object: T,\n      iteratees?: $ReadOnlyArray<OIteratee<*>> | string,\n      orders?: $ReadOnlyArray<\"asc\" | \"desc\"> | string\n    ): Array<V>;\n    partition<T>(\n      array?: ?Array<T>,\n      predicate?: ?Predicate<T>\n    ): [Array<T>, Array<T>];\n    partition<V, A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: OPredicate<A, T>\n    ): [Array<V>, Array<V>];\n    reduce<T, U>(\n      array: Array<T>,\n      iteratee?: (\n        accumulator: U,\n        value: T,\n        index: number,\n        array: ?Array<T>\n      ) => U,\n      accumulator?: U\n    ): U;\n    reduce<T, U>(\n      array: void | null,\n      iteratee?: ?(\n        accumulator: U,\n        value: T,\n        index: number,\n        array: ?Array<T>\n      ) => U,\n      accumulator?: ?U\n    ): void | null;\n    reduce<T: Object, U>(\n      object: T,\n      iteratee?: (accumulator: U, value: any, key: string, object: T) => U,\n      accumulator?: U\n    ): U;\n    reduceRight<T, U>(\n      array: void | null,\n      iteratee?: ?(\n        accumulator: U,\n        value: T,\n        index: number,\n        array: ?Array<T>\n      ) => U,\n      accumulator?: ?U\n    ): void | null;\n    reduceRight<T, U>(\n      array: Array<T>,\n      iteratee?: ?(\n        accumulator: U,\n        value: T,\n        index: number,\n        array: ?Array<T>\n      ) => U,\n      accumulator?: ?U\n    ): U;\n    reduceRight<T: Object, U>(\n      object: T,\n      iteratee?: ?(accumulator: U, value: any, key: string, object: T) => U,\n      accumulator?: ?U\n    ): U;\n    reject<T>(array: ?Array<T>, predicate?: Predicate<T>): Array<T>;\n    reject<V: Object, A, T: { [id: string]: A }>(\n      object?: ?T,\n      predicate?: ?OPredicate<A, T>\n    ): Array<V>;\n    sample<T>(array: ?Array<T>): T;\n    sample<V, T: Object>(object: T): V;\n    sampleSize<T>(array?: ?Array<T>, n?: ?number): Array<T>;\n    sampleSize<V, T: Object>(object: T, n?: number): Array<V>;\n    shuffle<T>(array: ?Array<T>): Array<T>;\n    shuffle<V, T: Object>(object: T): Array<V>;\n    size(collection: Array<any> | Object | string): number;\n    some<T>(array: ?Array<T>, predicate?: Predicate<T>): boolean;\n    some<T>(array: void | null, predicate?: ?Predicate<T>): false;\n    some<A, T: { [id: string]: A }>(\n      object?: ?T,\n      predicate?: OPredicate<A, T>\n    ): boolean;\n    sortBy<T>(\n      array: ?$ReadOnlyArray<T>,\n      ...iteratees?: $ReadOnlyArray<Iteratee<T>>\n    ): Array<T>;\n    sortBy<T>(\n      array: ?$ReadOnlyArray<T>,\n      iteratees?: $ReadOnlyArray<Iteratee<T>>\n    ): Array<T>;\n    sortBy<V, T: Object>(\n      object: T,\n      ...iteratees?: Array<OIteratee<T>>\n    ): Array<V>;\n    sortBy<V, T: Object>(\n      object: T,\n      iteratees?: $ReadOnlyArray<OIteratee<T>>\n    ): Array<V>;\n\n    // Date\n    now(): number;\n\n    // Function\n    after(n: number, fn: Function): Function;\n    ary(func: Function, n?: number): Function;\n    before(n: number, fn: Function): Function;\n    bind(func: Function, thisArg: any, ...partials: Array<any>): Function;\n    bindKey(obj?: ?Object, key?: ?string, ...partials?: Array<?any>): Function;\n    curry: Curry;\n    curry(func: Function, arity?: number): Function;\n    curryRight(func: Function, arity?: number): Function;\n    debounce<F: Function>(func: F, wait?: number, options?: DebounceOptions): F;\n    defer(func: Function, ...args?: Array<any>): TimeoutID;\n    delay(func: Function, wait: number, ...args?: Array<any>): TimeoutID;\n    flip(func: Function): Function;\n    memoize<F: Function>(func: F, resolver?: Function): F;\n    negate(predicate: Function): Function;\n    once(func: Function): Function;\n    overArgs(func?: ?Function, ...transforms?: Array<Function>): Function;\n    overArgs(func?: ?Function, transforms?: ?Array<Function>): Function;\n    partial(func: Function, ...partials: any[]): Function;\n    partialRight(func: Function, ...partials: Array<any>): Function;\n    partialRight(func: Function, partials: Array<any>): Function;\n    rearg(func: Function, ...indexes: Array<number>): Function;\n    rearg(func: Function, indexes: Array<number>): Function;\n    rest(func: Function, start?: number): Function;\n    spread(func: Function): Function;\n    throttle(\n      func: Function,\n      wait?: number,\n      options?: ThrottleOptions\n    ): Function;\n    unary(func: Function): Function;\n    wrap(value?: any, wrapper?: ?Function): Function;\n\n    // Lang\n    castArray(value: *): any[];\n    clone<T>(value: T): T;\n    cloneDeep<T>(value: T): T;\n    cloneDeepWith<T, U>(\n      value: T,\n      customizer?: ?(value: T, key: number | string, object: T, stack: any) => U\n    ): U;\n    cloneWith<T, U>(\n      value: T,\n      customizer?: ?(value: T, key: number | string, object: T, stack: any) => U\n    ): U;\n    conformsTo<T: { [key: string]: mixed }>(\n      source: T,\n      predicates: T & { [key: string]: (x: any) => boolean }\n    ): boolean;\n    eq(value: any, other: any): boolean;\n    gt(value: any, other: any): boolean;\n    gte(value: any, other: any): boolean;\n    isArguments(value: void | null): false;\n    isArguments(value: any): boolean;\n    isArray(value: Array<any>): true;\n    isArray(value: any): false;\n    isArrayBuffer(value: ArrayBuffer): true;\n    isArrayBuffer(value: any): false;\n    isArrayLike(value: Array<any> | string | {length: number}): true;\n    isArrayLike(value: any): false;\n    isArrayLikeObject(value: {length: number} | Array<any>): true;\n    isArrayLikeObject(value: any): false;\n    isBoolean(value: boolean): true;\n    isBoolean(value: any): false;\n    isBuffer(value: void | null): false;\n    isBuffer(value: any): boolean;\n    isDate(value: Date): true;\n    isDate(value: any): false;\n    isElement(value: Element): true;\n    isElement(value: any): false;\n    isEmpty(value: void | null | '' | {} | [] | number | boolean): true;\n    isEmpty(value: any): boolean;\n    isEqual(value: any, other: any): boolean;\n    isEqualWith<T, U>(\n      value?: ?T,\n      other?: ?U,\n      customizer?: ?(\n        objValue: any,\n        otherValue: any,\n        key: number | string,\n        object: T,\n        other: U,\n        stack: any\n      ) => boolean | void\n    ): boolean;\n    isError(value: Error): true;\n    isError(value: any): false;\n    isFinite(value: number): boolean;\n    isFinite(value: any): false;\n    isFunction(value: Function): true;\n    isFunction(value: any): false;\n    isInteger(value: number): boolean;\n    isInteger(value: any): false;\n    isLength(value: void | null): false;\n    isLength(value: any): boolean;\n    isMap(value: Map<any, any>): true;\n    isMap(value: any): false;\n    isMatch(object?: ?Object, source?: ?Object): boolean;\n    isMatchWith<T: Object, U: Object>(\n      object?: ?T,\n      source?: ?U,\n      customizer?: ?(\n        objValue: any,\n        srcValue: any,\n        key: number | string,\n        object: T,\n        source: U\n      ) => boolean | void\n    ): boolean;\n    isNaN(value: Function | string | void | null | Object): false;\n    isNaN(value: number): boolean;\n    isNative(value: number | string | void | null | Object): false;\n    isNative(value: any): boolean;\n    isNil(value: void | null): true;\n    isNil(value: any): false;\n    isNull(value: null): true;\n    isNull(value: any): false;\n    isNumber(value: number): true;\n    isNumber(value: any): false;\n    isObject(value: Object): true;\n    isObject(value: any): false;\n    isObjectLike(value: void | null): false;\n    isObjectLike(value: any): boolean;\n    isPlainObject(value: Object): true;\n    isPlainObject(value: any): false;\n    isRegExp(value: RegExp): true;\n    isRegExp(value: any): false;\n    isSafeInteger(value: number): boolean;\n    isSafeInteger(value: any): false;\n    isSet(value: Set<any>): true;\n    isSet(value: any): false;\n    isString(value: string): true;\n    isString(\n      value: number | boolean | Function | void | null | Object | Array<any>\n    ): false;\n    isSymbol(value: Symbol): true;\n    isSymbol(value: any): false;\n    isTypedArray(value: $TypedArray): true;\n    isTypedArray(value: any): false;\n    isUndefined(value: void): true;\n    isUndefined(value: any): false;\n    isWeakMap(value: WeakMap<any, any>): true;\n    isWeakMap(value: any): false;\n    isWeakSet(value: WeakSet<any>): true;\n    isWeakSet(value: any): false;\n    lt(value: any, other: any): boolean;\n    lte(value: any, other: any): boolean;\n    toArray(value: any): Array<any>;\n    toFinite(value: void | null): 0;\n    toFinite(value: any): number;\n    toInteger(value: void | null): 0;\n    toInteger(value: any): number;\n    toLength(value: void | null): 0;\n    toLength(value: any): number;\n    toNumber(value: void | null): 0;\n    toNumber(value: any): number;\n    toPlainObject(value: any): Object;\n    toSafeInteger(value: void | null): 0;\n    toSafeInteger(value: any): number;\n    toString(value: void | null): '';\n    toString(value: any): string;\n\n    // Math\n    add(augend: number, addend: number): number;\n    ceil(number: number, precision?: number): number;\n    divide(dividend: number, divisor: number): number;\n    floor(number: number, precision?: number): number;\n    max<T>(array: ?Array<T>): T;\n    maxBy<T>(array: ?Array<T>, iteratee?: Iteratee<T>): T;\n    mean(array: Array<*>): number;\n    meanBy<T>(array: Array<T>, iteratee?: Iteratee<T>): number;\n    min<T>(array: ?Array<T>): T;\n    minBy<T>(array: ?Array<T>, iteratee?: Iteratee<T>): T;\n    multiply(multiplier: number, multiplicand: number): number;\n    round(number: number, precision?: number): number;\n    subtract(minuend: number, subtrahend: number): number;\n    sum(array: Array<*>): number;\n    sumBy<T>(array: Array<T>, iteratee?: Iteratee<T>): number;\n\n    // number\n    clamp(number?: number, lower?: ?number, upper?: ?number): number;\n    clamp(number: ?number, lower?: ?number, upper?: ?number): 0;\n    inRange(number: number, start?: number, end: number): boolean;\n    random(lower?: number, upper?: number, floating?: boolean): number;\n\n    // Object\n    assign(object?: ?Object, ...sources?: Array<Object>): Object;\n    assignIn(): {};\n    assignIn<A, B>(a: A, b: B): A & B;\n    assignIn<A, B, C>(a: A, b: B, c: C): A & B & C;\n    assignIn<A, B, C, D>(a: A, b: B, c: C, d: D): A & B & C & D;\n    assignIn<A, B, C, D, E>(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E;\n    assignInWith(): {};\n    assignInWith<T: Object, A: Object>(\n      object: T,\n      s1: A,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): Object;\n    assignInWith<T: Object, A: Object, B: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void\n    ): Object;\n    assignInWith<T: Object, A: Object, B: Object, C: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C\n      ) => any | void\n    ): Object;\n    assignInWith<T: Object, A: Object, B: Object, C: Object, D: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      s4: D,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C | D\n      ) => any | void\n    ): Object;\n    assignWith(): {};\n    assignWith<T: Object, A: Object>(\n      object: T,\n      s1: A,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): Object;\n    assignWith<T: Object, A: Object, B: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void\n    ): Object;\n    assignWith<T: Object, A: Object, B: Object, C: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C\n      ) => any | void\n    ): Object;\n    assignWith<T: Object, A: Object, B: Object, C: Object, D: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      s4: D,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C | D\n      ) => any | void\n    ): Object;\n    at(object?: ?Object, ...paths: Array<string>): Array<any>;\n    at(object?: ?Object, paths: Array<string>): Array<any>;\n    create<T>(prototype: T, properties: Object): $Supertype<T>;\n    create(prototype: any, properties: void | null): {};\n    defaults(object?: ?Object, ...sources?: Array<Object>): Object;\n    defaultsDeep(object?: ?Object, ...sources?: Array<Object>): Object;\n    // alias for _.toPairs\n    entries(object?: ?Object): Array<[string, any]>;\n    // alias for _.toPairsIn\n    entriesIn(object?: ?Object): Array<[string, any]>;\n    // alias for _.assignIn\n    extend<A, B>(a?: ?A, b?: ?B): A & B;\n    extend<A, B, C>(a: A, b: B, c: C): A & B & C;\n    extend<A, B, C, D>(a: A, b: B, c: C, d: D): A & B & C & D;\n    extend<A, B, C, D, E>(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E;\n    // alias for _.assignInWith\n    extendWith<T: Object, A: Object>(\n      object?: ?T,\n      s1?: ?A,\n      customizer?: ?(\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): Object;\n    extendWith<T: Object, A: Object, B: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void\n    ): Object;\n    extendWith<T: Object, A: Object, B: Object, C: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C\n      ) => any | void\n    ): Object;\n    extendWith<T: Object, A: Object, B: Object, C: Object, D: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      s4: D,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C | D\n      ) => any | void\n    ): Object;\n    findKey<A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): string | void;\n    findKey<A, T: { [id: string]: A }>(\n      object: void | null,\n      predicate?: ?OPredicate<A, T>\n    ): void;\n    findLastKey<A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): string | void;\n    findLastKey<A, T: { [id: string]: A }>(\n      object: void | null,\n      predicate?: ?OPredicate<A, T>\n    ): void;\n    forIn(object: Object, iteratee?: ?OIteratee<*>): Object;\n    forIn(object: void | null, iteratee?: ?OIteratee<*>): null;\n    forInRight(object: Object, iteratee?: ?OIteratee<*>): Object;\n    forInRight(object: void | null, iteratee?: ?OIteratee<*>): null;\n    forOwn(object: Object, iteratee?: ?OIteratee<*>): Object;\n    forOwn(object: void | null, iteratee?: ?OIteratee<*>): null;\n    forOwnRight(object: Object, iteratee?: ?OIteratee<*>): Object;\n    forOwnRight(object: void | null, iteratee?: ?OIteratee<*>): null;\n    functions(object?: ?Object): Array<string>;\n    functionsIn(object?: ?Object): Array<string>;\n    get(\n      object?: ?Object | ?Array<any>,\n      path?: ?Array<string> | string,\n      defaultValue?: any\n    ): any;\n    has(object: Object, path: Array<string> | string): boolean;\n    has(object: Object, path: void | null): false;\n    has(object: void | null, path?: ?Array<string> | ?string): false;\n    hasIn(object: Object, path: Array<string> | string): boolean;\n    hasIn(object: Object, path: void | null): false;\n    hasIn(object: void | null, path?: ?Array<string> | ?string): false;\n    invert(object: Object, multiVal?: ?boolean): Object;\n    invert(object: void | null, multiVal?: ?boolean): {};\n    invertBy(object: Object, iteratee?: ?Function): Object;\n    invertBy(object: void | null, iteratee?: ?Function): {};\n    invoke(\n      object?: ?Object,\n      path?: ?Array<string> | string,\n      ...args?: Array<any>\n    ): any;\n    keys<K>(object?: ?{ [key: K]: any }): Array<K>;\n    keys(object?: ?Object): Array<string>;\n    keysIn(object?: ?Object): Array<string>;\n    mapKeys(object: Object, iteratee?: ?OIteratee<*>): Object;\n    mapKeys(object: void | null, iteratee?: ?OIteratee<*>): {};\n    mapValues(object: Object, iteratee?: ?OIteratee<*>): Object;\n    mapValues(object: void | null, iteratee?: ?OIteratee<*>): {};\n    merge(object?: ?Object, ...sources?: Array<?Object>): Object;\n    mergeWith(): {};\n    mergeWith<T: Object, A: Object>(\n      object: T,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): Object;\n    mergeWith<T: Object, A: Object, B: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void\n    ): Object;\n    mergeWith<T: Object, A: Object, B: Object, C: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C\n      ) => any | void\n    ): Object;\n    mergeWith<T: Object, A: Object, B: Object, C: Object, D: Object>(\n      object: T,\n      s1: A,\n      s2: B,\n      s3: C,\n      s4: D,\n      customizer?: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B | C | D\n      ) => any | void\n    ): Object;\n    omit(object?: ?Object, ...props: Array<string>): Object;\n    omit(object?: ?Object, props: Array<string>): Object;\n    omitBy<A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): Object;\n    omitBy<A, T: void | null>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): {};\n    pick(object?: ?Object, ...props: Array<string>): Object;\n    pick(object?: ?Object, props: Array<string>): Object;\n    pickBy<A, T: { [id: string]: A }>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): Object;\n    pickBy<A, T: void | null>(\n      object: T,\n      predicate?: ?OPredicate<A, T>\n    ): {};\n    result(\n      object?: ?Object,\n      path?: ?Array<string> | string,\n      defaultValue?: any\n    ): any;\n    set(object: Object, path?: ?Array<string> | string, value: any): Object;\n    set<T: void | null>(\n      object: T,\n      path?: ?Array<string> | string,\n      value?: ?any): T;\n    setWith<T>(\n      object: T,\n      path?: ?Array<string> | string,\n      value: any,\n      customizer?: (nsValue: any, key: string, nsObject: T) => any\n    ): Object;\n    setWith<T: void | null>(\n      object: T,\n      path?: ?Array<string> | string,\n      value?: ?any,\n      customizer?: ?(nsValue: any, key: string, nsObject: T) => any\n    ): T;\n    toPairs(object?: ?Object | Array<*>): Array<[string, any]>;\n    toPairsIn(object?: ?Object): Array<[string, any]>;\n    transform(\n      collection: Object | $ReadOnlyArray<any>,\n      iteratee?: ?OIteratee<*>,\n      accumulator?: any\n    ): any;\n    transform(\n      collection: void | null,\n      iteratee?: ?OIteratee<*>,\n      accumulator?: ?any\n    ): {};\n    unset(object: Object, path?: ?Array<string> | ?string): boolean;\n    unset(object: void | null, path?: ?Array<string> | ?string): true;\n    update(object: Object, path: string[] | string, updater: Function): Object;\n    update<T: void | null>(\n      object: T,\n      path?: ?string[] | ?string,\n      updater?: ?Function): T;\n    updateWith(\n      object: Object,\n      path?: ?string[] | ?string,\n      updater?: ?Function,\n      customizer?: ?Function\n    ): Object;\n    updateWith<T: void | null>(\n      object: T,\n      path?: ?string[] | ?string,\n      updater?: ?Function,\n      customizer?: ?Function\n    ): T;\n    values(object?: ?Object): Array<any>;\n    valuesIn(object?: ?Object): Array<any>;\n\n    // Seq\n    // harder to read, but this is _()\n    (value: any): any;\n    chain<T>(value: T): any;\n    tap<T>(value: T, interceptor: (value: T) => any): T;\n    thru<T1, T2>(value: T1, interceptor: (value: T1) => T2): T2;\n    // TODO: _.prototype.*\n\n    // String\n    camelCase(string: string): string;\n    camelCase(string: void | null): '';\n    capitalize(string: string): string;\n    capitalize(string: void | null): '';\n    deburr(string: string): string;\n    deburr(string: void | null): '';\n    endsWith(string: string, target?: string, position?: ?number): boolean;\n    endsWith(string: void | null, target?: ?string, position?: ?number): false;\n    escape(string: string): string;\n    escape(string: void | null): '';\n    escapeRegExp(string: string): string;\n    escapeRegExp(string: void | null): '';\n    kebabCase(string: string): string;\n    kebabCase(string: void | null): '';\n    lowerCase(string: string): string;\n    lowerCase(string: void | null): '';\n    lowerFirst(string: string): string;\n    lowerFirst(string: void | null): '';\n    pad(string?: ?string, length?: ?number, chars?: ?string): string;\n    padEnd(string?: ?string, length?: ?number, chars?: ?string): string;\n    padStart(string?: ?string, length?: ?number, chars?: ?string): string;\n    parseInt(string: string, radix?: ?number): number;\n    repeat(string: string, n?: ?number): string;\n    repeat(string: void | null, n?: ?number): '';\n    replace(\n      string: string,\n      pattern: RegExp | string,\n      replacement: ((string: string) => string) | string\n    ): string;\n    replace(\n      string: void | null,\n      pattern?: ?RegExp | ?string,\n      replacement: ?((string: string) => string) | ?string\n    ): '';\n    snakeCase(string: string): string;\n    snakeCase(string: void | null): '';\n    split(\n      string?: ?string,\n      separator?: ?RegExp | ?string,\n      limit?: ?number\n    ): Array<string>;\n    startCase(string: string): string;\n    startCase(string: void | null): '';\n    startsWith(string: string, target?: string, position?: number): boolean;\n    startsWith(string: void | null, target?: ?string, position?: ?number): false;\n    template(string?: ?string, options?: ?TemplateSettings): Function;\n    toLower(string: string): string;\n    toLower(string: void | null): '';\n    toUpper(string: string): string;\n    toUpper(string: void | null): '';\n    trim(string: string, chars?: string): string;\n    trim(string: void | null, chars?: ?string): '';\n    trimEnd(string: string, chars?: ?string): string;\n    trimEnd(string: void | null, chars?: ?string): '';\n    trimStart(string: string, chars?: ?string): string;\n    trimStart(string: void | null, chars?: ?string): '';\n    truncate(string: string, options?: TruncateOptions): string;\n    truncate(string: void | null, options?: ?TruncateOptions): '';\n    unescape(string: string): string;\n    unescape(string: void | null): '';\n    upperCase(string: string): string;\n    upperCase(string: void | null): '';\n    upperFirst(string: string): string;\n    upperFirst(string: void | null): '';\n    words(string?: ?string, pattern?: ?RegExp | ?string): Array<string>;\n\n    // Util\n    attempt(func: Function, ...args: Array<any>): any;\n    bindAll(object: Object, methodNames?: ?Array<string>): Object;\n    bindAll<T: void | null>(object: T, methodNames?: ?Array<string>): T;\n    bindAll(object: Object, ...methodNames: Array<string>): Object;\n    cond(pairs?: ?NestedArray<Function>): Function;\n    conforms(source?: ?Object): Function;\n    constant<T>(value: T): () => T;\n    defaultTo<T1: string | boolean | Object, T2>(\n      value: T1,\n      defaultValue: T2\n    ): T1;\n    // NaN is a number instead of its own type, otherwise it would behave like null/void\n    defaultTo<T1: number, T2>(value: T1, defaultValue: T2): T1 | T2;\n    defaultTo<T1: void | null, T2>(value: T1, defaultValue: T2): T2;\n    flow: ($ComposeReverse & (funcs: Array<Function>) => Function);\n    flowRight: ($Compose & (funcs: Array<Function>) => Function);\n    identity<T>(value: T): T;\n    iteratee(func?: any): Function;\n    matches(source?: ?Object): Function;\n    matchesProperty(path?: ?Array<string> | string, srcValue: any): Function;\n    method(path?: ?Array<string> | string, ...args?: Array<any>): Function;\n    methodOf(object?: ?Object, ...args?: Array<any>): Function;\n    mixin<T: Function | Object>(\n      object?: T,\n      source: Object,\n      options?: { chain: boolean }\n    ): T;\n    noConflict(): Lodash;\n    noop(...args: Array<mixed>): void;\n    nthArg(n?: ?number): Function;\n    over(...iteratees: Array<Function>): Function;\n    over(iteratees: Array<Function>): Function;\n    overEvery(...predicates: Array<Function>): Function;\n    overEvery(predicates: Array<Function>): Function;\n    overSome(...predicates: Array<Function>): Function;\n    overSome(predicates: Array<Function>): Function;\n    property(path?: ?Array<string> | string): Function;\n    propertyOf(object?: ?Object): Function;\n    range(start: number, end: number, step?: number): Array<number>;\n    range(end: number, step?: number): Array<number>;\n    rangeRight(start?: ?number, end?: ?number, step?: ?number): Array<number>;\n    rangeRight(end?: ?number, step?: ?number): Array<number>;\n    runInContext(context?: ?Object): Function;\n\n    stubArray(): Array<*>;\n    stubFalse(): false;\n    stubObject(): {};\n    stubString(): \"\";\n    stubTrue(): true;\n    times(n?: ?number, ...rest?: Array<void | null>): Array<number>;\n    times<T>(n: number, iteratee: (i: number) => T): Array<T>;\n    toPath(value: any): Array<string>;\n    uniqueId(prefix?: ?string): string;\n\n    // Properties\n    VERSION: string;\n    templateSettings: TemplateSettings;\n  }\n\n  declare module.exports: Lodash;\n}\n\ndeclare module \"lodash/fp\" {\n  declare type __CurriedFunction1<A, R, AA: A> = (...r: [AA]) => R;\n  declare type CurriedFunction1<A, R> = __CurriedFunction1<A, R, *>;\n\n  declare type __CurriedFunction2<A, B, R, AA: A, BB: B> = ((\n    ...r: [AA]\n  ) => CurriedFunction1<BB, R>) &\n    ((...r: [AA, BB]) => R);\n  declare type CurriedFunction2<A, B, R> = __CurriedFunction2<A, B, R, *, *>;\n\n  declare type __CurriedFunction3<A, B, C, R, AA: A, BB: B, CC: C> = ((\n    ...r: [AA]\n  ) => CurriedFunction2<BB, CC, R>) &\n    ((...r: [AA, BB]) => CurriedFunction1<CC, R>) &\n    ((...r: [AA, BB, CC]) => R);\n  declare type CurriedFunction3<A, B, C, R> = __CurriedFunction3<\n    A,\n    B,\n    C,\n    R,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction4<\n    A,\n    B,\n    C,\n    D,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D\n  > = ((...r: [AA]) => CurriedFunction3<BB, CC, DD, R>) &\n    ((...r: [AA, BB]) => CurriedFunction2<CC, DD, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction1<DD, R>) &\n    ((...r: [AA, BB, CC, DD]) => R);\n  declare type CurriedFunction4<A, B, C, D, R> = __CurriedFunction4<\n    A,\n    B,\n    C,\n    D,\n    R,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction5<\n    A,\n    B,\n    C,\n    D,\n    E,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D,\n    EE: E\n  > = ((...r: [AA]) => CurriedFunction4<BB, CC, DD, EE, R>) &\n    ((...r: [AA, BB]) => CurriedFunction3<CC, DD, EE, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction2<DD, EE, R>) &\n    ((...r: [AA, BB, CC, DD]) => CurriedFunction1<EE, R>) &\n    ((...r: [AA, BB, CC, DD, EE]) => R);\n  declare type CurriedFunction5<A, B, C, D, E, R> = __CurriedFunction5<\n    A,\n    B,\n    C,\n    D,\n    E,\n    R,\n    *,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type __CurriedFunction6<\n    A,\n    B,\n    C,\n    D,\n    E,\n    F,\n    R,\n    AA: A,\n    BB: B,\n    CC: C,\n    DD: D,\n    EE: E,\n    FF: F\n  > = ((...r: [AA]) => CurriedFunction5<BB, CC, DD, EE, FF, R>) &\n    ((...r: [AA, BB]) => CurriedFunction4<CC, DD, EE, FF, R>) &\n    ((...r: [AA, BB, CC]) => CurriedFunction3<DD, EE, FF, R>) &\n    ((...r: [AA, BB, CC, DD]) => CurriedFunction2<EE, FF, R>) &\n    ((...r: [AA, BB, CC, DD, EE]) => CurriedFunction1<FF, R>) &\n    ((...r: [AA, BB, CC, DD, EE, FF]) => R);\n  declare type CurriedFunction6<A, B, C, D, E, F, R> = __CurriedFunction6<\n    A,\n    B,\n    C,\n    D,\n    E,\n    F,\n    R,\n    *,\n    *,\n    *,\n    *,\n    *,\n    *\n  >;\n\n  declare type Curry = (<A, R>((...r: [A]) => R) => CurriedFunction1<A, R>) &\n    (<A, B, R>((...r: [A, B]) => R) => CurriedFunction2<A, B, R>) &\n    (<A, B, C, R>((...r: [A, B, C]) => R) => CurriedFunction3<A, B, C, R>) &\n    (<A, B, C, D, R>(\n      (...r: [A, B, C, D]) => R\n    ) => CurriedFunction4<A, B, C, D, R>) &\n    (<A, B, C, D, E, R>(\n      (...r: [A, B, C, D, E]) => R\n    ) => CurriedFunction5<A, B, C, D, E, R>) &\n    (<A, B, C, D, E, F, R>(\n      (...r: [A, B, C, D, E, F]) => R\n    ) => CurriedFunction6<A, B, C, D, E, F, R>);\n\n  declare type UnaryFn<A, R> = (a: A) => R;\n\n  declare type TemplateSettings = {\n    escape?: RegExp,\n    evaluate?: RegExp,\n    imports?: Object,\n    interpolate?: RegExp,\n    variable?: string\n  };\n\n  declare type TruncateOptions = {\n    length?: number,\n    omission?: string,\n    separator?: RegExp | string\n  };\n\n  declare type DebounceOptions = {\n    leading?: boolean,\n    maxWait?: number,\n    trailing?: boolean\n  };\n\n  declare type ThrottleOptions = {\n    leading?: boolean,\n    trailing?: boolean\n  };\n\n  declare type NestedArray<T> = Array<Array<T>>;\n\n  declare type matchesIterateeShorthand = Object;\n  declare type matchesPropertyIterateeShorthand = [string, any];\n  declare type propertyIterateeShorthand = string;\n\n  declare type OPredicate<A> =\n    | ((value: A) => any)\n    | matchesIterateeShorthand\n    | matchesPropertyIterateeShorthand\n    | propertyIterateeShorthand;\n\n  declare type OIterateeWithResult<V, R> = Object | string | ((value: V) => R);\n  declare type OIteratee<O> = OIterateeWithResult<any, any>;\n  declare type OFlatMapIteratee<T, U> = OIterateeWithResult<any, Array<U>>;\n\n  declare type Predicate<T> =\n    | ((value: T) => any)\n    | matchesIterateeShorthand\n    | matchesPropertyIterateeShorthand\n    | propertyIterateeShorthand;\n\n  declare type _ValueOnlyIteratee<T> = (value: T) => mixed;\n  declare type ValueOnlyIteratee<T> = _ValueOnlyIteratee<T> | string;\n  declare type _Iteratee<T> = (item: T) => mixed;\n  declare type Iteratee<T> = _Iteratee<T> | Object | string;\n  declare type FlatMapIteratee<T, U> =\n    | ((item: T) => Array<U>)\n    | Object\n    | string;\n  declare type Comparator<T> = (item: T, item2: T) => boolean;\n\n  declare type MapIterator<T, U> = ((item: T) => U) | propertyIterateeShorthand;\n\n  declare type OMapIterator<T, U> =\n    | ((item: T) => U)\n    | propertyIterateeShorthand;\n\n  declare class Lodash {\n    // Array\n    chunk<T>(size: number): (array: Array<T>) => Array<Array<T>>;\n    chunk<T>(size: number, array: Array<T>): Array<Array<T>>;\n    compact<T, N: T>(array: Array<N>): Array<T>;\n    concat<T, U, A: Array<T> | T, B: Array<U> | U>(\n      base: A\n    ): (elements: B) => Array<T | U>;\n    concat<T, U, A: Array<T> | T, B: Array<U> | U>(\n      base: A,\n      elements: B\n    ): Array<T | U>;\n    difference<T>(values: $ReadOnlyArray<T>): (array: $ReadOnlyArray<T>) => T[];\n    difference<T>(values: $ReadOnlyArray<T>, array: $ReadOnlyArray<T>): T[];\n    differenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((values: $ReadOnlyArray<T>) => (array: $ReadOnlyArray<T>) => T[]) &\n      ((values: $ReadOnlyArray<T>, array: $ReadOnlyArray<T>) => T[]);\n    differenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      values: $ReadOnlyArray<T>\n    ): (array: $ReadOnlyArray<T>) => T[];\n    differenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      values: $ReadOnlyArray<T>,\n      array: $ReadOnlyArray<T>\n    ): T[];\n    differenceWith<T>(\n      values: $ReadOnlyArray<T>\n    ): ((comparator: Comparator<T>) => (array: $ReadOnlyArray<T>) => T[]) &\n      ((comparator: Comparator<T>, array: $ReadOnlyArray<T>) => T[]);\n    differenceWith<T>(\n      values: $ReadOnlyArray<T>,\n      comparator: Comparator<T>\n    ): (array: $ReadOnlyArray<T>) => T[];\n    differenceWith<T>(values: $ReadOnlyArray<T>, comparator: Comparator<T>, array: $ReadOnlyArray<T>): T[];\n    drop<T>(n: number): (array: Array<T>) => Array<T>;\n    drop<T>(n: number, array: Array<T>): Array<T>;\n    dropLast<T>(n: number): (array: Array<T>) => Array<T>;\n    dropLast<T>(n: number, array: Array<T>): Array<T>;\n    dropRight<T>(n: number): (array: Array<T>) => Array<T>;\n    dropRight<T>(n: number, array: Array<T>): Array<T>;\n    dropRightWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    dropRightWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    dropWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    dropWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    dropLastWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    dropLastWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    fill<T, U>(\n      start: number\n    ): ((\n      end: number\n    ) => ((value: U) => (array: Array<T>) => Array<T | U>) &\n      ((value: U, array: Array<T>) => Array<T | U>)) &\n      ((end: number, value: U) => (array: Array<T>) => Array<T | U>) &\n      ((end: number, value: U, array: Array<T>) => Array<T | U>);\n    fill<T, U>(\n      start: number,\n      end: number\n    ): ((value: U) => (array: Array<T>) => Array<T | U>) &\n      ((value: U, array: Array<T>) => Array<T | U>);\n    fill<T, U>(\n      start: number,\n      end: number,\n      value: U\n    ): (array: Array<T>) => Array<T | U>;\n    fill<T, U>(\n      start: number,\n      end: number,\n      value: U,\n      array: Array<T>\n    ): Array<T | U>;\n    findIndex<T>(predicate: Predicate<T>): (array: $ReadOnlyArray<T>) => number;\n    findIndex<T>(predicate: Predicate<T>, array: $ReadOnlyArray<T>): number;\n    findIndexFrom<T>(\n      predicate: Predicate<T>\n    ): ((fromIndex: number) => (array: $ReadOnlyArray<T>) => number) &\n      ((fromIndex: number, array: $ReadOnlyArray<T>) => number);\n    findIndexFrom<T>(\n      predicate: Predicate<T>,\n      fromIndex: number\n    ): (array: $ReadOnlyArray<T>) => number;\n    findIndexFrom<T>(\n      predicate: Predicate<T>,\n      fromIndex: number,\n      array: $ReadOnlyArray<T>\n    ): number;\n    findLastIndex<T>(\n      predicate: Predicate<T>\n    ): (array: $ReadOnlyArray<T>) => number;\n    findLastIndex<T>(predicate: Predicate<T>, array: $ReadOnlyArray<T>): number;\n    findLastIndexFrom<T>(\n      predicate: Predicate<T>\n    ): ((fromIndex: number) => (array: $ReadOnlyArray<T>) => number) &\n      ((fromIndex: number, array: $ReadOnlyArray<T>) => number);\n    findLastIndexFrom<T>(\n      predicate: Predicate<T>,\n      fromIndex: number\n    ): (array: $ReadOnlyArray<T>) => number;\n    findLastIndexFrom<T>(\n      predicate: Predicate<T>,\n      fromIndex: number,\n      array: $ReadOnlyArray<T>\n    ): number;\n    // alias of _.head\n    first<T>(array: Array<T>): T;\n    flatten<T, X>(array: Array<Array<T> | X>): Array<T | X>;\n    unnest<T, X>(array: Array<Array<T> | X>): Array<T | X>;\n    flattenDeep<T>(array: any[]): Array<T>;\n    flattenDepth(depth: number): (array: any[]) => any[];\n    flattenDepth(depth: number, array: any[]): any[];\n    fromPairs<A, B>(pairs: Array<[A, B]>): { [key: A]: B };\n    head<T>(array: Array<T>): T;\n    indexOf<T>(value: T): (array: Array<T>) => number;\n    indexOf<T>(value: T, array: Array<T>): number;\n    indexOfFrom<T>(\n      value: T\n    ): ((fromIndex: number) => (array: Array<T>) => number) &\n      ((fromIndex: number, array: Array<T>) => number);\n    indexOfFrom<T>(value: T, fromIndex: number): (array: Array<T>) => number;\n    indexOfFrom<T>(value: T, fromIndex: number, array: Array<T>): number;\n    initial<T>(array: Array<T>): Array<T>;\n    init<T>(array: Array<T>): Array<T>;\n    intersection<T>(a1: Array<T>): (a2: Array<T>) => Array<T>;\n    intersection<T>(a1: Array<T>, a2: Array<T>): Array<T>;\n    intersectionBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    intersectionBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    intersectionBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    intersectionWith<T>(\n      comparator: Comparator<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    intersectionWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    intersectionWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    join<T>(separator: string): (array: Array<T>) => string;\n    join<T>(separator: string, array: Array<T>): string;\n    last<T>(array: Array<T>): T;\n    lastIndexOf<T>(value: T): (array: Array<T>) => number;\n    lastIndexOf<T>(value: T, array: Array<T>): number;\n    lastIndexOfFrom<T>(\n      value: T\n    ): ((fromIndex: number) => (array: Array<T>) => number) &\n      ((fromIndex: number, array: Array<T>) => number);\n    lastIndexOfFrom<T>(\n      value: T,\n      fromIndex: number\n    ): (array: Array<T>) => number;\n    lastIndexOfFrom<T>(value: T, fromIndex: number, array: Array<T>): number;\n    nth<T>(n: number): (array: T[]) => T;\n    nth<T>(n: number, array: T[]): T;\n    pull<T>(value: T): (array: Array<T>) => Array<T>;\n    pull<T>(value: T, array: Array<T>): Array<T>;\n    pullAll<T>(values: Array<T>): (array: Array<T>) => Array<T>;\n    pullAll<T>(values: Array<T>, array: Array<T>): Array<T>;\n    pullAllBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((values: Array<T>) => (array: Array<T>) => Array<T>) &\n      ((values: Array<T>, array: Array<T>) => Array<T>);\n    pullAllBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      values: Array<T>\n    ): (array: Array<T>) => Array<T>;\n    pullAllBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      values: Array<T>,\n      array: Array<T>\n    ): Array<T>;\n    pullAllWith<T>(\n      comparator: Function\n    ): ((values: T[]) => (array: T[]) => T[]) &\n      ((values: T[], array: T[]) => T[]);\n    pullAllWith<T>(comparator: Function, values: T[]): (array: T[]) => T[];\n    pullAllWith<T>(comparator: Function, values: T[], array: T[]): T[];\n    pullAt<T>(indexed: Array<number>): (array: Array<T>) => Array<T>;\n    pullAt<T>(indexed: Array<number>, array: Array<T>): Array<T>;\n    remove<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    remove<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    reverse<T>(array: Array<T>): Array<T>;\n    slice<T>(\n      start: number\n    ): ((end: number) => (array: Array<T>) => Array<T>) &\n      ((end: number, array: Array<T>) => Array<T>);\n    slice<T>(start: number, end: number): (array: Array<T>) => Array<T>;\n    slice<T>(start: number, end: number, array: Array<T>): Array<T>;\n    sortedIndex<T>(value: T): (array: Array<T>) => number;\n    sortedIndex<T>(value: T, array: Array<T>): number;\n    sortedIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((value: T) => (array: Array<T>) => number) &\n      ((value: T, array: Array<T>) => number);\n    sortedIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      value: T\n    ): (array: Array<T>) => number;\n    sortedIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      value: T,\n      array: Array<T>\n    ): number;\n    sortedIndexOf<T>(value: T): (array: Array<T>) => number;\n    sortedIndexOf<T>(value: T, array: Array<T>): number;\n    sortedLastIndex<T>(value: T): (array: Array<T>) => number;\n    sortedLastIndex<T>(value: T, array: Array<T>): number;\n    sortedLastIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((value: T) => (array: Array<T>) => number) &\n      ((value: T, array: Array<T>) => number);\n    sortedLastIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      value: T\n    ): (array: Array<T>) => number;\n    sortedLastIndexBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      value: T,\n      array: Array<T>\n    ): number;\n    sortedLastIndexOf<T>(value: T): (array: Array<T>) => number;\n    sortedLastIndexOf<T>(value: T, array: Array<T>): number;\n    sortedUniq<T>(array: Array<T>): Array<T>;\n    sortedUniqBy<T>(\n      iteratee: (value: T) => mixed\n    ): (array: Array<T>) => Array<T>;\n    sortedUniqBy<T>(iteratee: (value: T) => mixed, array: Array<T>): Array<T>;\n    tail<T>(array: Array<T>): Array<T>;\n    take<T>(n: number): (array: Array<T>) => Array<T>;\n    take<T>(n: number, array: Array<T>): Array<T>;\n    takeRight<T>(n: number): (array: Array<T>) => Array<T>;\n    takeRight<T>(n: number, array: Array<T>): Array<T>;\n    takeLast<T>(n: number): (array: Array<T>) => Array<T>;\n    takeLast<T>(n: number, array: Array<T>): Array<T>;\n    takeRightWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    takeRightWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    takeLastWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    takeLastWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    takeWhile<T>(predicate: Predicate<T>): (array: Array<T>) => Array<T>;\n    takeWhile<T>(predicate: Predicate<T>, array: Array<T>): Array<T>;\n    union<T>(a1: Array<T>): (a2: Array<T>) => Array<T>;\n    union<T>(a1: Array<T>, a2: Array<T>): Array<T>;\n    unionBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    unionBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    unionBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    unionWith<T>(\n      comparator: Comparator<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    unionWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    unionWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    uniq<T>(array: Array<T>): Array<T>;\n    uniqBy<T>(iteratee: ValueOnlyIteratee<T>): (array: Array<T>) => Array<T>;\n    uniqBy<T>(iteratee: ValueOnlyIteratee<T>, array: Array<T>): Array<T>;\n    uniqWith<T>(comparator: Comparator<T>): (array: Array<T>) => Array<T>;\n    uniqWith<T>(comparator: Comparator<T>, array: Array<T>): Array<T>;\n    unzip<T>(array: Array<T>): Array<T>;\n    unzipWith<T>(iteratee: Iteratee<T>): (array: Array<T>) => Array<T>;\n    unzipWith<T>(iteratee: Iteratee<T>, array: Array<T>): Array<T>;\n    without<T>(values: Array<T>): (array: Array<T>) => Array<T>;\n    without<T>(values: Array<T>, array: Array<T>): Array<T>;\n    xor<T>(a1: Array<T>): (a2: Array<T>) => Array<T>;\n    xor<T>(a1: Array<T>, a2: Array<T>): Array<T>;\n    symmetricDifference<T>(a1: Array<T>): (a2: Array<T>) => Array<T>;\n    symmetricDifference<T>(a1: Array<T>, a2: Array<T>): Array<T>;\n    xorBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    xorBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    xorBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    symmetricDifferenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    symmetricDifferenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    symmetricDifferenceBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    xorWith<T>(\n      comparator: Comparator<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    xorWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    xorWith<T>(comparator: Comparator<T>, a1: Array<T>, a2: Array<T>): Array<T>;\n    symmetricDifferenceWith<T>(\n      comparator: Comparator<T>\n    ): ((a1: Array<T>) => (a2: Array<T>) => Array<T>) &\n      ((a1: Array<T>, a2: Array<T>) => Array<T>);\n    symmetricDifferenceWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>\n    ): (a2: Array<T>) => Array<T>;\n    symmetricDifferenceWith<T>(\n      comparator: Comparator<T>,\n      a1: Array<T>,\n      a2: Array<T>\n    ): Array<T>;\n    zip<A, B>(a1: A[]): (a2: B[]) => Array<[A, B]>;\n    zip<A, B>(a1: A[], a2: B[]): Array<[A, B]>;\n    zipAll(arrays: Array<Array<any>>): Array<any>;\n    zipObject<K, V>(props?: Array<K>): (values?: Array<V>) => { [key: K]: V };\n    zipObject<K, V>(props?: Array<K>, values?: Array<V>): { [key: K]: V };\n    zipObj(props: Array<any>): (values: Array<any>) => Object;\n    zipObj(props: Array<any>, values: Array<any>): Object;\n    zipObjectDeep(props: any[]): (values: any) => Object;\n    zipObjectDeep(props: any[], values: any): Object;\n    zipWith<T>(\n      iteratee: Iteratee<T>\n    ): ((a1: NestedArray<T>) => (a2: NestedArray<T>) => Array<T>) &\n      ((a1: NestedArray<T>, a2: NestedArray<T>) => Array<T>);\n    zipWith<T>(\n      iteratee: Iteratee<T>,\n      a1: NestedArray<T>\n    ): (a2: NestedArray<T>) => Array<T>;\n    zipWith<T>(\n      iteratee: Iteratee<T>,\n      a1: NestedArray<T>,\n      a2: NestedArray<T>\n    ): Array<T>;\n    // Collection\n    countBy<T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => { [string]: number };\n    countBy<T>(\n      iteratee: ValueOnlyIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): { [string]: number };\n    // alias of _.forEach\n    each<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    each<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    // alias of _.forEachRight\n    eachRight<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    eachRight<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    every<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => boolean;\n    every<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): boolean;\n    all<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => boolean;\n    all<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): boolean;\n    filter<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    filter<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    find<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => T | void;\n    find<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): T | void;\n    findFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): ((\n      fromIndex: number\n    ) => (collection: $ReadOnlyArray<T> | { [id: any]: T }) => T | void) &\n      ((\n        fromIndex: number,\n        collection: $ReadOnlyArray<T> | { [id: any]: T }\n      ) => T | void);\n    findFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      fromIndex: number\n    ): (collection: Array<T> | { [id: any]: T }) => T | void;\n    findFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      fromIndex: number,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): T | void;\n    findLast<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => T | void;\n    findLast<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): T | void;\n    findLastFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): ((\n      fromIndex: number\n    ) => (collection: $ReadOnlyArray<T> | { [id: any]: T }) => T | void) &\n      ((\n        fromIndex: number,\n        collection: $ReadOnlyArray<T> | { [id: any]: T }\n      ) => T | void);\n    findLastFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      fromIndex: number\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => T | void;\n    findLastFrom<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      fromIndex: number,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): T | void;\n    flatMap<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<U>;\n    flatMap<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<U>;\n    flatMapDeep<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<U>;\n    flatMapDeep<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<U>;\n    flatMapDepth<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>\n    ): ((\n      depth: number\n    ) => (collection: Array<T> | { [id: any]: T }) => Array<U>) &\n      ((depth: number, collection: Array<T> | { [id: any]: T }) => Array<U>);\n    flatMapDepth<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>,\n      depth: number\n    ): (collection: Array<T> | { [id: any]: T }) => Array<U>;\n    flatMapDepth<T, U>(\n      iteratee: FlatMapIteratee<T, U> | OFlatMapIteratee<T, U>,\n      depth: number,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<U>;\n    forEach<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    forEach<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    forEachRight<T>(\n      iteratee: Iteratee<T> | OIteratee<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    forEachRight<T>(\n      iteratee: Iteratee<T> | OIteratee<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    groupBy<V, T>(\n      iteratee: ValueOnlyIteratee<T>\n    ): (\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ) => { [key: V]: Array<T> };\n    groupBy<V, T>(\n      iteratee: ValueOnlyIteratee<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): { [key: V]: Array<T> };\n    includes<T>(value: T): (collection: Array<T> | { [id: any]: T }) => boolean;\n    includes<T>(value: T, collection: Array<T> | { [id: any]: T }): boolean;\n    includes(value: string): (str: string) => boolean;\n    includes(value: string, str: string): boolean;\n    contains(value: string): (str: string) => boolean;\n    contains(value: string, str: string): boolean;\n    contains<T>(value: T): (collection: Array<T> | { [id: any]: T }) => boolean;\n    contains<T>(value: T, collection: Array<T> | { [id: any]: T }): boolean;\n    includesFrom(\n      value: string\n    ): ((fromIndex: number) => (str: string) => boolean) &\n      ((fromIndex: number, str: string) => boolean);\n    includesFrom(value: string, fromIndex: number): (str: string) => boolean;\n    includesFrom(value: string, fromIndex: number, str: string): boolean;\n    includesFrom<T>(\n      value: T\n    ): ((fromIndex: number) => (collection: Array<T>) => boolean) &\n      ((fromIndex: number, collection: Array<T>) => boolean);\n    includesFrom<T>(\n      value: T,\n      fromIndex: number\n    ): (collection: Array<T>) => boolean;\n    includesFrom<T>(value: T, fromIndex: number, collection: Array<T>): boolean;\n    invokeMap<T>(\n      path: ((value: T) => Array<string> | string) | Array<string> | string\n    ): (collection: Array<T> | { [id: any]: T }) => Array<any>;\n    invokeMap<T>(\n      path: ((value: T) => Array<string> | string) | Array<string> | string,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<any>;\n    invokeArgsMap<T>(\n      path: ((value: T) => Array<string> | string) | Array<string> | string\n    ): ((\n      collection: Array<T> | { [id: any]: T }\n    ) => (args: Array<any>) => Array<any>) &\n      ((\n        collection: Array<T> | { [id: any]: T },\n        args: Array<any>\n      ) => Array<any>);\n    invokeArgsMap<T>(\n      path: ((value: T) => Array<string> | string) | Array<string> | string,\n      collection: Array<T> | { [id: any]: T }\n    ): (args: Array<any>) => Array<any>;\n    invokeArgsMap<T>(\n      path: ((value: T) => Array<string> | string) | Array<string> | string,\n      collection: Array<T> | { [id: any]: T },\n      args: Array<any>\n    ): Array<any>;\n    keyBy<T, V>(\n      iteratee: ValueOnlyIteratee<T>\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => { [key: V]: T };\n    keyBy<T, V>(\n      iteratee: ValueOnlyIteratee<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): { [key: V]: T };\n    indexBy<T, V>(\n      iteratee: ValueOnlyIteratee<T>\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => { [key: V]: T };\n    indexBy<T, V>(\n      iteratee: ValueOnlyIteratee<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): { [key: V]: T };\n    map<T, U>(\n      iteratee: MapIterator<T, U> | OMapIterator<T, U>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<U>;\n    map<T, U>(\n      iteratee: MapIterator<T, U> | OMapIterator<T, U>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<U>;\n    map(iteratee: (char: string) => any): (str: string) => string;\n    map(iteratee: (char: string) => any, str: string): string;\n    pluck<T, U>(\n      iteratee: MapIterator<T, U> | OMapIterator<T, U>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<U>;\n    pluck<T, U>(\n      iteratee: MapIterator<T, U> | OMapIterator<T, U>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<U>;\n    pluck(iteratee: (char: string) => any): (str: string) => string;\n    pluck(iteratee: (char: string) => any, str: string): string;\n    orderBy<T>(\n      iteratees: $ReadOnlyArray<Iteratee<T> | OIteratee<*>> | string\n    ): ((\n      orders: $ReadOnlyArray<\"asc\" | \"desc\"> | string\n    ) => (collection: $ReadOnlyArray<T> | { [id: any]: T }) => Array<T>) &\n      ((\n        orders: $ReadOnlyArray<\"asc\" | \"desc\"> | string,\n        collection: $ReadOnlyArray<T> | { [id: any]: T }\n      ) => Array<T>);\n    orderBy<T>(\n      iteratees: $ReadOnlyArray<Iteratee<T> | OIteratee<*>> | string,\n      orders: $ReadOnlyArray<\"asc\" | \"desc\"> | string\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => Array<T>;\n    orderBy<T>(\n      iteratees: $ReadOnlyArray<Iteratee<T> | OIteratee<*>> | string,\n      orders: $ReadOnlyArray<\"asc\" | \"desc\"> | string,\n      collection: $ReadOnlyArray<T> | { [id: any]: T }\n    ): Array<T>;\n    partition<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: Array<T> | { [id: any]: T }) => [Array<T>, Array<T>];\n    partition<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): [Array<T>, Array<T>];\n    reduce<T, U>(\n      iteratee: (accumulator: U, value: T) => U\n    ): ((accumulator: U) => (collection: Array<T> | { [id: any]: T }) => U) &\n      ((accumulator: U, collection: Array<T> | { [id: any]: T }) => U);\n    reduce<T, U>(\n      iteratee: (accumulator: U, value: T) => U,\n      accumulator: U\n    ): (collection: Array<T> | { [id: any]: T }) => U;\n    reduce<T, U>(\n      iteratee: (accumulator: U, value: T) => U,\n      accumulator: U,\n      collection: Array<T> | { [id: any]: T }\n    ): U;\n    reduceRight<T, U>(\n      iteratee: (value: T, accumulator: U) => U\n    ): ((accumulator: U) => (collection: Array<T> | { [id: any]: T }) => U) &\n      ((accumulator: U, collection: Array<T> | { [id: any]: T }) => U);\n    reduceRight<T, U>(\n      iteratee: (value: T, accumulator: U) => U,\n      accumulator: U\n    ): (collection: Array<T> | { [id: any]: T }) => U;\n    reduceRight<T, U>(\n      iteratee: (value: T, accumulator: U) => U,\n      accumulator: U,\n      collection: Array<T> | { [id: any]: T }\n    ): U;\n    reject<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    reject<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): Array<T>;\n    sample<T>(collection: Array<T> | { [id: any]: T }): T;\n    sampleSize<T>(\n      n: number\n    ): (collection: Array<T> | { [id: any]: T }) => Array<T>;\n    sampleSize<T>(n: number, collection: Array<T> | { [id: any]: T }): Array<T>;\n    shuffle<T>(collection: Array<T> | { [id: any]: T }): Array<T>;\n    size(collection: Array<any> | Object | string): number;\n    some<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: Array<T> | { [id: any]: T }) => boolean;\n    some<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): boolean;\n    any<T>(\n      predicate: Predicate<T> | OPredicate<T>\n    ): (collection: Array<T> | { [id: any]: T }) => boolean;\n    any<T>(\n      predicate: Predicate<T> | OPredicate<T>,\n      collection: Array<T> | { [id: any]: T }\n    ): boolean;\n    sortBy<T>(\n      iteratees: | $ReadOnlyArray<Iteratee<T> | OIteratee<T>>\n      | Iteratee<T>\n      | OIteratee<T>\n    ): (collection: $ReadOnlyArray<T> | { [id: any]: T }) => Array<T>;\n    sortBy<T>(\n      iteratees: | $ReadOnlyArray<Iteratee<T> | OIteratee<T>>\n      | Iteratee<T>\n      | OIteratee<T>,\n      collection: $ReadOnlyArray<T> | { [id: any]: T },\n    ): Array<T>;\n\n    // Date\n    now(): number;\n\n    // Function\n    after(fn: Function): (n: number) => Function;\n    after(fn: Function, n: number): Function;\n    ary(func: Function): Function;\n    nAry(n: number): (func: Function) => Function;\n    nAry(n: number, func: Function): Function;\n    before(fn: Function): (n: number) => Function;\n    before(fn: Function, n: number): Function;\n    bind(func: Function): (thisArg: any) => Function;\n    bind(func: Function, thisArg: any): Function;\n    bindKey(obj: Object): (key: string) => Function;\n    bindKey(obj: Object, key: string): Function;\n    curry: Curry;\n    curryN(arity: number): (func: Function) => Function;\n    curryN(arity: number, func: Function): Function;\n    curryRight(func: Function): Function;\n    curryRightN(arity: number): (func: Function) => Function;\n    curryRightN(arity: number, func: Function): Function;\n    debounce(wait: number): <F: Function>(func: F) => F;\n    debounce<F: Function>(wait: number, func: F): F;\n    defer(func: Function): TimeoutID;\n    delay(wait: number): (func: Function) => TimeoutID;\n    delay(wait: number, func: Function): TimeoutID;\n    flip(func: Function): Function;\n    memoize<F: Function>(func: F): F;\n    negate(predicate: Function): Function;\n    complement(predicate: Function): Function;\n    once(func: Function): Function;\n    overArgs(func: Function): (transforms: Array<Function>) => Function;\n    overArgs(func: Function, transforms: Array<Function>): Function;\n    useWith(func: Function): (transforms: Array<Function>) => Function;\n    useWith(func: Function, transforms: Array<Function>): Function;\n    partial(func: Function): (partials: any[]) => Function;\n    partial(func: Function, partials: any[]): Function;\n    partialRight(func: Function): (partials: Array<any>) => Function;\n    partialRight(func: Function, partials: Array<any>): Function;\n    rearg(indexes: Array<number>): (func: Function) => Function;\n    rearg(indexes: Array<number>, func: Function): Function;\n    rest(func: Function): Function;\n    unapply(func: Function): Function;\n    restFrom(start: number): (func: Function) => Function;\n    restFrom(start: number, func: Function): Function;\n    spread(func: Function): Function;\n    apply(func: Function): Function;\n    spreadFrom(start: number): (func: Function) => Function;\n    spreadFrom(start: number, func: Function): Function;\n    throttle(wait: number): (func: Function) => Function;\n    throttle(wait: number, func: Function): Function;\n    unary(func: Function): Function;\n    wrap(wrapper: Function): (value: any) => Function;\n    wrap(wrapper: Function, value: any): Function;\n\n    // Lang\n    castArray(value: *): any[];\n    clone<T>(value: T): T;\n    cloneDeep<T>(value: T): T;\n    cloneDeepWith<T, U>(\n      customizer: (value: T, key: number | string, object: T, stack: any) => U\n    ): (value: T) => U;\n    cloneDeepWith<T, U>(\n      customizer: (value: T, key: number | string, object: T, stack: any) => U,\n      value: T\n    ): U;\n    cloneWith<T, U>(\n      customizer: (value: T, key: number | string, object: T, stack: any) => U\n    ): (value: T) => U;\n    cloneWith<T, U>(\n      customizer: (value: T, key: number | string, object: T, stack: any) => U,\n      value: T\n    ): U;\n    conformsTo<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean }\n    ): (source: T) => boolean;\n    conformsTo<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean },\n      source: T\n    ): boolean;\n    where<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean }\n    ): (source: T) => boolean;\n    where<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean },\n      source: T\n    ): boolean;\n    conforms<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean }\n    ): (source: T) => boolean;\n    conforms<T: { [key: string]: mixed }>(\n      predicates: T & { [key: string]: (x: any) => boolean },\n      source: T\n    ): boolean;\n    eq(value: any): (other: any) => boolean;\n    eq(value: any, other: any): boolean;\n    identical(value: any): (other: any) => boolean;\n    identical(value: any, other: any): boolean;\n    gt(value: any): (other: any) => boolean;\n    gt(value: any, other: any): boolean;\n    gte(value: any): (other: any) => boolean;\n    gte(value: any, other: any): boolean;\n    isArguments(value: any): boolean;\n    isArray(value: any): boolean;\n    isArrayBuffer(value: any): boolean;\n    isArrayLike(value: any): boolean;\n    isArrayLikeObject(value: any): boolean;\n    isBoolean(value: any): boolean;\n    isBuffer(value: any): boolean;\n    isDate(value: any): boolean;\n    isElement(value: any): boolean;\n    isEmpty(value: any): boolean;\n    isEqual(value: any): (other: any) => boolean;\n    isEqual(value: any, other: any): boolean;\n    equals(value: any): (other: any) => boolean;\n    equals(value: any, other: any): boolean;\n    isEqualWith<T, U>(\n      customizer: (\n        objValue: any,\n        otherValue: any,\n        key: number | string,\n        object: T,\n        other: U,\n        stack: any\n      ) => boolean | void\n    ): ((value: T) => (other: U) => boolean) &\n      ((value: T, other: U) => boolean);\n    isEqualWith<T, U>(\n      customizer: (\n        objValue: any,\n        otherValue: any,\n        key: number | string,\n        object: T,\n        other: U,\n        stack: any\n      ) => boolean | void,\n      value: T\n    ): (other: U) => boolean;\n    isEqualWith<T, U>(\n      customizer: (\n        objValue: any,\n        otherValue: any,\n        key: number | string,\n        object: T,\n        other: U,\n        stack: any\n      ) => boolean | void,\n      value: T,\n      other: U\n    ): boolean;\n    isError(value: any): boolean;\n    isFinite(value: any): boolean;\n    isFunction(value: Function): true;\n    isFunction(value: number | string | void | null | Object): false;\n    isInteger(value: any): boolean;\n    isLength(value: any): boolean;\n    isMap(value: any): boolean;\n    isMatch(source: Object): (object: Object) => boolean;\n    isMatch(source: Object, object: Object): boolean;\n    whereEq(source: Object): (object: Object) => boolean;\n    whereEq(source: Object, object: Object): boolean;\n    isMatchWith<T: Object, U: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: number | string,\n        object: T,\n        source: U\n      ) => boolean | void\n    ): ((source: U) => (object: T) => boolean) &\n      ((source: U, object: T) => boolean);\n    isMatchWith<T: Object, U: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: number | string,\n        object: T,\n        source: U\n      ) => boolean | void,\n      source: U\n    ): (object: T) => boolean;\n    isMatchWith<T: Object, U: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: number | string,\n        object: T,\n        source: U\n      ) => boolean | void,\n      source: U,\n      object: T\n    ): boolean;\n    isNaN(value: any): boolean;\n    isNative(value: any): boolean;\n    isNil(value: any): boolean;\n    isNull(value: any): boolean;\n    isNumber(value: any): boolean;\n    isObject(value: any): boolean;\n    isObjectLike(value: any): boolean;\n    isPlainObject(value: any): boolean;\n    isRegExp(value: any): boolean;\n    isSafeInteger(value: any): boolean;\n    isSet(value: any): boolean;\n    isString(value: string): true;\n    isString(\n      value: number | boolean | Function | void | null | Object | Array<any>\n    ): false;\n    isSymbol(value: any): boolean;\n    isTypedArray(value: any): boolean;\n    isUndefined(value: any): boolean;\n    isWeakMap(value: any): boolean;\n    isWeakSet(value: any): boolean;\n    lt(value: any): (other: any) => boolean;\n    lt(value: any, other: any): boolean;\n    lte(value: any): (other: any) => boolean;\n    lte(value: any, other: any): boolean;\n    toArray(value: any): Array<any>;\n    toFinite(value: any): number;\n    toInteger(value: any): number;\n    toLength(value: any): number;\n    toNumber(value: any): number;\n    toPlainObject(value: any): Object;\n    toSafeInteger(value: any): number;\n    toString(value: any): string;\n\n    // Math\n    add(augend: number): (addend: number) => number;\n    add(augend: number, addend: number): number;\n    ceil(number: number): number;\n    divide(dividend: number): (divisor: number) => number;\n    divide(dividend: number, divisor: number): number;\n    floor(number: number): number;\n    max<T>(array: Array<T>): T;\n    maxBy<T>(iteratee: Iteratee<T>): (array: Array<T>) => T;\n    maxBy<T>(iteratee: Iteratee<T>, array: Array<T>): T;\n    mean(array: Array<*>): number;\n    meanBy<T>(iteratee: Iteratee<T>): (array: Array<T>) => number;\n    meanBy<T>(iteratee: Iteratee<T>, array: Array<T>): number;\n    min<T>(array: Array<T>): T;\n    minBy<T>(iteratee: Iteratee<T>): (array: Array<T>) => T;\n    minBy<T>(iteratee: Iteratee<T>, array: Array<T>): T;\n    multiply(multiplier: number): (multiplicand: number) => number;\n    multiply(multiplier: number, multiplicand: number): number;\n    round(number: number): number;\n    subtract(minuend: number): (subtrahend: number) => number;\n    subtract(minuend: number, subtrahend: number): number;\n    sum(array: Array<*>): number;\n    sumBy<T>(iteratee: Iteratee<T>): (array: Array<T>) => number;\n    sumBy<T>(iteratee: Iteratee<T>, array: Array<T>): number;\n\n    // number\n    clamp(\n      lower: number\n    ): ((upper: number) => (number: number) => number) &\n      ((upper: number, number: number) => number);\n    clamp(lower: number, upper: number): (number: number) => number;\n    clamp(lower: number, upper: number, number: number): number;\n    inRange(\n      start: number\n    ): ((end: number) => (number: number) => boolean) &\n      ((end: number, number: number) => boolean);\n    inRange(start: number, end: number): (number: number) => boolean;\n    inRange(start: number, end: number, number: number): boolean;\n    random(lower: number): (upper: number) => number;\n    random(lower: number, upper: number): number;\n\n    // Object\n    assign(object: Object): (source: Object) => Object;\n    assign(object: Object, source: Object): Object;\n    assignAll(objects: Array<Object>): Object;\n    assignInAll(objects: Array<Object>): Object;\n    extendAll(objects: Array<Object>): Object;\n    assignIn<A, B>(a: A): (b: B) => A & B;\n    assignIn<A, B>(a: A, b: B): A & B;\n    assignInWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object);\n    assignInWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T\n    ): (s1: A) => Object;\n    assignInWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T,\n      s1: A\n    ): Object;\n    assignWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object);\n    assignWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T\n    ): (s1: A) => Object;\n    assignWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T,\n      s1: A\n    ): Object;\n    assignInAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void\n    ): (objects: Array<Object>) => Object;\n    assignInAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void,\n      objects: Array<Object>\n    ): Object;\n    extendAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void\n    ): (objects: Array<Object>) => Object;\n    extendAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void,\n      objects: Array<Object>\n    ): Object;\n    assignAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void\n    ): (objects: Array<Object>) => Object;\n    assignAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void,\n      objects: Array<Object>\n    ): Object;\n    at(paths: Array<string>): (object: Object) => Array<any>;\n    at(paths: Array<string>, object: Object): Array<any>;\n    props(paths: Array<string>): (object: Object) => Array<any>;\n    props(paths: Array<string>, object: Object): Array<any>;\n    paths(paths: Array<string>): (object: Object) => Array<any>;\n    paths(paths: Array<string>, object: Object): Array<any>;\n    create<T>(prototype: T): $Supertype<T>;\n    defaults(source: Object): (object: Object) => Object;\n    defaults(source: Object, object: Object): Object;\n    defaultsAll(objects: Array<Object>): Object;\n    defaultsDeep(source: Object): (object: Object) => Object;\n    defaultsDeep(source: Object, object: Object): Object;\n    defaultsDeepAll(objects: Array<Object>): Object;\n    // alias for _.toPairs\n    entries(object: Object): Array<[string, any]>;\n    // alias for _.toPairsIn\n    entriesIn(object: Object): Array<[string, any]>;\n    // alias for _.assignIn\n    extend<A, B>(a: A): (b: B) => A & B;\n    extend<A, B>(a: A, b: B): A & B;\n    // alias for _.assignInWith\n    extendWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void\n    ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object);\n    extendWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T\n    ): (s1: A) => Object;\n    extendWith<T: Object, A: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A\n      ) => any | void,\n      object: T,\n      s1: A\n    ): Object;\n    findKey<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>\n    ): (object: T) => string | void;\n    findKey<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>,\n      object: T\n    ): string | void;\n    findLastKey<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>\n    ): (object: T) => string | void;\n    findLastKey<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>,\n      object: T\n    ): string | void;\n    forIn(iteratee: OIteratee<*>): (object: Object) => Object;\n    forIn(iteratee: OIteratee<*>, object: Object): Object;\n    forInRight(iteratee: OIteratee<*>): (object: Object) => Object;\n    forInRight(iteratee: OIteratee<*>, object: Object): Object;\n    forOwn(iteratee: OIteratee<*>): (object: Object) => Object;\n    forOwn(iteratee: OIteratee<*>, object: Object): Object;\n    forOwnRight(iteratee: OIteratee<*>): (object: Object) => Object;\n    forOwnRight(iteratee: OIteratee<*>, object: Object): Object;\n    functions(object: Object): Array<string>;\n    functionsIn(object: Object): Array<string>;\n    get(path: Array<string> | string): (object: Object | Array<any>) => any;\n    get(path: Array<string> | string, object: Object | Array<any>): any;\n    prop(path: Array<string> | string): (object: Object | Array<any>) => any;\n    prop(path: Array<string> | string, object: Object | Array<any>): any;\n    path(path: Array<string> | string): (object: Object | Array<any>) => any;\n    path(path: Array<string> | string, object: Object | Array<any>): any;\n    getOr(\n      defaultValue: any\n    ): ((\n      path: Array<string> | string\n    ) => (object: Object | Array<any>) => any) &\n      ((path: Array<string> | string, object: Object | Array<any>) => any);\n    getOr(\n      defaultValue: any,\n      path: Array<string> | string\n    ): (object: Object | Array<any>) => any;\n    getOr(\n      defaultValue: any,\n      path: Array<string> | string,\n      object: Object | Array<any>\n    ): any;\n    propOr(\n      defaultValue: any\n    ): ((\n      path: Array<string> | string\n    ) => (object: Object | Array<any>) => any) &\n      ((path: Array<string> | string, object: Object | Array<any>) => any);\n    propOr(\n      defaultValue: any,\n      path: Array<string> | string\n    ): (object: Object | Array<any>) => any;\n    propOr(\n      defaultValue: any,\n      path: Array<string> | string,\n      object: Object | Array<any>\n    ): any;\n    pathOr(\n      defaultValue: any\n    ): ((\n      path: Array<string> | string\n    ) => (object: Object | Array<any>) => any) &\n      ((path: Array<string> | string, object: Object | Array<any>) => any);\n    pathOr(\n      defaultValue: any,\n      path: Array<string> | string\n    ): (object: Object | Array<any>) => any;\n    pathOr(\n      defaultValue: any,\n      path: Array<string> | string,\n      object: Object | Array<any>\n    ): any;\n    has(path: Array<string> | string): (object: Object) => boolean;\n    has(path: Array<string> | string, object: Object): boolean;\n    hasIn(path: Array<string> | string): (object: Object) => boolean;\n    hasIn(path: Array<string> | string, object: Object): boolean;\n    invert(object: Object): Object;\n    invertObj(object: Object): Object;\n    invertBy(iteratee: Function): (object: Object) => Object;\n    invertBy(iteratee: Function, object: Object): Object;\n    invoke(path: Array<string> | string): (object: Object) => any;\n    invoke(path: Array<string> | string, object: Object): any;\n    invokeArgs(\n      path: Array<string> | string\n    ): ((object: Object) => (args: Array<any>) => any) &\n      ((object: Object, args: Array<any>) => any);\n    invokeArgs(\n      path: Array<string> | string,\n      object: Object\n    ): (args: Array<any>) => any;\n    invokeArgs(\n      path: Array<string> | string,\n      object: Object,\n      args: Array<any>\n    ): any;\n    keys<K>(object: { [key: K]: any }): Array<K>;\n    keys(object: Object): Array<string>;\n    keysIn(object: Object): Array<string>;\n    mapKeys(iteratee: OIteratee<*>): (object: Object) => Object;\n    mapKeys(iteratee: OIteratee<*>, object: Object): Object;\n    mapValues(iteratee: OIteratee<*>): (object: Object) => Object;\n    mapValues(iteratee: OIteratee<*>, object: Object): Object;\n    merge(object: Object): (source: Object) => Object;\n    merge(object: Object, source: Object): Object;\n    mergeAll(objects: Array<Object>): Object;\n    mergeWith<T: Object, A: Object, B: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void\n    ): ((object: T) => (s1: A) => Object) & ((object: T, s1: A) => Object);\n    mergeWith<T: Object, A: Object, B: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void,\n      object: T\n    ): (s1: A) => Object;\n    mergeWith<T: Object, A: Object, B: Object>(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: T,\n        source: A | B\n      ) => any | void,\n      object: T,\n      s1: A\n    ): Object;\n    mergeAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void\n    ): (objects: Array<Object>) => Object;\n    mergeAllWith(\n      customizer: (\n        objValue: any,\n        srcValue: any,\n        key: string,\n        object: Object,\n        source: Object\n      ) => any | void,\n      objects: Array<Object>\n    ): Object;\n    omit(props: Array<string>): (object: Object) => Object;\n    omit(props: Array<string>, object: Object): Object;\n    omitAll(props: Array<string>): (object: Object) => Object;\n    omitAll(props: Array<string>, object: Object): Object;\n    omitBy<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>\n    ): (object: T) => Object;\n    omitBy<A, T: { [id: any]: A }>(predicate: OPredicate<A>, object: T): Object;\n    pick(props: Array<string>): (object: Object) => Object;\n    pick(props: Array<string>, object: Object): Object;\n    pickAll(props: Array<string>): (object: Object) => Object;\n    pickAll(props: Array<string>, object: Object): Object;\n    pickBy<A, T: { [id: any]: A }>(\n      predicate: OPredicate<A>\n    ): (object: T) => Object;\n    pickBy<A, T: { [id: any]: A }>(predicate: OPredicate<A>, object: T): Object;\n    result(path: Array<string> | string): (object: Object) => any;\n    result(path: Array<string> | string, object: Object): any;\n    set(\n      path: Array<string> | string\n    ): ((value: any) => (object: Object) => Object) &\n      ((value: any, object: Object) => Object);\n    set(path: Array<string> | string, value: any): (object: Object) => Object;\n    set(path: Array<string> | string, value: any, object: Object): Object;\n    assoc(\n      path: Array<string> | string\n    ): ((value: any) => (object: Object) => Object) &\n      ((value: any, object: Object) => Object);\n    assoc(path: Array<string> | string, value: any): (object: Object) => Object;\n    assoc(path: Array<string> | string, value: any, object: Object): Object;\n    assocPath(\n      path: Array<string> | string\n    ): ((value: any) => (object: Object) => Object) &\n      ((value: any, object: Object) => Object);\n    assocPath(\n      path: Array<string> | string,\n      value: any\n    ): (object: Object) => Object;\n    assocPath(path: Array<string> | string, value: any, object: Object): Object;\n    setWith<T>(\n      customizer: (nsValue: any, key: string, nsObject: T) => any\n    ): ((\n      path: Array<string> | string\n    ) => ((value: any) => (object: T) => Object) &\n      ((value: any, object: T) => Object)) &\n      ((path: Array<string> | string, value: any) => (object: T) => Object) &\n      ((path: Array<string> | string, value: any, object: T) => Object);\n    setWith<T>(\n      customizer: (nsValue: any, key: string, nsObject: T) => any,\n      path: Array<string> | string\n    ): ((value: any) => (object: T) => Object) &\n      ((value: any, object: T) => Object);\n    setWith<T>(\n      customizer: (nsValue: any, key: string, nsObject: T) => any,\n      path: Array<string> | string,\n      value: any\n    ): (object: T) => Object;\n    setWith<T>(\n      customizer: (nsValue: any, key: string, nsObject: T) => any,\n      path: Array<string> | string,\n      value: any,\n      object: T\n    ): Object;\n    toPairs(object: Object | Array<*>): Array<[string, any]>;\n    toPairsIn(object: Object): Array<[string, any]>;\n    transform(\n      iteratee: OIteratee<*>\n    ): ((\n      accumulator: any\n    ) => (collection: Object | $ReadOnlyArray<any>) => any) &\n      ((accumulator: any, collection: Object | $ReadOnlyArray<any>) => any);\n    transform(\n      iteratee: OIteratee<*>,\n      accumulator: any\n    ): (collection: Object | $ReadOnlyArray<any>) => any;\n    transform(\n      iteratee: OIteratee<*>,\n      accumulator: any,\n      collection: Object | $ReadOnlyArray<any>\n    ): any;\n    unset(path: Array<string> | string): (object: Object) => boolean;\n    unset(path: Array<string> | string, object: Object): boolean;\n    dissoc(path: Array<string> | string): (object: Object) => boolean;\n    dissoc(path: Array<string> | string, object: Object): boolean;\n    dissocPath(path: Array<string> | string): (object: Object) => boolean;\n    dissocPath(path: Array<string> | string, object: Object): boolean;\n    update(\n      path: string[] | string\n    ): ((updater: Function) => (object: Object) => Object) &\n      ((updater: Function, object: Object) => Object);\n    update(\n      path: string[] | string,\n      updater: Function\n    ): (object: Object) => Object;\n    update(path: string[] | string, updater: Function, object: Object): Object;\n    updateWith(\n      customizer: Function\n    ): ((\n      path: string[] | string\n    ) => ((updater: Function) => (object: Object) => Object) &\n      ((updater: Function, object: Object) => Object)) &\n      ((\n        path: string[] | string,\n        updater: Function\n      ) => (object: Object) => Object) &\n      ((path: string[] | string, updater: Function, object: Object) => Object);\n    updateWith(\n      customizer: Function,\n      path: string[] | string\n    ): ((updater: Function) => (object: Object) => Object) &\n      ((updater: Function, object: Object) => Object);\n    updateWith(\n      customizer: Function,\n      path: string[] | string,\n      updater: Function\n    ): (object: Object) => Object;\n    updateWith(\n      customizer: Function,\n      path: string[] | string,\n      updater: Function,\n      object: Object\n    ): Object;\n    values(object: Object): Array<any>;\n    valuesIn(object: Object): Array<any>;\n\n    tap<T>(interceptor: (value: T) => any): (value: T) => T;\n    tap<T>(interceptor: (value: T) => any, value: T): T;\n    thru<T1, T2>(interceptor: (value: T1) => T2): (value: T1) => T2;\n    thru<T1, T2>(interceptor: (value: T1) => T2, value: T1): T2;\n\n    // String\n    camelCase(string: string): string;\n    capitalize(string: string): string;\n    deburr(string: string): string;\n    endsWith(target: string): (string: string) => boolean;\n    endsWith(target: string, string: string): boolean;\n    escape(string: string): string;\n    escapeRegExp(string: string): string;\n    kebabCase(string: string): string;\n    lowerCase(string: string): string;\n    lowerFirst(string: string): string;\n    pad(length: number): (string: string) => string;\n    pad(length: number, string: string): string;\n    padChars(\n      chars: string\n    ): ((length: number) => (string: string) => string) &\n      ((length: number, string: string) => string);\n    padChars(chars: string, length: number): (string: string) => string;\n    padChars(chars: string, length: number, string: string): string;\n    padEnd(length: number): (string: string) => string;\n    padEnd(length: number, string: string): string;\n    padCharsEnd(\n      chars: string\n    ): ((length: number) => (string: string) => string) &\n      ((length: number, string: string) => string);\n    padCharsEnd(chars: string, length: number): (string: string) => string;\n    padCharsEnd(chars: string, length: number, string: string): string;\n    padStart(length: number): (string: string) => string;\n    padStart(length: number, string: string): string;\n    padCharsStart(\n      chars: string\n    ): ((length: number) => (string: string) => string) &\n      ((length: number, string: string) => string);\n    padCharsStart(chars: string, length: number): (string: string) => string;\n    padCharsStart(chars: string, length: number, string: string): string;\n    parseInt(radix: number): (string: string) => number;\n    parseInt(radix: number, string: string): number;\n    repeat(n: number): (string: string) => string;\n    repeat(n: number, string: string): string;\n    replace(\n      pattern: RegExp | string\n    ): ((\n      replacement: ((string: string) => string) | string\n    ) => (string: string) => string) &\n      ((\n        replacement: ((string: string) => string) | string,\n        string: string\n      ) => string);\n    replace(\n      pattern: RegExp | string,\n      replacement: ((string: string) => string) | string\n    ): (string: string) => string;\n    replace(\n      pattern: RegExp | string,\n      replacement: ((string: string) => string) | string,\n      string: string\n    ): string;\n    snakeCase(string: string): string;\n    split(separator: RegExp | string): (string: string) => Array<string>;\n    split(separator: RegExp | string, string: string): Array<string>;\n    startCase(string: string): string;\n    startsWith(target: string): (string: string) => boolean;\n    startsWith(target: string, string: string): boolean;\n    template(string: string): Function;\n    toLower(string: string): string;\n    toUpper(string: string): string;\n    trim(string: string): string;\n    trimChars(chars: string): (string: string) => string;\n    trimChars(chars: string, string: string): string;\n    trimEnd(string: string): string;\n    trimCharsEnd(chars: string): (string: string) => string;\n    trimCharsEnd(chars: string, string: string): string;\n    trimStart(string: string): string;\n    trimCharsStart(chars: string): (string: string) => string;\n    trimCharsStart(chars: string, string: string): string;\n    truncate(options: TruncateOptions): (string: string) => string;\n    truncate(options: TruncateOptions, string: string): string;\n    unescape(string: string): string;\n    upperCase(string: string): string;\n    upperFirst(string: string): string;\n    words(string: string): Array<string>;\n\n    // Util\n    attempt(func: Function): any;\n    bindAll(methodNames: Array<string>): (object: Object) => Object;\n    bindAll(methodNames: Array<string>, object: Object): Object;\n    cond(pairs: NestedArray<Function>): Function;\n    constant<T>(value: T): () => T;\n    always<T>(value: T): () => T;\n    defaultTo<T1: string | boolean | Object, T2>(\n      defaultValue: T2\n    ): (value: T1) => T1;\n    defaultTo<T1: string | boolean | Object, T2>(\n      defaultValue: T2,\n      value: T1\n    ): T1;\n    // NaN is a number instead of its own type, otherwise it would behave like null/void\n    defaultTo<T1: number, T2>(defaultValue: T2): (value: T1) => T1 | T2;\n    defaultTo<T1: number, T2>(defaultValue: T2, value: T1): T1 | T2;\n    defaultTo<T1: void | null, T2>(defaultValue: T2): (value: T1) => T2;\n    defaultTo<T1: void | null, T2>(defaultValue: T2, value: T1): T2;\n    flow: ($ComposeReverse & (funcs: Array<Function>) => Function);\n    pipe: ($ComposeReverse & (funcs: Array<Function>) => Function);\n    flowRight: ($Compose & (funcs: Array<Function>) => Function);\n    compose: ($Compose & (funcs: Array<Function>) => Function);\n    compose(funcs: Array<Function>): Function;\n    identity<T>(value: T): T;\n    iteratee(func: any): Function;\n    matches(source: Object): (object: Object) => boolean;\n    matches(source: Object, object: Object): boolean;\n    matchesProperty(path: Array<string> | string): (srcValue: any) => Function;\n    matchesProperty(path: Array<string> | string, srcValue: any): Function;\n    propEq(path: Array<string> | string): (srcValue: any) => Function;\n    propEq(path: Array<string> | string, srcValue: any): Function;\n    pathEq(path: Array<string> | string): (srcValue: any) => Function;\n    pathEq(path: Array<string> | string, srcValue: any): Function;\n    method(path: Array<string> | string): Function;\n    methodOf(object: Object): Function;\n    mixin<T: Function | Object>(\n      object: T\n    ): ((source: Object) => (options: { chain: boolean }) => T) &\n      ((source: Object, options: { chain: boolean }) => T);\n    mixin<T: Function | Object>(\n      object: T,\n      source: Object\n    ): (options: { chain: boolean }) => T;\n    mixin<T: Function | Object>(\n      object: T,\n      source: Object,\n      options: { chain: boolean }\n    ): T;\n    noConflict(): Lodash;\n    noop(...args: Array<mixed>): void;\n    nthArg(n: number): Function;\n    over(iteratees: Array<Function>): Function;\n    juxt(iteratees: Array<Function>): Function;\n    overEvery(predicates: Array<Function>): Function;\n    allPass(predicates: Array<Function>): Function;\n    overSome(predicates: Array<Function>): Function;\n    anyPass(predicates: Array<Function>): Function;\n    property(\n      path: Array<string> | string\n    ): (object: Object | Array<any>) => any;\n    property(path: Array<string> | string, object: Object | Array<any>): any;\n    propertyOf(object: Object): (path: Array<string> | string) => Function;\n    propertyOf(object: Object, path: Array<string> | string): Function;\n    range(start: number): (end: number) => Array<number>;\n    range(start: number, end: number): Array<number>;\n    rangeStep(\n      step: number\n    ): ((start: number) => (end: number) => Array<number>) &\n      ((start: number, end: number) => Array<number>);\n    rangeStep(step: number, start: number): (end: number) => Array<number>;\n    rangeStep(step: number, start: number, end: number): Array<number>;\n    rangeRight(start: number): (end: number) => Array<number>;\n    rangeRight(start: number, end: number): Array<number>;\n    rangeStepRight(\n      step: number\n    ): ((start: number) => (end: number) => Array<number>) &\n      ((start: number, end: number) => Array<number>);\n    rangeStepRight(step: number, start: number): (end: number) => Array<number>;\n    rangeStepRight(step: number, start: number, end: number): Array<number>;\n    runInContext(context: Object): Function;\n\n    stubArray(): Array<*>;\n    stubFalse(): false;\n    F(): false;\n    stubObject(): {};\n    stubString(): \"\";\n    stubTrue(): true;\n    T(): true;\n    times<T>(iteratee: (i: number) => T): (n: number) => Array<T>;\n    times<T>(iteratee: (i: number) => T, n: number): Array<T>;\n    toPath(value: any): Array<string>;\n    uniqueId(prefix: string): string;\n\n    __: any;\n    placeholder: any;\n\n    convert(options: {\n      cap?: boolean,\n      curry?: boolean,\n      fixed?: boolean,\n      immutable?: boolean,\n      rearg?: boolean\n    }): void;\n\n    // Properties\n    VERSION: string;\n    templateSettings: TemplateSettings;\n  }\n\n  declare module.exports: Lodash;\n}\n\ndeclare module \"lodash/chunk\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"chunk\">;\n}\n\ndeclare module \"lodash/compact\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"compact\">;\n}\n\ndeclare module \"lodash/concat\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"concat\">;\n}\n\ndeclare module \"lodash/difference\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"difference\">;\n}\n\ndeclare module \"lodash/differenceBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"differenceBy\">;\n}\n\ndeclare module \"lodash/differenceWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"differenceWith\">;\n}\n\ndeclare module \"lodash/drop\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"drop\">;\n}\n\ndeclare module \"lodash/dropRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"dropRight\">;\n}\n\ndeclare module \"lodash/dropRightWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"dropRightWhile\">;\n}\n\ndeclare module \"lodash/dropWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"dropWhile\">;\n}\n\ndeclare module \"lodash/fill\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"fill\">;\n}\n\ndeclare module \"lodash/findIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"findIndex\">;\n}\n\ndeclare module \"lodash/findLastIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"findLastIndex\">;\n}\n\ndeclare module \"lodash/first\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"first\">;\n}\n\ndeclare module \"lodash/flatten\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flatten\">;\n}\n\ndeclare module \"lodash/flattenDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flattenDeep\">;\n}\n\ndeclare module \"lodash/flattenDepth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flattenDepth\">;\n}\n\ndeclare module \"lodash/fromPairs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"fromPairs\">;\n}\n\ndeclare module \"lodash/head\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"head\">;\n}\n\ndeclare module \"lodash/indexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"indexOf\">;\n}\n\ndeclare module \"lodash/initial\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"initial\">;\n}\n\ndeclare module \"lodash/intersection\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"intersection\">;\n}\n\ndeclare module \"lodash/intersectionBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"intersectionBy\">;\n}\n\ndeclare module \"lodash/intersectionWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"intersectionWith\">;\n}\n\ndeclare module \"lodash/join\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"join\">;\n}\n\ndeclare module \"lodash/last\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"last\">;\n}\n\ndeclare module \"lodash/lastIndexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"lastIndexOf\">;\n}\n\ndeclare module \"lodash/nth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"nth\">;\n}\n\ndeclare module \"lodash/pull\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pull\">;\n}\n\ndeclare module \"lodash/pullAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pullAll\">;\n}\n\ndeclare module \"lodash/pullAllBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pullAllBy\">;\n}\n\ndeclare module \"lodash/pullAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pullAllWith\">;\n}\n\ndeclare module \"lodash/pullAt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pullAt\">;\n}\n\ndeclare module \"lodash/remove\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"remove\">;\n}\n\ndeclare module \"lodash/reverse\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"reverse\">;\n}\n\ndeclare module \"lodash/slice\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"slice\">;\n}\n\ndeclare module \"lodash/sortedIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedIndex\">;\n}\n\ndeclare module \"lodash/sortedIndexBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedIndexBy\">;\n}\n\ndeclare module \"lodash/sortedIndexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedIndexOf\">;\n}\n\ndeclare module \"lodash/sortedLastIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedLastIndex\">;\n}\n\ndeclare module \"lodash/sortedLastIndexBy\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"lodash\">,\n    \"sortedLastIndexBy\"\n  >;\n}\n\ndeclare module \"lodash/sortedLastIndexOf\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"lodash\">,\n    \"sortedLastIndexOf\"\n  >;\n}\n\ndeclare module \"lodash/sortedUniq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedUniq\">;\n}\n\ndeclare module \"lodash/sortedUniqBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortedUniqBy\">;\n}\n\ndeclare module \"lodash/tail\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"tail\">;\n}\n\ndeclare module \"lodash/take\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"take\">;\n}\n\ndeclare module \"lodash/takeRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"takeRight\">;\n}\n\ndeclare module \"lodash/takeRightWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"takeRightWhile\">;\n}\n\ndeclare module \"lodash/takeWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"takeWhile\">;\n}\n\ndeclare module \"lodash/union\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"union\">;\n}\n\ndeclare module \"lodash/unionBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unionBy\">;\n}\n\ndeclare module \"lodash/unionWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unionWith\">;\n}\n\ndeclare module \"lodash/uniq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"uniq\">;\n}\n\ndeclare module \"lodash/uniqBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"uniqBy\">;\n}\n\ndeclare module \"lodash/uniqWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"uniqWith\">;\n}\n\ndeclare module \"lodash/unzip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unzip\">;\n}\n\ndeclare module \"lodash/unzipWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unzipWith\">;\n}\n\ndeclare module \"lodash/without\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"without\">;\n}\n\ndeclare module \"lodash/xor\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"xor\">;\n}\n\ndeclare module \"lodash/xorBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"xorBy\">;\n}\n\ndeclare module \"lodash/xorWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"xorWith\">;\n}\n\ndeclare module \"lodash/zip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"zip\">;\n}\n\ndeclare module \"lodash/zipObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"zipObject\">;\n}\n\ndeclare module \"lodash/zipObjectDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"zipObjectDeep\">;\n}\n\ndeclare module \"lodash/zipWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"zipWith\">;\n}\n\ndeclare module \"lodash/countBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"countBy\">;\n}\n\ndeclare module \"lodash/each\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"each\">;\n}\n\ndeclare module \"lodash/eachRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"eachRight\">;\n}\n\ndeclare module \"lodash/every\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"every\">;\n}\n\ndeclare module \"lodash/filter\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"filter\">;\n}\n\ndeclare module \"lodash/find\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"find\">;\n}\n\ndeclare module \"lodash/findLast\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"findLast\">;\n}\n\ndeclare module \"lodash/flatMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flatMap\">;\n}\n\ndeclare module \"lodash/flatMapDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flatMapDeep\">;\n}\n\ndeclare module \"lodash/flatMapDepth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flatMapDepth\">;\n}\n\ndeclare module \"lodash/forEach\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forEach\">;\n}\n\ndeclare module \"lodash/forEachRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forEachRight\">;\n}\n\ndeclare module \"lodash/groupBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"groupBy\">;\n}\n\ndeclare module \"lodash/includes\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"includes\">;\n}\n\ndeclare module \"lodash/invokeMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"invokeMap\">;\n}\n\ndeclare module \"lodash/keyBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"keyBy\">;\n}\n\ndeclare module \"lodash/map\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"map\">;\n}\n\ndeclare module \"lodash/orderBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"orderBy\">;\n}\n\ndeclare module \"lodash/partition\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"partition\">;\n}\n\ndeclare module \"lodash/reduce\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"reduce\">;\n}\n\ndeclare module \"lodash/reduceRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"reduceRight\">;\n}\n\ndeclare module \"lodash/reject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"reject\">;\n}\n\ndeclare module \"lodash/sample\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sample\">;\n}\n\ndeclare module \"lodash/sampleSize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sampleSize\">;\n}\n\ndeclare module \"lodash/shuffle\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"shuffle\">;\n}\n\ndeclare module \"lodash/size\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"size\">;\n}\n\ndeclare module \"lodash/some\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"some\">;\n}\n\ndeclare module \"lodash/sortBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sortBy\">;\n}\n\ndeclare module \"lodash/now\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"now\">;\n}\n\ndeclare module \"lodash/after\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"after\">;\n}\n\ndeclare module \"lodash/ary\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"ary\">;\n}\n\ndeclare module \"lodash/before\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"before\">;\n}\n\ndeclare module \"lodash/bind\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"bind\">;\n}\n\ndeclare module \"lodash/bindKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"bindKey\">;\n}\n\ndeclare module \"lodash/curry\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"curry\">;\n}\n\ndeclare module \"lodash/curryRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"curryRight\">;\n}\n\ndeclare module \"lodash/debounce\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"debounce\">;\n}\n\ndeclare module \"lodash/defer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"defer\">;\n}\n\ndeclare module \"lodash/delay\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"delay\">;\n}\n\ndeclare module \"lodash/flip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flip\">;\n}\n\ndeclare module \"lodash/memoize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"memoize\">;\n}\n\ndeclare module \"lodash/negate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"negate\">;\n}\n\ndeclare module \"lodash/once\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"once\">;\n}\n\ndeclare module \"lodash/overArgs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"overArgs\">;\n}\n\ndeclare module \"lodash/partial\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"partial\">;\n}\n\ndeclare module \"lodash/partialRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"partialRight\">;\n}\n\ndeclare module \"lodash/rearg\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"rearg\">;\n}\n\ndeclare module \"lodash/rest\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"rest\">;\n}\n\ndeclare module \"lodash/spread\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"spread\">;\n}\n\ndeclare module \"lodash/throttle\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"throttle\">;\n}\n\ndeclare module \"lodash/unary\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unary\">;\n}\n\ndeclare module \"lodash/wrap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"wrap\">;\n}\n\ndeclare module \"lodash/castArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"castArray\">;\n}\n\ndeclare module \"lodash/clone\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"clone\">;\n}\n\ndeclare module \"lodash/cloneDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"cloneDeep\">;\n}\n\ndeclare module \"lodash/cloneDeepWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"cloneDeepWith\">;\n}\n\ndeclare module \"lodash/cloneWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"cloneWith\">;\n}\n\ndeclare module \"lodash/conformsTo\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"conformsTo\">;\n}\n\ndeclare module \"lodash/eq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"eq\">;\n}\n\ndeclare module \"lodash/gt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"gt\">;\n}\n\ndeclare module \"lodash/gte\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"gte\">;\n}\n\ndeclare module \"lodash/isArguments\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isArguments\">;\n}\n\ndeclare module \"lodash/isArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isArray\">;\n}\n\ndeclare module \"lodash/isArrayBuffer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isArrayBuffer\">;\n}\n\ndeclare module \"lodash/isArrayLike\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isArrayLike\">;\n}\n\ndeclare module \"lodash/isArrayLikeObject\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"lodash\">,\n    \"isArrayLikeObject\"\n  >;\n}\n\ndeclare module \"lodash/isBoolean\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isBoolean\">;\n}\n\ndeclare module \"lodash/isBuffer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isBuffer\">;\n}\n\ndeclare module \"lodash/isDate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isDate\">;\n}\n\ndeclare module \"lodash/isElement\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isElement\">;\n}\n\ndeclare module \"lodash/isEmpty\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isEmpty\">;\n}\n\ndeclare module \"lodash/isEqual\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isEqual\">;\n}\n\ndeclare module \"lodash/isEqualWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isEqualWith\">;\n}\n\ndeclare module \"lodash/isError\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isError\">;\n}\n\ndeclare module \"lodash/isFinite\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isFinite\">;\n}\n\ndeclare module \"lodash/isFunction\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isFunction\">;\n}\n\ndeclare module \"lodash/isInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isInteger\">;\n}\n\ndeclare module \"lodash/isLength\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isLength\">;\n}\n\ndeclare module \"lodash/isMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isMap\">;\n}\n\ndeclare module \"lodash/isMatch\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isMatch\">;\n}\n\ndeclare module \"lodash/isMatchWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isMatchWith\">;\n}\n\ndeclare module \"lodash/isNaN\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isNaN\">;\n}\n\ndeclare module \"lodash/isNative\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isNative\">;\n}\n\ndeclare module \"lodash/isNil\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isNil\">;\n}\n\ndeclare module \"lodash/isNull\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isNull\">;\n}\n\ndeclare module \"lodash/isNumber\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isNumber\">;\n}\n\ndeclare module \"lodash/isObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isObject\">;\n}\n\ndeclare module \"lodash/isObjectLike\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isObjectLike\">;\n}\n\ndeclare module \"lodash/isPlainObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isPlainObject\">;\n}\n\ndeclare module \"lodash/isRegExp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isRegExp\">;\n}\n\ndeclare module \"lodash/isSafeInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isSafeInteger\">;\n}\n\ndeclare module \"lodash/isSet\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isSet\">;\n}\n\ndeclare module \"lodash/isString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isString\">;\n}\n\ndeclare module \"lodash/isSymbol\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isSymbol\">;\n}\n\ndeclare module \"lodash/isTypedArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isTypedArray\">;\n}\n\ndeclare module \"lodash/isUndefined\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isUndefined\">;\n}\n\ndeclare module \"lodash/isWeakMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isWeakMap\">;\n}\n\ndeclare module \"lodash/isWeakSet\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"isWeakSet\">;\n}\n\ndeclare module \"lodash/lt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"lt\">;\n}\n\ndeclare module \"lodash/lte\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"lte\">;\n}\n\ndeclare module \"lodash/toArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toArray\">;\n}\n\ndeclare module \"lodash/toFinite\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toFinite\">;\n}\n\ndeclare module \"lodash/toInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toInteger\">;\n}\n\ndeclare module \"lodash/toLength\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toLength\">;\n}\n\ndeclare module \"lodash/toNumber\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toNumber\">;\n}\n\ndeclare module \"lodash/toPlainObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toPlainObject\">;\n}\n\ndeclare module \"lodash/toSafeInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toSafeInteger\">;\n}\n\ndeclare module \"lodash/toString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toString\">;\n}\n\ndeclare module \"lodash/add\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"add\">;\n}\n\ndeclare module \"lodash/ceil\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"ceil\">;\n}\n\ndeclare module \"lodash/divide\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"divide\">;\n}\n\ndeclare module \"lodash/floor\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"floor\">;\n}\n\ndeclare module \"lodash/max\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"max\">;\n}\n\ndeclare module \"lodash/maxBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"maxBy\">;\n}\n\ndeclare module \"lodash/mean\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"mean\">;\n}\n\ndeclare module \"lodash/meanBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"meanBy\">;\n}\n\ndeclare module \"lodash/min\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"min\">;\n}\n\ndeclare module \"lodash/minBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"minBy\">;\n}\n\ndeclare module \"lodash/multiply\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"multiply\">;\n}\n\ndeclare module \"lodash/round\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"round\">;\n}\n\ndeclare module \"lodash/subtract\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"subtract\">;\n}\n\ndeclare module \"lodash/sum\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sum\">;\n}\n\ndeclare module \"lodash/sumBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"sumBy\">;\n}\n\ndeclare module \"lodash/clamp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"clamp\">;\n}\n\ndeclare module \"lodash/inRange\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"inRange\">;\n}\n\ndeclare module \"lodash/random\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"random\">;\n}\n\ndeclare module \"lodash/assign\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"assign\">;\n}\n\ndeclare module \"lodash/assignIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"assignIn\">;\n}\n\ndeclare module \"lodash/assignInWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"assignInWith\">;\n}\n\ndeclare module \"lodash/assignWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"assignWith\">;\n}\n\ndeclare module \"lodash/at\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"at\">;\n}\n\ndeclare module \"lodash/create\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"create\">;\n}\n\ndeclare module \"lodash/defaults\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"defaults\">;\n}\n\ndeclare module \"lodash/defaultsDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"defaultsDeep\">;\n}\n\ndeclare module \"lodash/entries\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"entries\">;\n}\n\ndeclare module \"lodash/entriesIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"entriesIn\">;\n}\n\ndeclare module \"lodash/extend\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"extend\">;\n}\n\ndeclare module \"lodash/extendWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"extendWith\">;\n}\n\ndeclare module \"lodash/findKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"findKey\">;\n}\n\ndeclare module \"lodash/findLastKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"findLastKey\">;\n}\n\ndeclare module \"lodash/forIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forIn\">;\n}\n\ndeclare module \"lodash/forInRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forInRight\">;\n}\n\ndeclare module \"lodash/forOwn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forOwn\">;\n}\n\ndeclare module \"lodash/forOwnRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"forOwnRight\">;\n}\n\ndeclare module \"lodash/functions\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"functions\">;\n}\n\ndeclare module \"lodash/functionsIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"functionsIn\">;\n}\n\ndeclare module \"lodash/get\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"get\">;\n}\n\ndeclare module \"lodash/has\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"has\">;\n}\n\ndeclare module \"lodash/hasIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"hasIn\">;\n}\n\ndeclare module \"lodash/invert\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"invert\">;\n}\n\ndeclare module \"lodash/invertBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"invertBy\">;\n}\n\ndeclare module \"lodash/invoke\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"invoke\">;\n}\n\ndeclare module \"lodash/keys\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"keys\">;\n}\n\ndeclare module \"lodash/keysIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"keysIn\">;\n}\n\ndeclare module \"lodash/mapKeys\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"mapKeys\">;\n}\n\ndeclare module \"lodash/mapValues\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"mapValues\">;\n}\n\ndeclare module \"lodash/merge\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"merge\">;\n}\n\ndeclare module \"lodash/mergeWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"mergeWith\">;\n}\n\ndeclare module \"lodash/omit\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"omit\">;\n}\n\ndeclare module \"lodash/omitBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"omitBy\">;\n}\n\ndeclare module \"lodash/pick\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pick\">;\n}\n\ndeclare module \"lodash/pickBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pickBy\">;\n}\n\ndeclare module \"lodash/result\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"result\">;\n}\n\ndeclare module \"lodash/set\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"set\">;\n}\n\ndeclare module \"lodash/setWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"setWith\">;\n}\n\ndeclare module \"lodash/toPairs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toPairs\">;\n}\n\ndeclare module \"lodash/toPairsIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toPairsIn\">;\n}\n\ndeclare module \"lodash/transform\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"transform\">;\n}\n\ndeclare module \"lodash/unset\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unset\">;\n}\n\ndeclare module \"lodash/update\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"update\">;\n}\n\ndeclare module \"lodash/updateWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"updateWith\">;\n}\n\ndeclare module \"lodash/values\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"values\">;\n}\n\ndeclare module \"lodash/valuesIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"valuesIn\">;\n}\n\ndeclare module \"lodash/chain\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"chain\">;\n}\n\ndeclare module \"lodash/tap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"tap\">;\n}\n\ndeclare module \"lodash/thru\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"thru\">;\n}\n\ndeclare module \"lodash/camelCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"camelCase\">;\n}\n\ndeclare module \"lodash/capitalize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"capitalize\">;\n}\n\ndeclare module \"lodash/deburr\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"deburr\">;\n}\n\ndeclare module \"lodash/endsWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"endsWith\">;\n}\n\ndeclare module \"lodash/escape\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"escape\">;\n}\n\ndeclare module \"lodash/escapeRegExp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"escapeRegExp\">;\n}\n\ndeclare module \"lodash/kebabCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"kebabCase\">;\n}\n\ndeclare module \"lodash/lowerCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"lowerCase\">;\n}\n\ndeclare module \"lodash/lowerFirst\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"lowerFirst\">;\n}\n\ndeclare module \"lodash/pad\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"pad\">;\n}\n\ndeclare module \"lodash/padEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"padEnd\">;\n}\n\ndeclare module \"lodash/padStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"padStart\">;\n}\n\ndeclare module \"lodash/parseInt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"parseInt\">;\n}\n\ndeclare module \"lodash/repeat\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"repeat\">;\n}\n\ndeclare module \"lodash/replace\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"replace\">;\n}\n\ndeclare module \"lodash/snakeCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"snakeCase\">;\n}\n\ndeclare module \"lodash/split\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"split\">;\n}\n\ndeclare module \"lodash/startCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"startCase\">;\n}\n\ndeclare module \"lodash/startsWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"startsWith\">;\n}\n\ndeclare module \"lodash/template\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"template\">;\n}\n\ndeclare module \"lodash/toLower\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toLower\">;\n}\n\ndeclare module \"lodash/toUpper\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toUpper\">;\n}\n\ndeclare module \"lodash/trim\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"trim\">;\n}\n\ndeclare module \"lodash/trimEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"trimEnd\">;\n}\n\ndeclare module \"lodash/trimStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"trimStart\">;\n}\n\ndeclare module \"lodash/truncate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"truncate\">;\n}\n\ndeclare module \"lodash/unescape\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"unescape\">;\n}\n\ndeclare module \"lodash/upperCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"upperCase\">;\n}\n\ndeclare module \"lodash/upperFirst\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"upperFirst\">;\n}\n\ndeclare module \"lodash/words\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"words\">;\n}\n\ndeclare module \"lodash/attempt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"attempt\">;\n}\n\ndeclare module \"lodash/bindAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"bindAll\">;\n}\n\ndeclare module \"lodash/cond\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"cond\">;\n}\n\ndeclare module \"lodash/conforms\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"conforms\">;\n}\n\ndeclare module \"lodash/constant\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"constant\">;\n}\n\ndeclare module \"lodash/defaultTo\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"defaultTo\">;\n}\n\ndeclare module \"lodash/flow\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flow\">;\n}\n\ndeclare module \"lodash/flowRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"flowRight\">;\n}\n\ndeclare module \"lodash/identity\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"identity\">;\n}\n\ndeclare module \"lodash/iteratee\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"iteratee\">;\n}\n\ndeclare module \"lodash/matches\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"matches\">;\n}\n\ndeclare module \"lodash/matchesProperty\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"matchesProperty\">;\n}\n\ndeclare module \"lodash/method\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"method\">;\n}\n\ndeclare module \"lodash/methodOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"methodOf\">;\n}\n\ndeclare module \"lodash/mixin\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"mixin\">;\n}\n\ndeclare module \"lodash/noConflict\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"noConflict\">;\n}\n\ndeclare module \"lodash/noop\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"noop\">;\n}\n\ndeclare module \"lodash/nthArg\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"nthArg\">;\n}\n\ndeclare module \"lodash/over\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"over\">;\n}\n\ndeclare module \"lodash/overEvery\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"overEvery\">;\n}\n\ndeclare module \"lodash/overSome\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"overSome\">;\n}\n\ndeclare module \"lodash/property\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"property\">;\n}\n\ndeclare module \"lodash/propertyOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"propertyOf\">;\n}\n\ndeclare module \"lodash/range\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"range\">;\n}\n\ndeclare module \"lodash/rangeRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"rangeRight\">;\n}\n\ndeclare module \"lodash/runInContext\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"runInContext\">;\n}\n\ndeclare module \"lodash/stubArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"stubArray\">;\n}\n\ndeclare module \"lodash/stubFalse\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"stubFalse\">;\n}\n\ndeclare module \"lodash/stubObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"stubObject\">;\n}\n\ndeclare module \"lodash/stubString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"stubString\">;\n}\n\ndeclare module \"lodash/stubTrue\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"stubTrue\">;\n}\n\ndeclare module \"lodash/times\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"times\">;\n}\n\ndeclare module \"lodash/toPath\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"toPath\">;\n}\n\ndeclare module \"lodash/uniqueId\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash\">, \"uniqueId\">;\n}\n\ndeclare module \"lodash/fp/chunk\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"chunk\">;\n}\n\ndeclare module \"lodash/fp/compact\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"compact\">;\n}\n\ndeclare module \"lodash/fp/concat\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"concat\">;\n}\n\ndeclare module \"lodash/fp/difference\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"difference\">;\n}\n\ndeclare module \"lodash/fp/differenceBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"differenceBy\">;\n}\n\ndeclare module \"lodash/fp/differenceWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"differenceWith\">;\n}\n\ndeclare module \"lodash/fp/drop\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"drop\">;\n}\n\ndeclare module \"lodash/fp/dropLast\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dropLast\">;\n}\n\ndeclare module \"lodash/fp/dropRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dropRight\">;\n}\n\ndeclare module \"lodash/fp/dropRightWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dropRightWhile\">;\n}\n\ndeclare module \"lodash/fp/dropWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dropWhile\">;\n}\n\ndeclare module \"lodash/fp/dropLastWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dropLastWhile\">;\n}\n\ndeclare module \"lodash/fp/fill\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"fill\">;\n}\n\ndeclare module \"lodash/fp/findIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findIndex\">;\n}\n\ndeclare module \"lodash/fp/findIndexFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findIndexFrom\">;\n}\n\ndeclare module \"lodash/fp/findLastIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findLastIndex\">;\n}\n\ndeclare module \"lodash/fp/findLastIndexFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findLastIndexFrom\">;\n}\n\ndeclare module \"lodash/fp/first\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"first\">;\n}\n\ndeclare module \"lodash/fp/flatten\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flatten\">;\n}\n\ndeclare module \"lodash/fp/unnest\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unnest\">;\n}\n\ndeclare module \"lodash/fp/flattenDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flattenDeep\">;\n}\n\ndeclare module \"lodash/fp/flattenDepth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flattenDepth\">;\n}\n\ndeclare module \"lodash/fp/fromPairs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"fromPairs\">;\n}\n\ndeclare module \"lodash/fp/head\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"head\">;\n}\n\ndeclare module \"lodash/fp/indexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"indexOf\">;\n}\n\ndeclare module \"lodash/fp/indexOfFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"indexOfFrom\">;\n}\n\ndeclare module \"lodash/fp/initial\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"initial\">;\n}\n\ndeclare module \"lodash/fp/init\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"init\">;\n}\n\ndeclare module \"lodash/fp/intersection\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"intersection\">;\n}\n\ndeclare module \"lodash/fp/intersectionBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"intersectionBy\">;\n}\n\ndeclare module \"lodash/fp/intersectionWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"intersectionWith\">;\n}\n\ndeclare module \"lodash/fp/join\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"join\">;\n}\n\ndeclare module \"lodash/fp/last\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"last\">;\n}\n\ndeclare module \"lodash/fp/lastIndexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lastIndexOf\">;\n}\n\ndeclare module \"lodash/fp/lastIndexOfFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lastIndexOfFrom\">;\n}\n\ndeclare module \"lodash/fp/nth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"nth\">;\n}\n\ndeclare module \"lodash/fp/pull\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pull\">;\n}\n\ndeclare module \"lodash/fp/pullAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pullAll\">;\n}\n\ndeclare module \"lodash/fp/pullAllBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pullAllBy\">;\n}\n\ndeclare module \"lodash/fp/pullAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pullAllWith\">;\n}\n\ndeclare module \"lodash/fp/pullAt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pullAt\">;\n}\n\ndeclare module \"lodash/fp/remove\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"remove\">;\n}\n\ndeclare module \"lodash/fp/reverse\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"reverse\">;\n}\n\ndeclare module \"lodash/fp/slice\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"slice\">;\n}\n\ndeclare module \"lodash/fp/sortedIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedIndex\">;\n}\n\ndeclare module \"lodash/fp/sortedIndexBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedIndexBy\">;\n}\n\ndeclare module \"lodash/fp/sortedIndexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedIndexOf\">;\n}\n\ndeclare module \"lodash/fp/sortedLastIndex\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedLastIndex\">;\n}\n\ndeclare module \"lodash/fp/sortedLastIndexBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedLastIndexBy\">;\n}\n\ndeclare module \"lodash/fp/sortedLastIndexOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedLastIndexOf\">;\n}\n\ndeclare module \"lodash/fp/sortedUniq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedUniq\">;\n}\n\ndeclare module \"lodash/fp/sortedUniqBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortedUniqBy\">;\n}\n\ndeclare module \"lodash/fp/tail\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"tail\">;\n}\n\ndeclare module \"lodash/fp/take\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"take\">;\n}\n\ndeclare module \"lodash/fp/takeRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"takeRight\">;\n}\n\ndeclare module \"lodash/fp/takeLast\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"takeLast\">;\n}\n\ndeclare module \"lodash/fp/takeRightWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"takeRightWhile\">;\n}\n\ndeclare module \"lodash/fp/takeLastWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"takeLastWhile\">;\n}\n\ndeclare module \"lodash/fp/takeWhile\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"takeWhile\">;\n}\n\ndeclare module \"lodash/fp/union\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"union\">;\n}\n\ndeclare module \"lodash/fp/unionBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unionBy\">;\n}\n\ndeclare module \"lodash/fp/unionWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unionWith\">;\n}\n\ndeclare module \"lodash/fp/uniq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"uniq\">;\n}\n\ndeclare module \"lodash/fp/uniqBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"uniqBy\">;\n}\n\ndeclare module \"lodash/fp/uniqWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"uniqWith\">;\n}\n\ndeclare module \"lodash/fp/unzip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unzip\">;\n}\n\ndeclare module \"lodash/fp/unzipWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unzipWith\">;\n}\n\ndeclare module \"lodash/fp/without\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"without\">;\n}\n\ndeclare module \"lodash/fp/xor\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"xor\">;\n}\n\ndeclare module \"lodash/fp/symmetricDifference\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"symmetricDifference\">;\n}\n\ndeclare module \"lodash/fp/xorBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"xorBy\">;\n}\n\ndeclare module \"lodash/fp/symmetricDifferenceBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"symmetricDifferenceBy\">;\n}\n\ndeclare module \"lodash/fp/xorWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"xorWith\">;\n}\n\ndeclare module \"lodash/fp/symmetricDifferenceWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"symmetricDifferenceWith\">;\n}\n\ndeclare module \"lodash/fp/zip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zip\">;\n}\n\ndeclare module \"lodash/fp/zipAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zipAll\">;\n}\n\ndeclare module \"lodash/fp/zipObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zipObject\">;\n}\n\ndeclare module \"lodash/fp/zipObj\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zipObj\">;\n}\n\ndeclare module \"lodash/fp/zipObjectDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zipObjectDeep\">;\n}\n\ndeclare module \"lodash/fp/zipWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"zipWith\">;\n}\n\ndeclare module \"lodash/fp/countBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"countBy\">;\n}\n\ndeclare module \"lodash/fp/each\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"each\">;\n}\n\ndeclare module \"lodash/fp/eachRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"eachRight\">;\n}\n\ndeclare module \"lodash/fp/every\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"every\">;\n}\n\ndeclare module \"lodash/fp/all\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"all\">;\n}\n\ndeclare module \"lodash/fp/filter\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"filter\">;\n}\n\ndeclare module \"lodash/fp/find\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"find\">;\n}\n\ndeclare module \"lodash/fp/findFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findFrom\">;\n}\n\ndeclare module \"lodash/fp/findLast\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findLast\">;\n}\n\ndeclare module \"lodash/fp/findLastFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findLastFrom\">;\n}\n\ndeclare module \"lodash/fp/flatMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flatMap\">;\n}\n\ndeclare module \"lodash/fp/flatMapDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flatMapDeep\">;\n}\n\ndeclare module \"lodash/fp/flatMapDepth\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flatMapDepth\">;\n}\n\ndeclare module \"lodash/fp/forEach\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forEach\">;\n}\n\ndeclare module \"lodash/fp/forEachRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forEachRight\">;\n}\n\ndeclare module \"lodash/fp/groupBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"groupBy\">;\n}\n\ndeclare module \"lodash/fp/includes\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"includes\">;\n}\n\ndeclare module \"lodash/fp/contains\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"contains\">;\n}\n\ndeclare module \"lodash/fp/includesFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"includesFrom\">;\n}\n\ndeclare module \"lodash/fp/invokeMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invokeMap\">;\n}\n\ndeclare module \"lodash/fp/invokeArgsMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invokeArgsMap\">;\n}\n\ndeclare module \"lodash/fp/keyBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"keyBy\">;\n}\n\ndeclare module \"lodash/fp/indexBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"indexBy\">;\n}\n\ndeclare module \"lodash/fp/map\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"map\">;\n}\n\ndeclare module \"lodash/fp/pluck\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pluck\">;\n}\n\ndeclare module \"lodash/fp/orderBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"orderBy\">;\n}\n\ndeclare module \"lodash/fp/partition\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"partition\">;\n}\n\ndeclare module \"lodash/fp/reduce\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"reduce\">;\n}\n\ndeclare module \"lodash/fp/reduceRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"reduceRight\">;\n}\n\ndeclare module \"lodash/fp/reject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"reject\">;\n}\n\ndeclare module \"lodash/fp/sample\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sample\">;\n}\n\ndeclare module \"lodash/fp/sampleSize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sampleSize\">;\n}\n\ndeclare module \"lodash/fp/shuffle\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"shuffle\">;\n}\n\ndeclare module \"lodash/fp/size\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"size\">;\n}\n\ndeclare module \"lodash/fp/some\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"some\">;\n}\n\ndeclare module \"lodash/fp/any\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"any\">;\n}\n\ndeclare module \"lodash/fp/sortBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sortBy\">;\n}\n\ndeclare module \"lodash/fp/now\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"now\">;\n}\n\ndeclare module \"lodash/fp/after\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"after\">;\n}\n\ndeclare module \"lodash/fp/ary\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"ary\">;\n}\n\ndeclare module \"lodash/fp/nAry\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"nAry\">;\n}\n\ndeclare module \"lodash/fp/before\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"before\">;\n}\n\ndeclare module \"lodash/fp/bind\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"bind\">;\n}\n\ndeclare module \"lodash/fp/bindKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"bindKey\">;\n}\n\ndeclare module \"lodash/fp/curry\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"curry\">;\n}\n\ndeclare module \"lodash/fp/curryN\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"curryN\">;\n}\n\ndeclare module \"lodash/fp/curryRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"curryRight\">;\n}\n\ndeclare module \"lodash/fp/curryRightN\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"curryRightN\">;\n}\n\ndeclare module \"lodash/fp/debounce\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"debounce\">;\n}\n\ndeclare module \"lodash/fp/defer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defer\">;\n}\n\ndeclare module \"lodash/fp/delay\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"delay\">;\n}\n\ndeclare module \"lodash/fp/flip\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flip\">;\n}\n\ndeclare module \"lodash/fp/memoize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"memoize\">;\n}\n\ndeclare module \"lodash/fp/negate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"negate\">;\n}\n\ndeclare module \"lodash/fp/complement\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"complement\">;\n}\n\ndeclare module \"lodash/fp/once\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"once\">;\n}\n\ndeclare module \"lodash/fp/overArgs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"overArgs\">;\n}\n\ndeclare module \"lodash/fp/useWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"useWith\">;\n}\n\ndeclare module \"lodash/fp/partial\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"partial\">;\n}\n\ndeclare module \"lodash/fp/partialRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"partialRight\">;\n}\n\ndeclare module \"lodash/fp/rearg\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"rearg\">;\n}\n\ndeclare module \"lodash/fp/rest\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"rest\">;\n}\n\ndeclare module \"lodash/fp/unapply\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unapply\">;\n}\n\ndeclare module \"lodash/fp/restFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"restFrom\">;\n}\n\ndeclare module \"lodash/fp/spread\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"spread\">;\n}\n\ndeclare module \"lodash/fp/apply\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"apply\">;\n}\n\ndeclare module \"lodash/fp/spreadFrom\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"spreadFrom\">;\n}\n\ndeclare module \"lodash/fp/throttle\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"throttle\">;\n}\n\ndeclare module \"lodash/fp/unary\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unary\">;\n}\n\ndeclare module \"lodash/fp/wrap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"wrap\">;\n}\n\ndeclare module \"lodash/fp/castArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"castArray\">;\n}\n\ndeclare module \"lodash/fp/clone\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"clone\">;\n}\n\ndeclare module \"lodash/fp/cloneDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"cloneDeep\">;\n}\n\ndeclare module \"lodash/fp/cloneDeepWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"cloneDeepWith\">;\n}\n\ndeclare module \"lodash/fp/cloneWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"cloneWith\">;\n}\n\ndeclare module \"lodash/fp/conformsTo\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"conformsTo\">;\n}\n\ndeclare module \"lodash/fp/where\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"where\">;\n}\n\ndeclare module \"lodash/fp/conforms\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"conforms\">;\n}\n\ndeclare module \"lodash/fp/eq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"eq\">;\n}\n\ndeclare module \"lodash/fp/identical\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"identical\">;\n}\n\ndeclare module \"lodash/fp/gt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"gt\">;\n}\n\ndeclare module \"lodash/fp/gte\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"gte\">;\n}\n\ndeclare module \"lodash/fp/isArguments\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isArguments\">;\n}\n\ndeclare module \"lodash/fp/isArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isArray\">;\n}\n\ndeclare module \"lodash/fp/isArrayBuffer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isArrayBuffer\">;\n}\n\ndeclare module \"lodash/fp/isArrayLike\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isArrayLike\">;\n}\n\ndeclare module \"lodash/fp/isArrayLikeObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isArrayLikeObject\">;\n}\n\ndeclare module \"lodash/fp/isBoolean\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isBoolean\">;\n}\n\ndeclare module \"lodash/fp/isBuffer\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isBuffer\">;\n}\n\ndeclare module \"lodash/fp/isDate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isDate\">;\n}\n\ndeclare module \"lodash/fp/isElement\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isElement\">;\n}\n\ndeclare module \"lodash/fp/isEmpty\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isEmpty\">;\n}\n\ndeclare module \"lodash/fp/isEqual\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isEqual\">;\n}\n\ndeclare module \"lodash/fp/equals\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"equals\">;\n}\n\ndeclare module \"lodash/fp/isEqualWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isEqualWith\">;\n}\n\ndeclare module \"lodash/fp/isError\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isError\">;\n}\n\ndeclare module \"lodash/fp/isFinite\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isFinite\">;\n}\n\ndeclare module \"lodash/fp/isFunction\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isFunction\">;\n}\n\ndeclare module \"lodash/fp/isInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isInteger\">;\n}\n\ndeclare module \"lodash/fp/isLength\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isLength\">;\n}\n\ndeclare module \"lodash/fp/isMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isMap\">;\n}\n\ndeclare module \"lodash/fp/isMatch\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isMatch\">;\n}\n\ndeclare module \"lodash/fp/whereEq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"whereEq\">;\n}\n\ndeclare module \"lodash/fp/isMatchWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isMatchWith\">;\n}\n\ndeclare module \"lodash/fp/isNaN\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isNaN\">;\n}\n\ndeclare module \"lodash/fp/isNative\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isNative\">;\n}\n\ndeclare module \"lodash/fp/isNil\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isNil\">;\n}\n\ndeclare module \"lodash/fp/isNull\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isNull\">;\n}\n\ndeclare module \"lodash/fp/isNumber\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isNumber\">;\n}\n\ndeclare module \"lodash/fp/isObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isObject\">;\n}\n\ndeclare module \"lodash/fp/isObjectLike\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isObjectLike\">;\n}\n\ndeclare module \"lodash/fp/isPlainObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isPlainObject\">;\n}\n\ndeclare module \"lodash/fp/isRegExp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isRegExp\">;\n}\n\ndeclare module \"lodash/fp/isSafeInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isSafeInteger\">;\n}\n\ndeclare module \"lodash/fp/isSet\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isSet\">;\n}\n\ndeclare module \"lodash/fp/isString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isString\">;\n}\n\ndeclare module \"lodash/fp/isSymbol\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isSymbol\">;\n}\n\ndeclare module \"lodash/fp/isTypedArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isTypedArray\">;\n}\n\ndeclare module \"lodash/fp/isUndefined\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isUndefined\">;\n}\n\ndeclare module \"lodash/fp/isWeakMap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isWeakMap\">;\n}\n\ndeclare module \"lodash/fp/isWeakSet\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"isWeakSet\">;\n}\n\ndeclare module \"lodash/fp/lt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lt\">;\n}\n\ndeclare module \"lodash/fp/lte\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lte\">;\n}\n\ndeclare module \"lodash/fp/toArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toArray\">;\n}\n\ndeclare module \"lodash/fp/toFinite\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toFinite\">;\n}\n\ndeclare module \"lodash/fp/toInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toInteger\">;\n}\n\ndeclare module \"lodash/fp/toLength\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toLength\">;\n}\n\ndeclare module \"lodash/fp/toNumber\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toNumber\">;\n}\n\ndeclare module \"lodash/fp/toPlainObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toPlainObject\">;\n}\n\ndeclare module \"lodash/fp/toSafeInteger\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toSafeInteger\">;\n}\n\ndeclare module \"lodash/fp/toString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toString\">;\n}\n\ndeclare module \"lodash/fp/add\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"add\">;\n}\n\ndeclare module \"lodash/fp/ceil\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"ceil\">;\n}\n\ndeclare module \"lodash/fp/divide\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"divide\">;\n}\n\ndeclare module \"lodash/fp/floor\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"floor\">;\n}\n\ndeclare module \"lodash/fp/max\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"max\">;\n}\n\ndeclare module \"lodash/fp/maxBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"maxBy\">;\n}\n\ndeclare module \"lodash/fp/mean\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mean\">;\n}\n\ndeclare module \"lodash/fp/meanBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"meanBy\">;\n}\n\ndeclare module \"lodash/fp/min\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"min\">;\n}\n\ndeclare module \"lodash/fp/minBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"minBy\">;\n}\n\ndeclare module \"lodash/fp/multiply\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"multiply\">;\n}\n\ndeclare module \"lodash/fp/round\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"round\">;\n}\n\ndeclare module \"lodash/fp/subtract\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"subtract\">;\n}\n\ndeclare module \"lodash/fp/sum\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sum\">;\n}\n\ndeclare module \"lodash/fp/sumBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"sumBy\">;\n}\n\ndeclare module \"lodash/fp/clamp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"clamp\">;\n}\n\ndeclare module \"lodash/fp/inRange\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"inRange\">;\n}\n\ndeclare module \"lodash/fp/random\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"random\">;\n}\n\ndeclare module \"lodash/fp/assign\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assign\">;\n}\n\ndeclare module \"lodash/fp/assignAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignAll\">;\n}\n\ndeclare module \"lodash/fp/assignInAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignInAll\">;\n}\n\ndeclare module \"lodash/fp/extendAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"extendAll\">;\n}\n\ndeclare module \"lodash/fp/assignIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignIn\">;\n}\n\ndeclare module \"lodash/fp/assignInWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignInWith\">;\n}\n\ndeclare module \"lodash/fp/assignWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignWith\">;\n}\n\ndeclare module \"lodash/fp/assignInAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignInAllWith\">;\n}\n\ndeclare module \"lodash/fp/extendAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"extendAllWith\">;\n}\n\ndeclare module \"lodash/fp/assignAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assignAllWith\">;\n}\n\ndeclare module \"lodash/fp/at\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"at\">;\n}\n\ndeclare module \"lodash/fp/props\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"props\">;\n}\n\ndeclare module \"lodash/fp/paths\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"paths\">;\n}\n\ndeclare module \"lodash/fp/create\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"create\">;\n}\n\ndeclare module \"lodash/fp/defaults\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defaults\">;\n}\n\ndeclare module \"lodash/fp/defaultsAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defaultsAll\">;\n}\n\ndeclare module \"lodash/fp/defaultsDeep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defaultsDeep\">;\n}\n\ndeclare module \"lodash/fp/defaultsDeepAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defaultsDeepAll\">;\n}\n\ndeclare module \"lodash/fp/entries\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"entries\">;\n}\n\ndeclare module \"lodash/fp/entriesIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"entriesIn\">;\n}\n\ndeclare module \"lodash/fp/extend\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"extend\">;\n}\n\ndeclare module \"lodash/fp/extendWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"extendWith\">;\n}\n\ndeclare module \"lodash/fp/findKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findKey\">;\n}\n\ndeclare module \"lodash/fp/findLastKey\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"findLastKey\">;\n}\n\ndeclare module \"lodash/fp/forIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forIn\">;\n}\n\ndeclare module \"lodash/fp/forInRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forInRight\">;\n}\n\ndeclare module \"lodash/fp/forOwn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forOwn\">;\n}\n\ndeclare module \"lodash/fp/forOwnRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"forOwnRight\">;\n}\n\ndeclare module \"lodash/fp/functions\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"functions\">;\n}\n\ndeclare module \"lodash/fp/functionsIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"functionsIn\">;\n}\n\ndeclare module \"lodash/fp/get\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"get\">;\n}\n\ndeclare module \"lodash/fp/prop\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"prop\">;\n}\n\ndeclare module \"lodash/fp/path\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"path\">;\n}\n\ndeclare module \"lodash/fp/getOr\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"getOr\">;\n}\n\ndeclare module \"lodash/fp/propOr\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"propOr\">;\n}\n\ndeclare module \"lodash/fp/pathOr\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pathOr\">;\n}\n\ndeclare module \"lodash/fp/has\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"has\">;\n}\n\ndeclare module \"lodash/fp/hasIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"hasIn\">;\n}\n\ndeclare module \"lodash/fp/invert\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invert\">;\n}\n\ndeclare module \"lodash/fp/invertObj\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invertObj\">;\n}\n\ndeclare module \"lodash/fp/invertBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invertBy\">;\n}\n\ndeclare module \"lodash/fp/invoke\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invoke\">;\n}\n\ndeclare module \"lodash/fp/invokeArgs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"invokeArgs\">;\n}\n\ndeclare module \"lodash/fp/keys\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"keys\">;\n}\n\ndeclare module \"lodash/fp/keysIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"keysIn\">;\n}\n\ndeclare module \"lodash/fp/mapKeys\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mapKeys\">;\n}\n\ndeclare module \"lodash/fp/mapValues\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mapValues\">;\n}\n\ndeclare module \"lodash/fp/merge\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"merge\">;\n}\n\ndeclare module \"lodash/fp/mergeAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mergeAll\">;\n}\n\ndeclare module \"lodash/fp/mergeWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mergeWith\">;\n}\n\ndeclare module \"lodash/fp/mergeAllWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mergeAllWith\">;\n}\n\ndeclare module \"lodash/fp/omit\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"omit\">;\n}\n\ndeclare module \"lodash/fp/omitAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"omitAll\">;\n}\n\ndeclare module \"lodash/fp/omitBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"omitBy\">;\n}\n\ndeclare module \"lodash/fp/pick\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pick\">;\n}\n\ndeclare module \"lodash/fp/pickAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pickAll\">;\n}\n\ndeclare module \"lodash/fp/pickBy\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pickBy\">;\n}\n\ndeclare module \"lodash/fp/result\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"result\">;\n}\n\ndeclare module \"lodash/fp/set\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"set\">;\n}\n\ndeclare module \"lodash/fp/assoc\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assoc\">;\n}\n\ndeclare module \"lodash/fp/assocPath\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"assocPath\">;\n}\n\ndeclare module \"lodash/fp/setWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"setWith\">;\n}\n\ndeclare module \"lodash/fp/toPairs\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toPairs\">;\n}\n\ndeclare module \"lodash/fp/toPairsIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toPairsIn\">;\n}\n\ndeclare module \"lodash/fp/transform\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"transform\">;\n}\n\ndeclare module \"lodash/fp/unset\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unset\">;\n}\n\ndeclare module \"lodash/fp/dissoc\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dissoc\">;\n}\n\ndeclare module \"lodash/fp/dissocPath\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"dissocPath\">;\n}\n\ndeclare module \"lodash/fp/update\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"update\">;\n}\n\ndeclare module \"lodash/fp/updateWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"updateWith\">;\n}\n\ndeclare module \"lodash/fp/values\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"values\">;\n}\n\ndeclare module \"lodash/fp/valuesIn\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"valuesIn\">;\n}\n\ndeclare module \"lodash/fp/tap\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"tap\">;\n}\n\ndeclare module \"lodash/fp/thru\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"thru\">;\n}\n\ndeclare module \"lodash/fp/camelCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"camelCase\">;\n}\n\ndeclare module \"lodash/fp/capitalize\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"capitalize\">;\n}\n\ndeclare module \"lodash/fp/deburr\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"deburr\">;\n}\n\ndeclare module \"lodash/fp/endsWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"endsWith\">;\n}\n\ndeclare module \"lodash/fp/escape\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"escape\">;\n}\n\ndeclare module \"lodash/fp/escapeRegExp\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"escapeRegExp\">;\n}\n\ndeclare module \"lodash/fp/kebabCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"kebabCase\">;\n}\n\ndeclare module \"lodash/fp/lowerCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lowerCase\">;\n}\n\ndeclare module \"lodash/fp/lowerFirst\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"lowerFirst\">;\n}\n\ndeclare module \"lodash/fp/pad\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pad\">;\n}\n\ndeclare module \"lodash/fp/padChars\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"padChars\">;\n}\n\ndeclare module \"lodash/fp/padEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"padEnd\">;\n}\n\ndeclare module \"lodash/fp/padCharsEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"padCharsEnd\">;\n}\n\ndeclare module \"lodash/fp/padStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"padStart\">;\n}\n\ndeclare module \"lodash/fp/padCharsStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"padCharsStart\">;\n}\n\ndeclare module \"lodash/fp/parseInt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"parseInt\">;\n}\n\ndeclare module \"lodash/fp/repeat\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"repeat\">;\n}\n\ndeclare module \"lodash/fp/replace\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"replace\">;\n}\n\ndeclare module \"lodash/fp/snakeCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"snakeCase\">;\n}\n\ndeclare module \"lodash/fp/split\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"split\">;\n}\n\ndeclare module \"lodash/fp/startCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"startCase\">;\n}\n\ndeclare module \"lodash/fp/startsWith\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"startsWith\">;\n}\n\ndeclare module \"lodash/fp/template\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"template\">;\n}\n\ndeclare module \"lodash/fp/toLower\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toLower\">;\n}\n\ndeclare module \"lodash/fp/toUpper\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toUpper\">;\n}\n\ndeclare module \"lodash/fp/trim\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trim\">;\n}\n\ndeclare module \"lodash/fp/trimChars\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trimChars\">;\n}\n\ndeclare module \"lodash/fp/trimEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trimEnd\">;\n}\n\ndeclare module \"lodash/fp/trimCharsEnd\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trimCharsEnd\">;\n}\n\ndeclare module \"lodash/fp/trimStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trimStart\">;\n}\n\ndeclare module \"lodash/fp/trimCharsStart\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"trimCharsStart\">;\n}\n\ndeclare module \"lodash/fp/truncate\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"truncate\">;\n}\n\ndeclare module \"lodash/fp/unescape\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"unescape\">;\n}\n\ndeclare module \"lodash/fp/upperCase\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"upperCase\">;\n}\n\ndeclare module \"lodash/fp/upperFirst\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"upperFirst\">;\n}\n\ndeclare module \"lodash/fp/words\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"words\">;\n}\n\ndeclare module \"lodash/fp/attempt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"attempt\">;\n}\n\ndeclare module \"lodash/fp/bindAll\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"bindAll\">;\n}\n\ndeclare module \"lodash/fp/cond\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"cond\">;\n}\n\ndeclare module \"lodash/fp/constant\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"constant\">;\n}\n\ndeclare module \"lodash/fp/always\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"always\">;\n}\n\ndeclare module \"lodash/fp/defaultTo\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"defaultTo\">;\n}\n\ndeclare module \"lodash/fp/flow\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flow\">;\n}\n\ndeclare module \"lodash/fp/pipe\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pipe\">;\n}\n\ndeclare module \"lodash/fp/flowRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"flowRight\">;\n}\n\ndeclare module \"lodash/fp/compose\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"compose\">;\n}\n\ndeclare module \"lodash/fp/identity\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"identity\">;\n}\n\ndeclare module \"lodash/fp/iteratee\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"iteratee\">;\n}\n\ndeclare module \"lodash/fp/matches\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"matches\">;\n}\n\ndeclare module \"lodash/fp/matchesProperty\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"matchesProperty\">;\n}\n\ndeclare module \"lodash/fp/propEq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"propEq\">;\n}\n\ndeclare module \"lodash/fp/pathEq\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"pathEq\">;\n}\n\ndeclare module \"lodash/fp/method\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"method\">;\n}\n\ndeclare module \"lodash/fp/methodOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"methodOf\">;\n}\n\ndeclare module \"lodash/fp/mixin\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"mixin\">;\n}\n\ndeclare module \"lodash/fp/noConflict\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"noConflict\">;\n}\n\ndeclare module \"lodash/fp/noop\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"noop\">;\n}\n\ndeclare module \"lodash/fp/nthArg\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"nthArg\">;\n}\n\ndeclare module \"lodash/fp/over\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"over\">;\n}\n\ndeclare module \"lodash/fp/juxt\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"juxt\">;\n}\n\ndeclare module \"lodash/fp/overEvery\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"overEvery\">;\n}\n\ndeclare module \"lodash/fp/allPass\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"allPass\">;\n}\n\ndeclare module \"lodash/fp/overSome\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"overSome\">;\n}\n\ndeclare module \"lodash/fp/anyPass\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"anyPass\">;\n}\n\ndeclare module \"lodash/fp/property\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"property\">;\n}\n\ndeclare module \"lodash/fp/propertyOf\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"propertyOf\">;\n}\n\ndeclare module \"lodash/fp/range\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"range\">;\n}\n\ndeclare module \"lodash/fp/rangeStep\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"rangeStep\">;\n}\n\ndeclare module \"lodash/fp/rangeRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"rangeRight\">;\n}\n\ndeclare module \"lodash/fp/rangeStepRight\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"rangeStepRight\">;\n}\n\ndeclare module \"lodash/fp/runInContext\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"runInContext\">;\n}\n\ndeclare module \"lodash/fp/stubArray\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"stubArray\">;\n}\n\ndeclare module \"lodash/fp/stubFalse\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"stubFalse\">;\n}\n\ndeclare module \"lodash/fp/F\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"F\">;\n}\n\ndeclare module \"lodash/fp/stubObject\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"stubObject\">;\n}\n\ndeclare module \"lodash/fp/stubString\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"stubString\">;\n}\n\ndeclare module \"lodash/fp/stubTrue\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"stubTrue\">;\n}\n\ndeclare module \"lodash/fp/T\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"T\">;\n}\n\ndeclare module \"lodash/fp/times\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"times\">;\n}\n\ndeclare module \"lodash/fp/toPath\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"toPath\">;\n}\n\ndeclare module \"lodash/fp/uniqueId\" {\n  declare module.exports: $PropertyType<$Exports<\"lodash/fp\">, \"uniqueId\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/longjohn_vx.x.x.js",
    "content": "// flow-typed signature: 35b888bb7c2c2fe5967e16b304ff9012\n// flow-typed version: <<STUB>>/longjohn_v^0.2.12/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'longjohn'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'longjohn' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'longjohn/dist/longjohn' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'longjohn/dist/longjohn.js' {\n  declare module.exports: $Exports<'longjohn/dist/longjohn'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/markdown-draft-js_vx.x.x.js",
    "content": "// flow-typed signature: 72b2dfcb381160ae074fc97df0df8724\n// flow-typed version: <<STUB>>/markdown-draft-js_v0.6.3/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'markdown-draft-js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'markdown-draft-js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'markdown-draft-js/karma.conf' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/lib/draft-to-markdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/lib/markdown-to-draft' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/src/draft-to-markdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/src/markdown-to-draft' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/test/draft-to-markdown.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/test/idempotency.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'markdown-draft-js/test/markdown-to-draft.spec' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'markdown-draft-js/karma.conf.js' {\n  declare module.exports: $Exports<'markdown-draft-js/karma.conf'>;\n}\ndeclare module 'markdown-draft-js/lib/draft-to-markdown.js' {\n  declare module.exports: $Exports<'markdown-draft-js/lib/draft-to-markdown'>;\n}\ndeclare module 'markdown-draft-js/lib/index.js' {\n  declare module.exports: $Exports<'markdown-draft-js/lib/index'>;\n}\ndeclare module 'markdown-draft-js/lib/markdown-to-draft.js' {\n  declare module.exports: $Exports<'markdown-draft-js/lib/markdown-to-draft'>;\n}\ndeclare module 'markdown-draft-js/src/draft-to-markdown.js' {\n  declare module.exports: $Exports<'markdown-draft-js/src/draft-to-markdown'>;\n}\ndeclare module 'markdown-draft-js/src/index.js' {\n  declare module.exports: $Exports<'markdown-draft-js/src/index'>;\n}\ndeclare module 'markdown-draft-js/src/markdown-to-draft.js' {\n  declare module.exports: $Exports<'markdown-draft-js/src/markdown-to-draft'>;\n}\ndeclare module 'markdown-draft-js/test/draft-to-markdown.spec.js' {\n  declare module.exports: $Exports<'markdown-draft-js/test/draft-to-markdown.spec'>;\n}\ndeclare module 'markdown-draft-js/test/idempotency.spec.js' {\n  declare module.exports: $Exports<'markdown-draft-js/test/idempotency.spec'>;\n}\ndeclare module 'markdown-draft-js/test/markdown-to-draft.spec.js' {\n  declare module.exports: $Exports<'markdown-draft-js/test/markdown-to-draft.spec'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/micromatch_vx.x.x.js",
    "content": "// flow-typed signature: 5f0d83fac77fd2dbc1ff5d6653927b45\n// flow-typed version: <<STUB>>/micromatch_v^3.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'micromatch'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'micromatch' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'micromatch/lib/cache' {\n  declare module.exports: any;\n}\n\ndeclare module 'micromatch/lib/compilers' {\n  declare module.exports: any;\n}\n\ndeclare module 'micromatch/lib/parsers' {\n  declare module.exports: any;\n}\n\ndeclare module 'micromatch/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'micromatch/index' {\n  declare module.exports: $Exports<'micromatch'>;\n}\ndeclare module 'micromatch/index.js' {\n  declare module.exports: $Exports<'micromatch'>;\n}\ndeclare module 'micromatch/lib/cache.js' {\n  declare module.exports: $Exports<'micromatch/lib/cache'>;\n}\ndeclare module 'micromatch/lib/compilers.js' {\n  declare module.exports: $Exports<'micromatch/lib/compilers'>;\n}\ndeclare module 'micromatch/lib/parsers.js' {\n  declare module.exports: $Exports<'micromatch/lib/parsers'>;\n}\ndeclare module 'micromatch/lib/utils.js' {\n  declare module.exports: $Exports<'micromatch/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/moment_v2.3.x.js",
    "content": "// flow-typed signature: 3409270fb7c9e22d114cc0f4ac1dbf36\n// flow-typed version: 148333be22/moment_v2.3.x/flow_>=v0.34.x\n\ntype moment$MomentOptions = {\n  y?: number | string,\n  year?: number | string,\n  years?: number | string,\n  M?: number | string,\n  month?: number | string,\n  months?: number | string,\n  d?: number | string,\n  day?: number | string,\n  days?: number | string,\n  date?: number | string,\n  h?: number | string,\n  hour?: number | string,\n  hours?: number | string,\n  m?: number | string,\n  minute?: number | string,\n  minutes?: number | string,\n  s?: number | string,\n  second?: number | string,\n  seconds?: number | string,\n  ms?: number | string,\n  millisecond?: number | string,\n  milliseconds?: number | string,\n};\n\ntype moment$MomentObject = {\n  years: number,\n  months: number,\n  date: number,\n  hours: number,\n  minutes: number,\n  seconds: number,\n  milliseconds: number,\n};\n\ntype moment$MomentCreationData = {\n  input: string,\n  format: string,\n  locale: Object,\n  isUTC: boolean,\n  strict: boolean,\n};\n\ntype moment$CalendarFormat = string | ((moment: moment$Moment) => string);\n\ntype moment$CalendarFormats = {\n  sameDay?: moment$CalendarFormat,\n  nextDay?: moment$CalendarFormat,\n  nextWeek?: moment$CalendarFormat,\n  lastDay?: moment$CalendarFormat,\n  lastWeek?: moment$CalendarFormat,\n  sameElse?: moment$CalendarFormat,\n};\n\ndeclare class moment$LocaleData {\n  months(moment: moment$Moment): string,\n  monthsShort(moment: moment$Moment): string,\n  monthsParse(month: string): number,\n  weekdays(moment: moment$Moment): string,\n  weekdaysShort(moment: moment$Moment): string,\n  weekdaysMin(moment: moment$Moment): string,\n  weekdaysParse(weekDay: string): number,\n  longDateFormat(dateFormat: string): string,\n  isPM(date: string): boolean,\n  meridiem(hours: number, minutes: number, isLower: boolean): string,\n  calendar(\n    key:\n      | 'sameDay'\n      | 'nextDay'\n      | 'lastDay'\n      | 'nextWeek'\n      | 'prevWeek'\n      | 'sameElse',\n    moment: moment$Moment\n  ): string,\n  relativeTime(\n    number: number,\n    withoutSuffix: boolean,\n    key: 's' | 'm' | 'mm' | 'h' | 'hh' | 'd' | 'dd' | 'M' | 'MM' | 'y' | 'yy',\n    isFuture: boolean\n  ): string,\n  pastFuture(diff: any, relTime: string): string,\n  ordinal(number: number): string,\n  preparse(str: string): any,\n  postformat(str: string): any,\n  week(moment: moment$Moment): string,\n  invalidDate(): string,\n  firstDayOfWeek(): number,\n  firstDayOfYear(): number,\n}\ndeclare class moment$MomentDuration {\n  humanize(suffix?: boolean): string,\n  milliseconds(): number,\n  asMilliseconds(): number,\n  seconds(): number,\n  asSeconds(): number,\n  minutes(): number,\n  asMinutes(): number,\n  hours(): number,\n  asHours(): number,\n  days(): number,\n  asDays(): number,\n  months(): number,\n  asMonths(): number,\n  years(): number,\n  asYears(): number,\n  add(value: number | moment$MomentDuration | Object, unit?: string): this,\n  subtract(value: number | moment$MomentDuration | Object, unit?: string): this,\n  as(unit: string): number,\n  get(unit: string): number,\n  toJSON(): string,\n  toISOString(): string,\n  isValid(): boolean,\n}\ndeclare class moment$Moment {\n  static ISO_8601: string,\n  static (\n    string?: string,\n    format?: string | Array<string>,\n    locale?: string,\n    strict?: boolean\n  ): moment$Moment,\n  static (\n    initDate: ?Object | number | Date | Array<number> | moment$Moment | string\n  ): moment$Moment,\n  static unix(seconds: number): moment$Moment,\n  static utc(): moment$Moment,\n  static utc(number: number | Array<number>): moment$Moment,\n  static utc(\n    str: string,\n    str2?: string | Array<string>,\n    str3?: string\n  ): moment$Moment,\n  static utc(moment: moment$Moment): moment$Moment,\n  static utc(date: Date): moment$Moment,\n  static parseZone(): moment$Moment,\n  static parseZone(rawDate: string): moment$Moment,\n  static parseZone(\n    rawDate: string,\n    format: string | Array<string>\n  ): moment$Moment,\n  static parseZone(\n    rawDate: string,\n    format: string,\n    strict: boolean\n  ): moment$Moment,\n  static parseZone(\n    rawDate: string,\n    format: string,\n    locale: string,\n    strict: boolean\n  ): moment$Moment,\n  isValid(): boolean,\n  invalidAt(): 0 | 1 | 2 | 3 | 4 | 5 | 6,\n  creationData(): moment$MomentCreationData,\n  millisecond(number: number): this,\n  milliseconds(number: number): this,\n  millisecond(): number,\n  milliseconds(): number,\n  second(number: number): this,\n  seconds(number: number): this,\n  second(): number,\n  seconds(): number,\n  minute(number: number): this,\n  minutes(number: number): this,\n  minute(): number,\n  minutes(): number,\n  hour(number: number): this,\n  hours(number: number): this,\n  hour(): number,\n  hours(): number,\n  date(number: number): this,\n  dates(number: number): this,\n  date(): number,\n  dates(): number,\n  day(day: number | string): this,\n  days(day: number | string): this,\n  day(): number,\n  days(): number,\n  weekday(number: number): this,\n  weekday(): number,\n  isoWeekday(number: number): this,\n  isoWeekday(): number,\n  dayOfYear(number: number): this,\n  dayOfYear(): number,\n  week(number: number): this,\n  weeks(number: number): this,\n  week(): number,\n  weeks(): number,\n  isoWeek(number: number): this,\n  isoWeeks(number: number): this,\n  isoWeek(): number,\n  isoWeeks(): number,\n  month(number: number): this,\n  months(number: number): this,\n  month(): number,\n  months(): number,\n  quarter(number: number): this,\n  quarter(): number,\n  year(number: number): this,\n  years(number: number): this,\n  year(): number,\n  years(): number,\n  weekYear(number: number): this,\n  weekYear(): number,\n  isoWeekYear(number: number): this,\n  isoWeekYear(): number,\n  weeksInYear(): number,\n  isoWeeksInYear(): number,\n  get(string: string): number,\n  set(unit: string, value: number): this,\n  set(options: { [unit: string]: number }): this,\n  static max(...dates: Array<moment$Moment>): moment$Moment,\n  static max(dates: Array<moment$Moment>): moment$Moment,\n  static min(...dates: Array<moment$Moment>): moment$Moment,\n  static min(dates: Array<moment$Moment>): moment$Moment,\n  add(\n    value: number | moment$MomentDuration | moment$Moment | Object,\n    unit?: string\n  ): this,\n  subtract(\n    value: number | moment$MomentDuration | moment$Moment | string | Object,\n    unit?: string\n  ): this,\n  startOf(unit: string): this,\n  endOf(unit: string): this,\n  local(): this,\n  utc(): this,\n  utcOffset(offset: number | string): this,\n  utcOffset(): number,\n  format(format?: string): string,\n  fromNow(removeSuffix?: boolean): string,\n  from(\n    value: moment$Moment | string | number | Date | Array<number>,\n    removePrefix?: boolean\n  ): string,\n  toNow(removePrefix?: boolean): string,\n  to(\n    value: moment$Moment | string | number | Date | Array<number>,\n    removePrefix?: boolean\n  ): string,\n  calendar(refTime?: any, formats?: moment$CalendarFormats): string,\n  diff(\n    date: moment$Moment | string | number | Date | Array<number>,\n    format?: string,\n    floating?: boolean\n  ): number,\n  valueOf(): number,\n  unix(): number,\n  daysInMonth(): number,\n  toDate(): Date,\n  toArray(): Array<number>,\n  toJSON(): string,\n  toISOString(): string,\n  toObject(): moment$MomentObject,\n  isBefore(\n    date?: moment$Moment | string | number | Date | Array<number>,\n    units?: ?string\n  ): boolean,\n  isSame(\n    date?: moment$Moment | string | number | Date | Array<number>,\n    units?: ?string\n  ): boolean,\n  isAfter(\n    date?: moment$Moment | string | number | Date | Array<number>,\n    units?: ?string\n  ): boolean,\n  isSameOrBefore(\n    date?: moment$Moment | string | number | Date | Array<number>,\n    units?: ?string\n  ): boolean,\n  isSameOrAfter(\n    date?: moment$Moment | string | number | Date | Array<number>,\n    units?: ?string\n  ): boolean,\n  isBetween(\n    date: moment$Moment | string | number | Date | Array<number>\n  ): boolean,\n  isDST(): boolean,\n  isDSTShifted(): boolean,\n  isLeapYear(): boolean,\n  clone(): moment$Moment,\n  static isMoment(obj: any): boolean,\n  static isDate(obj: any): boolean,\n  static locale(locale: string, localeData?: Object): string,\n  static updateLocale(locale: string, localeData?: ?Object): void,\n  static locale(locales: Array<string>): string,\n  locale(locale: string, customization?: Object | null): moment$Moment,\n  locale(): string,\n  static months(): Array<string>,\n  static monthsShort(): Array<string>,\n  static weekdays(): Array<string>,\n  static weekdaysShort(): Array<string>,\n  static weekdaysMin(): Array<string>,\n  static months(): string,\n  static monthsShort(): string,\n  static weekdays(): string,\n  static weekdaysShort(): string,\n  static weekdaysMin(): string,\n  static localeData(key?: string): moment$LocaleData,\n  static duration(\n    value: number | Object | string,\n    unit?: string\n  ): moment$MomentDuration,\n  static isDuration(obj: any): boolean,\n  static normalizeUnits(unit: string): string,\n  static invalid(object: any): moment$Moment,\n}\n\ndeclare module 'moment' {\n  declare module.exports: Class<moment$Moment>;\n}\n"
  },
  {
    "path": "flow-typed/npm/ms_vx.x.x.js",
    "content": "// flow-typed signature: 920f2fd7d370e63b28ba6b9002a0ad7c\n// flow-typed version: <<STUB>>/ms_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'ms'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'ms' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'ms/index' {\n  declare module.exports: $Exports<'ms'>;\n}\ndeclare module 'ms/index.js' {\n  declare module.exports: $Exports<'ms'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/newrelic_vx.x.x.js",
    "content": "// flow-typed signature: 1c7a19e90794bb3549c2bee6b3bac1cd\n// flow-typed version: <<STUB>>/newrelic_v^2.2.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'newrelic'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'newrelic' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'newrelic/api' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/bin/ca-gen' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/bin/test-naming-rules' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/agent' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/api' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/facts' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/http-agents' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/parse-response' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/remote-method' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/collector/ssl/certificates' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/config.default' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/parse-sql' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/parsed-statement' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/query-parsers/sql' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/statement-matcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/tracer' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/db/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/environment' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/errors/aggregator' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/errors/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/feature_flags' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/amqplib' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/bluebird' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/cassandra-driver' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/connect' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/async_hooks' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/child_process' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/crypto' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/dns' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/domain' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/fs' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/globals' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/inspector' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/net' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/timers' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/core/zlib' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/director' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/express' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/generic-pool' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/hapi' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/ioredis' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/memcached' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/mongodb' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/mysql' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/node-cassandra-cql' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/oracle' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/pg' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/promise' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/q' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/redis' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/restify' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentation/when' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/instrumentations' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/mapper' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/names' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/normalizer' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/normalizer/rule' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/normalizer/tx_segment' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/cassandra' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/custom' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/express' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/generic' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/http_external' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/memcached' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/message-transaction' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/other' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/metrics/recorders/redis' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/parse-proc-cpuinfo' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/parse-proc-meminfo' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/reservoir' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/sampler' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/constants' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/datastore-shim' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/message-shim' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/shim' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/transaction-shim' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shim/webframework-shim' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/shimmer' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/stats/apdex' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/stats/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/system-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/timer' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/handle' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/name-state' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/trace/aggregator' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/trace/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/trace/segment' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/tracer/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/transaction/tracer/instrumentation/outbound' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/uninstrumented' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/arity' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/arrays' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/cat' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/codec' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/copy' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/deep-equal' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/flatten' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/hashes' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/label-parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/properties' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/safe-json' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/sql/obfuscate' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/stream-sink' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/sum-children' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/util/urltils' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/aws-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/azure-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/common' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/docker-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/gcp-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/lib/utilization/pcf-info' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/newrelic' {\n  declare module.exports: any;\n}\n\ndeclare module 'newrelic/stub_api' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'newrelic/api.js' {\n  declare module.exports: $Exports<'newrelic/api'>;\n}\ndeclare module 'newrelic/bin/ca-gen.js' {\n  declare module.exports: $Exports<'newrelic/bin/ca-gen'>;\n}\ndeclare module 'newrelic/bin/test-naming-rules.js' {\n  declare module.exports: $Exports<'newrelic/bin/test-naming-rules'>;\n}\ndeclare module 'newrelic/index' {\n  declare module.exports: $Exports<'newrelic'>;\n}\ndeclare module 'newrelic/index.js' {\n  declare module.exports: $Exports<'newrelic'>;\n}\ndeclare module 'newrelic/lib/agent.js' {\n  declare module.exports: $Exports<'newrelic/lib/agent'>;\n}\ndeclare module 'newrelic/lib/collector/api.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/api'>;\n}\ndeclare module 'newrelic/lib/collector/facts.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/facts'>;\n}\ndeclare module 'newrelic/lib/collector/http-agents.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/http-agents'>;\n}\ndeclare module 'newrelic/lib/collector/parse-response.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/parse-response'>;\n}\ndeclare module 'newrelic/lib/collector/remote-method.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/remote-method'>;\n}\ndeclare module 'newrelic/lib/collector/ssl/certificates.js' {\n  declare module.exports: $Exports<'newrelic/lib/collector/ssl/certificates'>;\n}\ndeclare module 'newrelic/lib/config.default.js' {\n  declare module.exports: $Exports<'newrelic/lib/config.default'>;\n}\ndeclare module 'newrelic/lib/config.js' {\n  declare module.exports: $Exports<'newrelic/lib/config'>;\n}\ndeclare module 'newrelic/lib/db/parse-sql.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/parse-sql'>;\n}\ndeclare module 'newrelic/lib/db/parsed-statement.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/parsed-statement'>;\n}\ndeclare module 'newrelic/lib/db/query-parsers/sql.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/query-parsers/sql'>;\n}\ndeclare module 'newrelic/lib/db/statement-matcher.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/statement-matcher'>;\n}\ndeclare module 'newrelic/lib/db/tracer.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/tracer'>;\n}\ndeclare module 'newrelic/lib/db/utils.js' {\n  declare module.exports: $Exports<'newrelic/lib/db/utils'>;\n}\ndeclare module 'newrelic/lib/environment.js' {\n  declare module.exports: $Exports<'newrelic/lib/environment'>;\n}\ndeclare module 'newrelic/lib/errors/aggregator.js' {\n  declare module.exports: $Exports<'newrelic/lib/errors/aggregator'>;\n}\ndeclare module 'newrelic/lib/errors/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/errors/index'>;\n}\ndeclare module 'newrelic/lib/feature_flags.js' {\n  declare module.exports: $Exports<'newrelic/lib/feature_flags'>;\n}\ndeclare module 'newrelic/lib/instrumentation/amqplib.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/amqplib'>;\n}\ndeclare module 'newrelic/lib/instrumentation/bluebird.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/bluebird'>;\n}\ndeclare module 'newrelic/lib/instrumentation/cassandra-driver.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/cassandra-driver'>;\n}\ndeclare module 'newrelic/lib/instrumentation/connect.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/connect'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/async_hooks.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/async_hooks'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/child_process.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/child_process'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/crypto.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/crypto'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/dns.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/dns'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/domain.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/domain'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/fs.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/fs'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/globals.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/globals'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/http.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/http'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/inspector.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/inspector'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/net.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/net'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/timers.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/timers'>;\n}\ndeclare module 'newrelic/lib/instrumentation/core/zlib.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/core/zlib'>;\n}\ndeclare module 'newrelic/lib/instrumentation/director.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/director'>;\n}\ndeclare module 'newrelic/lib/instrumentation/express.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/express'>;\n}\ndeclare module 'newrelic/lib/instrumentation/generic-pool.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/generic-pool'>;\n}\ndeclare module 'newrelic/lib/instrumentation/hapi.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/hapi'>;\n}\ndeclare module 'newrelic/lib/instrumentation/ioredis.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/ioredis'>;\n}\ndeclare module 'newrelic/lib/instrumentation/memcached.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/memcached'>;\n}\ndeclare module 'newrelic/lib/instrumentation/mongodb.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/mongodb'>;\n}\ndeclare module 'newrelic/lib/instrumentation/mysql.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/mysql'>;\n}\ndeclare module 'newrelic/lib/instrumentation/node-cassandra-cql.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/node-cassandra-cql'>;\n}\ndeclare module 'newrelic/lib/instrumentation/oracle.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/oracle'>;\n}\ndeclare module 'newrelic/lib/instrumentation/pg.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/pg'>;\n}\ndeclare module 'newrelic/lib/instrumentation/promise.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/promise'>;\n}\ndeclare module 'newrelic/lib/instrumentation/q.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/q'>;\n}\ndeclare module 'newrelic/lib/instrumentation/redis.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/redis'>;\n}\ndeclare module 'newrelic/lib/instrumentation/restify.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/restify'>;\n}\ndeclare module 'newrelic/lib/instrumentation/when.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentation/when'>;\n}\ndeclare module 'newrelic/lib/instrumentations.js' {\n  declare module.exports: $Exports<'newrelic/lib/instrumentations'>;\n}\ndeclare module 'newrelic/lib/logger.js' {\n  declare module.exports: $Exports<'newrelic/lib/logger'>;\n}\ndeclare module 'newrelic/lib/metrics/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/index'>;\n}\ndeclare module 'newrelic/lib/metrics/mapper.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/mapper'>;\n}\ndeclare module 'newrelic/lib/metrics/names.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/names'>;\n}\ndeclare module 'newrelic/lib/metrics/normalizer.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/normalizer'>;\n}\ndeclare module 'newrelic/lib/metrics/normalizer/rule.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/normalizer/rule'>;\n}\ndeclare module 'newrelic/lib/metrics/normalizer/tx_segment.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/normalizer/tx_segment'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/cassandra.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/cassandra'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/custom.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/custom'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/express.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/express'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/generic.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/generic'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/http_external.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/http_external'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/http.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/http'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/memcached.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/memcached'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/message-transaction.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/message-transaction'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/other.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/other'>;\n}\ndeclare module 'newrelic/lib/metrics/recorders/redis.js' {\n  declare module.exports: $Exports<'newrelic/lib/metrics/recorders/redis'>;\n}\ndeclare module 'newrelic/lib/parse-proc-cpuinfo.js' {\n  declare module.exports: $Exports<'newrelic/lib/parse-proc-cpuinfo'>;\n}\ndeclare module 'newrelic/lib/parse-proc-meminfo.js' {\n  declare module.exports: $Exports<'newrelic/lib/parse-proc-meminfo'>;\n}\ndeclare module 'newrelic/lib/reservoir.js' {\n  declare module.exports: $Exports<'newrelic/lib/reservoir'>;\n}\ndeclare module 'newrelic/lib/sampler.js' {\n  declare module.exports: $Exports<'newrelic/lib/sampler'>;\n}\ndeclare module 'newrelic/lib/shim/constants.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/constants'>;\n}\ndeclare module 'newrelic/lib/shim/datastore-shim.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/datastore-shim'>;\n}\ndeclare module 'newrelic/lib/shim/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/index'>;\n}\ndeclare module 'newrelic/lib/shim/message-shim.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/message-shim'>;\n}\ndeclare module 'newrelic/lib/shim/shim.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/shim'>;\n}\ndeclare module 'newrelic/lib/shim/transaction-shim.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/transaction-shim'>;\n}\ndeclare module 'newrelic/lib/shim/webframework-shim.js' {\n  declare module.exports: $Exports<'newrelic/lib/shim/webframework-shim'>;\n}\ndeclare module 'newrelic/lib/shimmer.js' {\n  declare module.exports: $Exports<'newrelic/lib/shimmer'>;\n}\ndeclare module 'newrelic/lib/stats/apdex.js' {\n  declare module.exports: $Exports<'newrelic/lib/stats/apdex'>;\n}\ndeclare module 'newrelic/lib/stats/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/stats/index'>;\n}\ndeclare module 'newrelic/lib/system-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/system-info'>;\n}\ndeclare module 'newrelic/lib/timer.js' {\n  declare module.exports: $Exports<'newrelic/lib/timer'>;\n}\ndeclare module 'newrelic/lib/transaction/handle.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/handle'>;\n}\ndeclare module 'newrelic/lib/transaction/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/index'>;\n}\ndeclare module 'newrelic/lib/transaction/name-state.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/name-state'>;\n}\ndeclare module 'newrelic/lib/transaction/trace/aggregator.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/trace/aggregator'>;\n}\ndeclare module 'newrelic/lib/transaction/trace/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/trace/index'>;\n}\ndeclare module 'newrelic/lib/transaction/trace/segment.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/trace/segment'>;\n}\ndeclare module 'newrelic/lib/transaction/tracer/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/tracer/index'>;\n}\ndeclare module 'newrelic/lib/transaction/tracer/instrumentation/outbound.js' {\n  declare module.exports: $Exports<'newrelic/lib/transaction/tracer/instrumentation/outbound'>;\n}\ndeclare module 'newrelic/lib/uninstrumented.js' {\n  declare module.exports: $Exports<'newrelic/lib/uninstrumented'>;\n}\ndeclare module 'newrelic/lib/util/arity.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/arity'>;\n}\ndeclare module 'newrelic/lib/util/arrays.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/arrays'>;\n}\ndeclare module 'newrelic/lib/util/cat.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/cat'>;\n}\ndeclare module 'newrelic/lib/util/codec.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/codec'>;\n}\ndeclare module 'newrelic/lib/util/copy.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/copy'>;\n}\ndeclare module 'newrelic/lib/util/deep-equal.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/deep-equal'>;\n}\ndeclare module 'newrelic/lib/util/flatten.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/flatten'>;\n}\ndeclare module 'newrelic/lib/util/hashes.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/hashes'>;\n}\ndeclare module 'newrelic/lib/util/label-parser.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/label-parser'>;\n}\ndeclare module 'newrelic/lib/util/logger.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/logger'>;\n}\ndeclare module 'newrelic/lib/util/properties.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/properties'>;\n}\ndeclare module 'newrelic/lib/util/safe-json.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/safe-json'>;\n}\ndeclare module 'newrelic/lib/util/sql/obfuscate.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/sql/obfuscate'>;\n}\ndeclare module 'newrelic/lib/util/stream-sink.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/stream-sink'>;\n}\ndeclare module 'newrelic/lib/util/sum-children.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/sum-children'>;\n}\ndeclare module 'newrelic/lib/util/urltils.js' {\n  declare module.exports: $Exports<'newrelic/lib/util/urltils'>;\n}\ndeclare module 'newrelic/lib/utilization/aws-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/aws-info'>;\n}\ndeclare module 'newrelic/lib/utilization/azure-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/azure-info'>;\n}\ndeclare module 'newrelic/lib/utilization/common.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/common'>;\n}\ndeclare module 'newrelic/lib/utilization/docker-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/docker-info'>;\n}\ndeclare module 'newrelic/lib/utilization/gcp-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/gcp-info'>;\n}\ndeclare module 'newrelic/lib/utilization/index.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/index'>;\n}\ndeclare module 'newrelic/lib/utilization/pcf-info.js' {\n  declare module.exports: $Exports<'newrelic/lib/utilization/pcf-info'>;\n}\ndeclare module 'newrelic/newrelic.js' {\n  declare module.exports: $Exports<'newrelic/newrelic'>;\n}\ndeclare module 'newrelic/stub_api.js' {\n  declare module.exports: $Exports<'newrelic/stub_api'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/node-env-file_vx.x.x.js",
    "content": "// flow-typed signature: dfc08be5112272c9584a649f4163aaeb\n// flow-typed version: <<STUB>>/node-env-file_v^0.1.8/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'node-env-file'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'node-env-file' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'node-env-file/examples/basic' {\n  declare module.exports: any;\n}\n\ndeclare module 'node-env-file/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'node-env-file/test/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'node-env-file/test/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'node-env-file/examples/basic.js' {\n  declare module.exports: $Exports<'node-env-file/examples/basic'>;\n}\ndeclare module 'node-env-file/index' {\n  declare module.exports: $Exports<'node-env-file'>;\n}\ndeclare module 'node-env-file/index.js' {\n  declare module.exports: $Exports<'node-env-file'>;\n}\ndeclare module 'node-env-file/lib/index.js' {\n  declare module.exports: $Exports<'node-env-file/lib/index'>;\n}\ndeclare module 'node-env-file/test/helper.js' {\n  declare module.exports: $Exports<'node-env-file/test/helper'>;\n}\ndeclare module 'node-env-file/test/index.js' {\n  declare module.exports: $Exports<'node-env-file/test/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/node-fetch_vx.x.x.js",
    "content": "// flow-typed signature: 8c543d40e1c1312ee9722e9dafa0ca28\n// flow-typed version: <<STUB>>/node-fetch_v2.5.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'node-fetch'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'node-fetch' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'node-fetch/browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'node-fetch/lib/index.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'node-fetch/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'node-fetch/browser.js' {\n  declare module.exports: $Exports<'node-fetch/browser'>;\n}\ndeclare module 'node-fetch/lib/index.es.js' {\n  declare module.exports: $Exports<'node-fetch/lib/index.es'>;\n}\ndeclare module 'node-fetch/lib/index.js' {\n  declare module.exports: $Exports<'node-fetch/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/node-localstorage_vx.x.x.js",
    "content": "// flow-typed signature: c8e26c4880c280db6dead72f936f154b\n// flow-typed version: <<STUB>>/node-localstorage_v^1.3.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'node-localstorage'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'node-localstorage' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'node-localstorage/LocalStorage' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'node-localstorage/LocalStorage.js' {\n  declare module.exports: $Exports<'node-localstorage/LocalStorage'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/nodemon_vx.x.x.js",
    "content": "// flow-typed signature: 8f3ee3770fb1bee2a9ac9cba57a3eee4\n// flow-typed version: <<STUB>>/nodemon_v^1.11.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'nodemon'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'nodemon' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'nodemon/bin/nodemon' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/cli/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/cli/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/config/command' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/config/defaults' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/config/exec' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/config/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/config/load' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/help/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/monitor/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/monitor/match' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/monitor/run' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/monitor/watch' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/nodemon' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/rules/add' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/rules/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/rules/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/spawn' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/bus' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/clone' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/colour' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/log' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/utils/merge' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/lib/version' {\n  declare module.exports: any;\n}\n\ndeclare module 'nodemon/web/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'nodemon/bin/nodemon.js' {\n  declare module.exports: $Exports<'nodemon/bin/nodemon'>;\n}\ndeclare module 'nodemon/lib/cli/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/cli/index'>;\n}\ndeclare module 'nodemon/lib/cli/parse.js' {\n  declare module.exports: $Exports<'nodemon/lib/cli/parse'>;\n}\ndeclare module 'nodemon/lib/config/command.js' {\n  declare module.exports: $Exports<'nodemon/lib/config/command'>;\n}\ndeclare module 'nodemon/lib/config/defaults.js' {\n  declare module.exports: $Exports<'nodemon/lib/config/defaults'>;\n}\ndeclare module 'nodemon/lib/config/exec.js' {\n  declare module.exports: $Exports<'nodemon/lib/config/exec'>;\n}\ndeclare module 'nodemon/lib/config/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/config/index'>;\n}\ndeclare module 'nodemon/lib/config/load.js' {\n  declare module.exports: $Exports<'nodemon/lib/config/load'>;\n}\ndeclare module 'nodemon/lib/help/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/help/index'>;\n}\ndeclare module 'nodemon/lib/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/index'>;\n}\ndeclare module 'nodemon/lib/monitor/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/monitor/index'>;\n}\ndeclare module 'nodemon/lib/monitor/match.js' {\n  declare module.exports: $Exports<'nodemon/lib/monitor/match'>;\n}\ndeclare module 'nodemon/lib/monitor/run.js' {\n  declare module.exports: $Exports<'nodemon/lib/monitor/run'>;\n}\ndeclare module 'nodemon/lib/monitor/watch.js' {\n  declare module.exports: $Exports<'nodemon/lib/monitor/watch'>;\n}\ndeclare module 'nodemon/lib/nodemon.js' {\n  declare module.exports: $Exports<'nodemon/lib/nodemon'>;\n}\ndeclare module 'nodemon/lib/rules/add.js' {\n  declare module.exports: $Exports<'nodemon/lib/rules/add'>;\n}\ndeclare module 'nodemon/lib/rules/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/rules/index'>;\n}\ndeclare module 'nodemon/lib/rules/parse.js' {\n  declare module.exports: $Exports<'nodemon/lib/rules/parse'>;\n}\ndeclare module 'nodemon/lib/spawn.js' {\n  declare module.exports: $Exports<'nodemon/lib/spawn'>;\n}\ndeclare module 'nodemon/lib/utils/bus.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/bus'>;\n}\ndeclare module 'nodemon/lib/utils/clone.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/clone'>;\n}\ndeclare module 'nodemon/lib/utils/colour.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/colour'>;\n}\ndeclare module 'nodemon/lib/utils/index.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/index'>;\n}\ndeclare module 'nodemon/lib/utils/log.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/log'>;\n}\ndeclare module 'nodemon/lib/utils/merge.js' {\n  declare module.exports: $Exports<'nodemon/lib/utils/merge'>;\n}\ndeclare module 'nodemon/lib/version.js' {\n  declare module.exports: $Exports<'nodemon/lib/version'>;\n}\ndeclare module 'nodemon/web/index.js' {\n  declare module.exports: $Exports<'nodemon/web/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/now-env_vx.x.x.js",
    "content": "// flow-typed signature: d5245c9e405c61c1286f26f51dfed66f\n// flow-typed version: <<STUB>>/now-env_v^3.0.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'now-env'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'now-env' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'now-env/lib/apply-env' {\n  declare module.exports: any;\n}\n\ndeclare module 'now-env/lib/get-value' {\n  declare module.exports: any;\n}\n\ndeclare module 'now-env/lib/load-now-json' {\n  declare module.exports: any;\n}\n\ndeclare module 'now-env/lib/load-pkg-json' {\n  declare module.exports: any;\n}\n\ndeclare module 'now-env/lib/load-required' {\n  declare module.exports: any;\n}\n\ndeclare module 'now-env/lib/load-secrets' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'now-env/index' {\n  declare module.exports: $Exports<'now-env'>;\n}\ndeclare module 'now-env/index.js' {\n  declare module.exports: $Exports<'now-env'>;\n}\ndeclare module 'now-env/lib/apply-env.js' {\n  declare module.exports: $Exports<'now-env/lib/apply-env'>;\n}\ndeclare module 'now-env/lib/get-value.js' {\n  declare module.exports: $Exports<'now-env/lib/get-value'>;\n}\ndeclare module 'now-env/lib/load-now-json.js' {\n  declare module.exports: $Exports<'now-env/lib/load-now-json'>;\n}\ndeclare module 'now-env/lib/load-pkg-json.js' {\n  declare module.exports: $Exports<'now-env/lib/load-pkg-json'>;\n}\ndeclare module 'now-env/lib/load-required.js' {\n  declare module.exports: $Exports<'now-env/lib/load-required'>;\n}\ndeclare module 'now-env/lib/load-secrets.js' {\n  declare module.exports: $Exports<'now-env/lib/load-secrets'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/offline-plugin_vx.x.x.js",
    "content": "// flow-typed signature: bdb9f3ca85cda6553a28a4491f6d9c9e\n// flow-typed version: <<STUB>>/offline-plugin_v^4.8.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'offline-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'offline-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'offline-plugin/lib/app-cache' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/default-options' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/loaders/fonts-css' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/loaders/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/async-waituntil' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/runtime-loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/sw-loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/sw-polyfill' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/sw-template' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/misc/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/lib/service-worker' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/runtime' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/tpls/empty-entry' {\n  declare module.exports: any;\n}\n\ndeclare module 'offline-plugin/tpls/runtime-template' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'offline-plugin/lib/app-cache.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/app-cache'>;\n}\ndeclare module 'offline-plugin/lib/default-options.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/default-options'>;\n}\ndeclare module 'offline-plugin/lib/index.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/index'>;\n}\ndeclare module 'offline-plugin/lib/loaders/fonts-css.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/loaders/fonts-css'>;\n}\ndeclare module 'offline-plugin/lib/loaders/index.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/loaders/index'>;\n}\ndeclare module 'offline-plugin/lib/misc/async-waituntil.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/async-waituntil'>;\n}\ndeclare module 'offline-plugin/lib/misc/runtime-loader.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/runtime-loader'>;\n}\ndeclare module 'offline-plugin/lib/misc/sw-loader.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/sw-loader'>;\n}\ndeclare module 'offline-plugin/lib/misc/sw-polyfill.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/sw-polyfill'>;\n}\ndeclare module 'offline-plugin/lib/misc/sw-template.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/sw-template'>;\n}\ndeclare module 'offline-plugin/lib/misc/utils.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/misc/utils'>;\n}\ndeclare module 'offline-plugin/lib/service-worker.js' {\n  declare module.exports: $Exports<'offline-plugin/lib/service-worker'>;\n}\ndeclare module 'offline-plugin/runtime.js' {\n  declare module.exports: $Exports<'offline-plugin/runtime'>;\n}\ndeclare module 'offline-plugin/tpls/empty-entry.js' {\n  declare module.exports: $Exports<'offline-plugin/tpls/empty-entry'>;\n}\ndeclare module 'offline-plugin/tpls/runtime-template.js' {\n  declare module.exports: $Exports<'offline-plugin/tpls/runtime-template'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/optics-agent_vx.x.x.js",
    "content": "// flow-typed signature: 004e07cb00ee3e946e888bb054a3dc92\n// flow-typed version: <<STUB>>/optics-agent_v^1.1.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'optics-agent'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'optics-agent' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'optics-agent/dist/Agent' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/DefaultAgent' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/Instrument' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/Normalize' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/normalizedPrinter' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/Proto' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/Report' {\n  declare module.exports: any;\n}\n\ndeclare module 'optics-agent/dist/separateOperations' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'optics-agent/dist/Agent.js' {\n  declare module.exports: $Exports<'optics-agent/dist/Agent'>;\n}\ndeclare module 'optics-agent/dist/DefaultAgent.js' {\n  declare module.exports: $Exports<'optics-agent/dist/DefaultAgent'>;\n}\ndeclare module 'optics-agent/dist/index.js' {\n  declare module.exports: $Exports<'optics-agent/dist/index'>;\n}\ndeclare module 'optics-agent/dist/Instrument.js' {\n  declare module.exports: $Exports<'optics-agent/dist/Instrument'>;\n}\ndeclare module 'optics-agent/dist/Normalize.js' {\n  declare module.exports: $Exports<'optics-agent/dist/Normalize'>;\n}\ndeclare module 'optics-agent/dist/normalizedPrinter.js' {\n  declare module.exports: $Exports<'optics-agent/dist/normalizedPrinter'>;\n}\ndeclare module 'optics-agent/dist/Proto.js' {\n  declare module.exports: $Exports<'optics-agent/dist/Proto'>;\n}\ndeclare module 'optics-agent/dist/Report.js' {\n  declare module.exports: $Exports<'optics-agent/dist/Report'>;\n}\ndeclare module 'optics-agent/dist/separateOperations.js' {\n  declare module.exports: $Exports<'optics-agent/dist/separateOperations'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/passport-facebook_vx.x.x.js",
    "content": "// flow-typed signature: facdb316618cf5d649c28fc8e9546388\n// flow-typed version: <<STUB>>/passport-facebook_v^2.1.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'passport-facebook'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'passport-facebook' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'passport-facebook/lib/errors/facebookauthorizationerror' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-facebook/lib/errors/facebookgraphapierror' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-facebook/lib/errors/facebooktokenerror' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-facebook/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-facebook/lib/profile' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-facebook/lib/strategy' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'passport-facebook/lib/errors/facebookauthorizationerror.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/errors/facebookauthorizationerror'>;\n}\ndeclare module 'passport-facebook/lib/errors/facebookgraphapierror.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/errors/facebookgraphapierror'>;\n}\ndeclare module 'passport-facebook/lib/errors/facebooktokenerror.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/errors/facebooktokenerror'>;\n}\ndeclare module 'passport-facebook/lib/index.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/index'>;\n}\ndeclare module 'passport-facebook/lib/profile.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/profile'>;\n}\ndeclare module 'passport-facebook/lib/strategy.js' {\n  declare module.exports: $Exports<'passport-facebook/lib/strategy'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/passport-github2_vx.x.x.js",
    "content": "// flow-typed signature: f9045e098bc233689452b66cabf99bf2\n// flow-typed version: <<STUB>>/passport-github2_v^0.1.10/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'passport-github2'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'passport-github2' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'passport-github2/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-github2/lib/profile' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-github2/lib/strategy' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'passport-github2/lib/index.js' {\n  declare module.exports: $Exports<'passport-github2/lib/index'>;\n}\ndeclare module 'passport-github2/lib/profile.js' {\n  declare module.exports: $Exports<'passport-github2/lib/profile'>;\n}\ndeclare module 'passport-github2/lib/strategy.js' {\n  declare module.exports: $Exports<'passport-github2/lib/strategy'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/passport-google-oauth2_vx.x.x.js",
    "content": "// flow-typed signature: 1d873bc01fad5960de2e86f896018c21\n// flow-typed version: <<STUB>>/passport-google-oauth2_v^0.1.6/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'passport-google-oauth2'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'passport-google-oauth2' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'passport-google-oauth2/example/app' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-google-oauth2/lib/oauth2' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'passport-google-oauth2/example/app.js' {\n  declare module.exports: $Exports<'passport-google-oauth2/example/app'>;\n}\ndeclare module 'passport-google-oauth2/lib/oauth2.js' {\n  declare module.exports: $Exports<'passport-google-oauth2/lib/oauth2'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/passport-twitter_vx.x.x.js",
    "content": "// flow-typed signature: bb32213050c47d2fba9e8852de4040eb\n// flow-typed version: <<STUB>>/passport-twitter_v^1.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'passport-twitter'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'passport-twitter' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'passport-twitter/lib/errors/apierror' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-twitter/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-twitter/lib/profile' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport-twitter/lib/strategy' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'passport-twitter/lib/errors/apierror.js' {\n  declare module.exports: $Exports<'passport-twitter/lib/errors/apierror'>;\n}\ndeclare module 'passport-twitter/lib/index.js' {\n  declare module.exports: $Exports<'passport-twitter/lib/index'>;\n}\ndeclare module 'passport-twitter/lib/profile.js' {\n  declare module.exports: $Exports<'passport-twitter/lib/profile'>;\n}\ndeclare module 'passport-twitter/lib/strategy.js' {\n  declare module.exports: $Exports<'passport-twitter/lib/strategy'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/passport_vx.x.x.js",
    "content": "// flow-typed signature: 46c61ea309a223b177a743618ee18370\n// flow-typed version: <<STUB>>/passport_v^0.3.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'passport'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'passport' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'passport/lib/authenticator' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/errors/authenticationerror' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/framework/connect' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/http/request' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/middleware/authenticate' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/middleware/initialize' {\n  declare module.exports: any;\n}\n\ndeclare module 'passport/lib/strategies/session' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'passport/lib/authenticator.js' {\n  declare module.exports: $Exports<'passport/lib/authenticator'>;\n}\ndeclare module 'passport/lib/errors/authenticationerror.js' {\n  declare module.exports: $Exports<'passport/lib/errors/authenticationerror'>;\n}\ndeclare module 'passport/lib/framework/connect.js' {\n  declare module.exports: $Exports<'passport/lib/framework/connect'>;\n}\ndeclare module 'passport/lib/http/request.js' {\n  declare module.exports: $Exports<'passport/lib/http/request'>;\n}\ndeclare module 'passport/lib/index.js' {\n  declare module.exports: $Exports<'passport/lib/index'>;\n}\ndeclare module 'passport/lib/middleware/authenticate.js' {\n  declare module.exports: $Exports<'passport/lib/middleware/authenticate'>;\n}\ndeclare module 'passport/lib/middleware/initialize.js' {\n  declare module.exports: $Exports<'passport/lib/middleware/initialize'>;\n}\ndeclare module 'passport/lib/strategies/session.js' {\n  declare module.exports: $Exports<'passport/lib/strategies/session'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/postmark_vx.x.x.js",
    "content": "// flow-typed signature: 90325d4fc34bbec0d4643204d570d555\n// flow-typed version: <<STUB>>/postmark_v^1.4.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'postmark'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'postmark' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'postmark/docs/scripts/bootstrap-dropdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/bootstrap-tab' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/docstrap.lib' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/prettify/jquery.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/prettify/lang-css' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/prettify/prettify' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/sunlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/toc' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/docs/scripts/URI' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/lib/postmark/AdminClient' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/lib/postmark/Client' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/lib/postmark/clientDefaults' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/lib/postmark/documentationTypeDefs' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/lib/postmark/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_adminClientDomainManagement' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_adminClientServerManagement' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_adminClientSignatureManagement' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientBounceProcessing' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientClickStatistics' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientMessageProcessing' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientMessageStatistics' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientOpenHandling' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientServerHandling' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientTemplateHandling' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_clientTriggerProcessing' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_generalClientTests' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/fixture_postmarkClientSending' {\n  declare module.exports: any;\n}\n\ndeclare module 'postmark/tests/test_helpers' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'postmark/docs/scripts/bootstrap-dropdown.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/bootstrap-dropdown'>;\n}\ndeclare module 'postmark/docs/scripts/bootstrap-tab.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/bootstrap-tab'>;\n}\ndeclare module 'postmark/docs/scripts/docstrap.lib.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/docstrap.lib'>;\n}\ndeclare module 'postmark/docs/scripts/prettify/jquery.min.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/prettify/jquery.min'>;\n}\ndeclare module 'postmark/docs/scripts/prettify/lang-css.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/prettify/lang-css'>;\n}\ndeclare module 'postmark/docs/scripts/prettify/prettify.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/prettify/prettify'>;\n}\ndeclare module 'postmark/docs/scripts/sunlight.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/sunlight'>;\n}\ndeclare module 'postmark/docs/scripts/toc.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/toc'>;\n}\ndeclare module 'postmark/docs/scripts/URI.js' {\n  declare module.exports: $Exports<'postmark/docs/scripts/URI'>;\n}\ndeclare module 'postmark/lib/postmark/AdminClient.js' {\n  declare module.exports: $Exports<'postmark/lib/postmark/AdminClient'>;\n}\ndeclare module 'postmark/lib/postmark/Client.js' {\n  declare module.exports: $Exports<'postmark/lib/postmark/Client'>;\n}\ndeclare module 'postmark/lib/postmark/clientDefaults.js' {\n  declare module.exports: $Exports<'postmark/lib/postmark/clientDefaults'>;\n}\ndeclare module 'postmark/lib/postmark/documentationTypeDefs.js' {\n  declare module.exports: $Exports<'postmark/lib/postmark/documentationTypeDefs'>;\n}\ndeclare module 'postmark/lib/postmark/index.js' {\n  declare module.exports: $Exports<'postmark/lib/postmark/index'>;\n}\ndeclare module 'postmark/tests/fixture_adminClientDomainManagement.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_adminClientDomainManagement'>;\n}\ndeclare module 'postmark/tests/fixture_adminClientServerManagement.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_adminClientServerManagement'>;\n}\ndeclare module 'postmark/tests/fixture_adminClientSignatureManagement.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_adminClientSignatureManagement'>;\n}\ndeclare module 'postmark/tests/fixture_clientBounceProcessing.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientBounceProcessing'>;\n}\ndeclare module 'postmark/tests/fixture_clientClickStatistics.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientClickStatistics'>;\n}\ndeclare module 'postmark/tests/fixture_clientMessageProcessing.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientMessageProcessing'>;\n}\ndeclare module 'postmark/tests/fixture_clientMessageStatistics.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientMessageStatistics'>;\n}\ndeclare module 'postmark/tests/fixture_clientOpenHandling.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientOpenHandling'>;\n}\ndeclare module 'postmark/tests/fixture_clientServerHandling.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientServerHandling'>;\n}\ndeclare module 'postmark/tests/fixture_clientTemplateHandling.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientTemplateHandling'>;\n}\ndeclare module 'postmark/tests/fixture_clientTriggerProcessing.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_clientTriggerProcessing'>;\n}\ndeclare module 'postmark/tests/fixture_generalClientTests.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_generalClientTests'>;\n}\ndeclare module 'postmark/tests/fixture_postmarkClientSending.js' {\n  declare module.exports: $Exports<'postmark/tests/fixture_postmarkClientSending'>;\n}\ndeclare module 'postmark/tests/test_helpers.js' {\n  declare module.exports: $Exports<'postmark/tests/test_helpers'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/pre-commit_vx.x.x.js",
    "content": "// flow-typed signature: b6350a3d1de18cf6c53b1574188d4a7c\n// flow-typed version: <<STUB>>/pre-commit_v^1.2.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'pre-commit'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'pre-commit' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'pre-commit/install' {\n  declare module.exports: any;\n}\n\ndeclare module 'pre-commit/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'pre-commit/uninstall' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'pre-commit/index' {\n  declare module.exports: $Exports<'pre-commit'>;\n}\ndeclare module 'pre-commit/index.js' {\n  declare module.exports: $Exports<'pre-commit'>;\n}\ndeclare module 'pre-commit/install.js' {\n  declare module.exports: $Exports<'pre-commit/install'>;\n}\ndeclare module 'pre-commit/test.js' {\n  declare module.exports: $Exports<'pre-commit/test'>;\n}\ndeclare module 'pre-commit/uninstall.js' {\n  declare module.exports: $Exports<'pre-commit/uninstall'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/prettier_vx.x.x.js",
    "content": "// flow-typed signature: 473fe27fad2867e94b13c46f743c5945\n// flow-typed version: <<STUB>>/prettier_v^1.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'prettier'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'prettier' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'prettier/bin-prettier' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-babylon' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-flow' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-glimmer' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-graphql' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-markdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-parse5' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-postcss' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-typescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/parser-vue' {\n  declare module.exports: any;\n}\n\ndeclare module 'prettier/third-party' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'prettier/bin-prettier.js' {\n  declare module.exports: $Exports<'prettier/bin-prettier'>;\n}\ndeclare module 'prettier/index' {\n  declare module.exports: $Exports<'prettier'>;\n}\ndeclare module 'prettier/index.js' {\n  declare module.exports: $Exports<'prettier'>;\n}\ndeclare module 'prettier/parser-babylon.js' {\n  declare module.exports: $Exports<'prettier/parser-babylon'>;\n}\ndeclare module 'prettier/parser-flow.js' {\n  declare module.exports: $Exports<'prettier/parser-flow'>;\n}\ndeclare module 'prettier/parser-glimmer.js' {\n  declare module.exports: $Exports<'prettier/parser-glimmer'>;\n}\ndeclare module 'prettier/parser-graphql.js' {\n  declare module.exports: $Exports<'prettier/parser-graphql'>;\n}\ndeclare module 'prettier/parser-markdown.js' {\n  declare module.exports: $Exports<'prettier/parser-markdown'>;\n}\ndeclare module 'prettier/parser-parse5.js' {\n  declare module.exports: $Exports<'prettier/parser-parse5'>;\n}\ndeclare module 'prettier/parser-postcss.js' {\n  declare module.exports: $Exports<'prettier/parser-postcss'>;\n}\ndeclare module 'prettier/parser-typescript.js' {\n  declare module.exports: $Exports<'prettier/parser-typescript'>;\n}\ndeclare module 'prettier/parser-vue.js' {\n  declare module.exports: $Exports<'prettier/parser-vue'>;\n}\ndeclare module 'prettier/third-party.js' {\n  declare module.exports: $Exports<'prettier/third-party'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/prism-react-renderer_vx.x.x.js",
    "content": "// flow-typed signature: 3987fe684d034fe6822d30ca25b56da6\n// flow-typed version: <<STUB>>/prism-react-renderer_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'prism-react-renderer'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'prism-react-renderer' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'prism-react-renderer/es/components/Highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/defaultProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/utils/normalizeTokens' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/utils/themeToDict' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/vendor/prism/includeLangs' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/vendor/prism/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/es/vendor/prism/prism-core' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/components/Highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/defaultProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/utils/normalizeTokens' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/utils/themeToDict' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/vendor/prism/includeLangs' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/vendor/prism/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/lib/vendor/prism/prism-core' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/dracula' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/duotoneDark' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/duotoneLight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/nightOwl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/oceanicNext' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/shadesOfPurple' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/ultramin' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/vsDark' {\n  declare module.exports: any;\n}\n\ndeclare module 'prism-react-renderer/themes/vsDarkPlus' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'prism-react-renderer/es/components/Highlight.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/components/Highlight'>;\n}\ndeclare module 'prism-react-renderer/es/defaultProps.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/defaultProps'>;\n}\ndeclare module 'prism-react-renderer/es/index.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/index'>;\n}\ndeclare module 'prism-react-renderer/es/types.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/types'>;\n}\ndeclare module 'prism-react-renderer/es/utils/normalizeTokens.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/utils/normalizeTokens'>;\n}\ndeclare module 'prism-react-renderer/es/utils/themeToDict.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/utils/themeToDict'>;\n}\ndeclare module 'prism-react-renderer/es/vendor/prism/includeLangs.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/vendor/prism/includeLangs'>;\n}\ndeclare module 'prism-react-renderer/es/vendor/prism/index.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/vendor/prism/index'>;\n}\ndeclare module 'prism-react-renderer/es/vendor/prism/prism-core.js' {\n  declare module.exports: $Exports<'prism-react-renderer/es/vendor/prism/prism-core'>;\n}\ndeclare module 'prism-react-renderer/lib/components/Highlight.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/components/Highlight'>;\n}\ndeclare module 'prism-react-renderer/lib/defaultProps.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/defaultProps'>;\n}\ndeclare module 'prism-react-renderer/lib/index.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/index'>;\n}\ndeclare module 'prism-react-renderer/lib/types.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/types'>;\n}\ndeclare module 'prism-react-renderer/lib/utils/normalizeTokens.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/utils/normalizeTokens'>;\n}\ndeclare module 'prism-react-renderer/lib/utils/themeToDict.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/utils/themeToDict'>;\n}\ndeclare module 'prism-react-renderer/lib/vendor/prism/includeLangs.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/vendor/prism/includeLangs'>;\n}\ndeclare module 'prism-react-renderer/lib/vendor/prism/index.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/vendor/prism/index'>;\n}\ndeclare module 'prism-react-renderer/lib/vendor/prism/prism-core.js' {\n  declare module.exports: $Exports<'prism-react-renderer/lib/vendor/prism/prism-core'>;\n}\ndeclare module 'prism-react-renderer/themes/dracula.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/dracula'>;\n}\ndeclare module 'prism-react-renderer/themes/duotoneDark.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/duotoneDark'>;\n}\ndeclare module 'prism-react-renderer/themes/duotoneLight.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/duotoneLight'>;\n}\ndeclare module 'prism-react-renderer/themes/nightOwl.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/nightOwl'>;\n}\ndeclare module 'prism-react-renderer/themes/oceanicNext.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/oceanicNext'>;\n}\ndeclare module 'prism-react-renderer/themes/shadesOfPurple.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/shadesOfPurple'>;\n}\ndeclare module 'prism-react-renderer/themes/ultramin.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/ultramin'>;\n}\ndeclare module 'prism-react-renderer/themes/vsDark.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/vsDark'>;\n}\ndeclare module 'prism-react-renderer/themes/vsDarkPlus.js' {\n  declare module.exports: $Exports<'prism-react-renderer/themes/vsDarkPlus'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/prismjs_vx.x.x.js",
    "content": "// flow-typed signature: 1854eaa5800e7e55189897b137fe7841\n// flow-typed version: <<STUB>>/prismjs_v^1.8.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'prismjs'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'prismjs' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'prismjs/components' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-abap' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-abap.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-actionscript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-actionscript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ada' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ada.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-apacheconf' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-apacheconf.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-apl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-apl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-applescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-applescript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-arduino' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-arduino.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-asciidoc' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-asciidoc.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-aspnet' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-aspnet.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-autohotkey' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-autohotkey.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-autoit' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-autoit.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bash' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bash.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-basic' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-basic.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-batch' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-batch.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bison' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bison.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-brainfuck' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-brainfuck.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bro' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-bro.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-c' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-c.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-clike' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-clike.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-coffeescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-coffeescript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-core' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-core.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-cpp' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-cpp.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-crystal' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-crystal.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-csharp' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-csharp.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-css-extras' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-css-extras.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-css' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-css.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-d' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-d.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-dart' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-dart.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-diff' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-diff.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-django' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-django.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-docker' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-docker.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-eiffel' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-eiffel.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-elixir' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-elixir.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-erlang' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-erlang.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-flow' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-flow.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-fortran' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-fortran.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-fsharp' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-fsharp.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-gherkin' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-gherkin.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-git' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-git.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-glsl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-glsl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-go' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-go.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-graphql' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-graphql.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-groovy' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-groovy.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haml' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haml.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-handlebars' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-handlebars.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haskell' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haskell.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haxe' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-haxe.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-http' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-http.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-icon' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-icon.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-inform7' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-inform7.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ini' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ini.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-j' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-j.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-java' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-java.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-javascript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-javascript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-jolie' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-jolie.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-json' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-json.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-jsx' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-jsx.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-julia' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-julia.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-keyman' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-keyman.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-kotlin' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-kotlin.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-latex' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-latex.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-less' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-less.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-livescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-livescript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-lolcode' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-lolcode.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-lua' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-lua.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-makefile' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-makefile.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-markdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-markdown.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-markup' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-markup.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-matlab' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-matlab.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-mel' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-mel.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-mizar' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-mizar.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-monkey' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-monkey.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-n4js' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-n4js.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nasm' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nasm.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nginx' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nginx.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nim' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nim.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nix' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nix.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nsis' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-nsis.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-objectivec' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-objectivec.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ocaml' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ocaml.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-opencl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-opencl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-oz' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-oz.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-parigp' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-parigp.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-parser.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pascal' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pascal.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-perl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-perl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-php-extras' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-php-extras.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-php' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-php.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-powershell' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-powershell.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-processing' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-processing.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-prolog' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-prolog.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-properties' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-properties.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-protobuf' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-protobuf.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pug' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pug.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-puppet' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-puppet.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pure' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-pure.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-python' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-python.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-q' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-q.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-qore' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-qore.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-r' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-r.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-reason' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-reason.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-renpy' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-renpy.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rest' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rest.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rip' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rip.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-roboconf' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-roboconf.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ruby' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-ruby.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rust' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-rust.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sas' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sas.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sass' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sass.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scala' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scala.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scheme' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scheme.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scss' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-scss.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-smalltalk' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-smalltalk.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-smarty' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-smarty.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sql' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-sql.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-stylus' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-stylus.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-swift' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-swift.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-tcl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-tcl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-textile' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-textile.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-twig' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-twig.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-typescript' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-typescript.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vbnet' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vbnet.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-verilog' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-verilog.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vhdl' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vhdl.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vim' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-vim.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-wiki' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-wiki.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-xojo' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-xojo.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-yaml' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/components/prism-yaml.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/examples' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/gulpfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/autolinker/prism-autolinker' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/autolinker/prism-autolinker.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/autoloader/prism-autoloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/autoloader/prism-autoloader.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/command-line/prism-command-line' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/command-line/prism-command-line.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/custom-class/prism-custom-class' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/custom-class/prism-custom-class.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/file-highlight/prism-file-highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/file-highlight/prism-file-highlight.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/highlight-keywords/prism-highlight-keywords' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/highlight-keywords/prism-highlight-keywords.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/keep-markup/prism-keep-markup' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/keep-markup/prism-keep-markup.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/line-highlight/prism-line-highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/line-highlight/prism-line-highlight.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/line-numbers/prism-line-numbers' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/line-numbers/prism-line-numbers.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-angle/prism-previewer-angle' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-angle/prism-previewer-angle.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-base/prism-previewer-base' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-base/prism-previewer-base.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-color/prism-previewer-color' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-color/prism-previewer-color.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-easing/prism-previewer-easing' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-easing/prism-previewer-easing.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-gradient/prism-previewer-gradient' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-gradient/prism-previewer-gradient.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-time/prism-previewer-time' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/previewer-time/prism-previewer-time.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/show-invisibles/prism-show-invisibles' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/show-invisibles/prism-show-invisibles.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/show-language/prism-show-language' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/show-language/prism-show-language.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/toolbar/prism-toolbar' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/toolbar/prism-toolbar.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/unescaped-markup/prism-unescaped-markup' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/unescaped-markup/prism-unescaped-markup.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/wpd/prism-wpd' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/plugins/wpd/prism-wpd.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/prism' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/helper/components' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/helper/prism-loader' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/helper/test-case' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/helper/test-discovery' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/helper/token-stream-transformer' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/asciidoc/entity_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/groovy/issue1049' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/groovy/string-interpolation_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/handlebars/handlebars_in_markup_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/markup/entity_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/markup+php/php_in_markup_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/languages/smarty/smarty_in_markup_feature' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/run-child' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/run' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/tests/testrunner-tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/vendor/FileSaver.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/vendor/jszip.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'prismjs/vendor/promise' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'prismjs/components.js' {\n  declare module.exports: $Exports<'prismjs/components'>;\n}\ndeclare module 'prismjs/components/prism-abap.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-abap'>;\n}\ndeclare module 'prismjs/components/prism-abap.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-abap.min'>;\n}\ndeclare module 'prismjs/components/prism-actionscript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-actionscript'>;\n}\ndeclare module 'prismjs/components/prism-actionscript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-actionscript.min'>;\n}\ndeclare module 'prismjs/components/prism-ada.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ada'>;\n}\ndeclare module 'prismjs/components/prism-ada.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ada.min'>;\n}\ndeclare module 'prismjs/components/prism-apacheconf.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-apacheconf'>;\n}\ndeclare module 'prismjs/components/prism-apacheconf.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-apacheconf.min'>;\n}\ndeclare module 'prismjs/components/prism-apl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-apl'>;\n}\ndeclare module 'prismjs/components/prism-apl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-apl.min'>;\n}\ndeclare module 'prismjs/components/prism-applescript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-applescript'>;\n}\ndeclare module 'prismjs/components/prism-applescript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-applescript.min'>;\n}\ndeclare module 'prismjs/components/prism-arduino.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-arduino'>;\n}\ndeclare module 'prismjs/components/prism-arduino.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-arduino.min'>;\n}\ndeclare module 'prismjs/components/prism-asciidoc.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-asciidoc'>;\n}\ndeclare module 'prismjs/components/prism-asciidoc.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-asciidoc.min'>;\n}\ndeclare module 'prismjs/components/prism-aspnet.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-aspnet'>;\n}\ndeclare module 'prismjs/components/prism-aspnet.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-aspnet.min'>;\n}\ndeclare module 'prismjs/components/prism-autohotkey.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-autohotkey'>;\n}\ndeclare module 'prismjs/components/prism-autohotkey.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-autohotkey.min'>;\n}\ndeclare module 'prismjs/components/prism-autoit.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-autoit'>;\n}\ndeclare module 'prismjs/components/prism-autoit.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-autoit.min'>;\n}\ndeclare module 'prismjs/components/prism-bash.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bash'>;\n}\ndeclare module 'prismjs/components/prism-bash.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bash.min'>;\n}\ndeclare module 'prismjs/components/prism-basic.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-basic'>;\n}\ndeclare module 'prismjs/components/prism-basic.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-basic.min'>;\n}\ndeclare module 'prismjs/components/prism-batch.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-batch'>;\n}\ndeclare module 'prismjs/components/prism-batch.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-batch.min'>;\n}\ndeclare module 'prismjs/components/prism-bison.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bison'>;\n}\ndeclare module 'prismjs/components/prism-bison.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bison.min'>;\n}\ndeclare module 'prismjs/components/prism-brainfuck.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-brainfuck'>;\n}\ndeclare module 'prismjs/components/prism-brainfuck.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-brainfuck.min'>;\n}\ndeclare module 'prismjs/components/prism-bro.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bro'>;\n}\ndeclare module 'prismjs/components/prism-bro.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-bro.min'>;\n}\ndeclare module 'prismjs/components/prism-c.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-c'>;\n}\ndeclare module 'prismjs/components/prism-c.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-c.min'>;\n}\ndeclare module 'prismjs/components/prism-clike.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-clike'>;\n}\ndeclare module 'prismjs/components/prism-clike.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-clike.min'>;\n}\ndeclare module 'prismjs/components/prism-coffeescript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-coffeescript'>;\n}\ndeclare module 'prismjs/components/prism-coffeescript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-coffeescript.min'>;\n}\ndeclare module 'prismjs/components/prism-core.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-core'>;\n}\ndeclare module 'prismjs/components/prism-core.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-core.min'>;\n}\ndeclare module 'prismjs/components/prism-cpp.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-cpp'>;\n}\ndeclare module 'prismjs/components/prism-cpp.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-cpp.min'>;\n}\ndeclare module 'prismjs/components/prism-crystal.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-crystal'>;\n}\ndeclare module 'prismjs/components/prism-crystal.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-crystal.min'>;\n}\ndeclare module 'prismjs/components/prism-csharp.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-csharp'>;\n}\ndeclare module 'prismjs/components/prism-csharp.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-csharp.min'>;\n}\ndeclare module 'prismjs/components/prism-css-extras.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-css-extras'>;\n}\ndeclare module 'prismjs/components/prism-css-extras.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-css-extras.min'>;\n}\ndeclare module 'prismjs/components/prism-css.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-css'>;\n}\ndeclare module 'prismjs/components/prism-css.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-css.min'>;\n}\ndeclare module 'prismjs/components/prism-d.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-d'>;\n}\ndeclare module 'prismjs/components/prism-d.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-d.min'>;\n}\ndeclare module 'prismjs/components/prism-dart.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-dart'>;\n}\ndeclare module 'prismjs/components/prism-dart.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-dart.min'>;\n}\ndeclare module 'prismjs/components/prism-diff.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-diff'>;\n}\ndeclare module 'prismjs/components/prism-diff.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-diff.min'>;\n}\ndeclare module 'prismjs/components/prism-django.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-django'>;\n}\ndeclare module 'prismjs/components/prism-django.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-django.min'>;\n}\ndeclare module 'prismjs/components/prism-docker.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-docker'>;\n}\ndeclare module 'prismjs/components/prism-docker.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-docker.min'>;\n}\ndeclare module 'prismjs/components/prism-eiffel.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-eiffel'>;\n}\ndeclare module 'prismjs/components/prism-eiffel.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-eiffel.min'>;\n}\ndeclare module 'prismjs/components/prism-elixir.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-elixir'>;\n}\ndeclare module 'prismjs/components/prism-elixir.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-elixir.min'>;\n}\ndeclare module 'prismjs/components/prism-erlang.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-erlang'>;\n}\ndeclare module 'prismjs/components/prism-erlang.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-erlang.min'>;\n}\ndeclare module 'prismjs/components/prism-flow.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-flow'>;\n}\ndeclare module 'prismjs/components/prism-flow.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-flow.min'>;\n}\ndeclare module 'prismjs/components/prism-fortran.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-fortran'>;\n}\ndeclare module 'prismjs/components/prism-fortran.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-fortran.min'>;\n}\ndeclare module 'prismjs/components/prism-fsharp.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-fsharp'>;\n}\ndeclare module 'prismjs/components/prism-fsharp.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-fsharp.min'>;\n}\ndeclare module 'prismjs/components/prism-gherkin.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-gherkin'>;\n}\ndeclare module 'prismjs/components/prism-gherkin.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-gherkin.min'>;\n}\ndeclare module 'prismjs/components/prism-git.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-git'>;\n}\ndeclare module 'prismjs/components/prism-git.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-git.min'>;\n}\ndeclare module 'prismjs/components/prism-glsl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-glsl'>;\n}\ndeclare module 'prismjs/components/prism-glsl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-glsl.min'>;\n}\ndeclare module 'prismjs/components/prism-go.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-go'>;\n}\ndeclare module 'prismjs/components/prism-go.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-go.min'>;\n}\ndeclare module 'prismjs/components/prism-graphql.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-graphql'>;\n}\ndeclare module 'prismjs/components/prism-graphql.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-graphql.min'>;\n}\ndeclare module 'prismjs/components/prism-groovy.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-groovy'>;\n}\ndeclare module 'prismjs/components/prism-groovy.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-groovy.min'>;\n}\ndeclare module 'prismjs/components/prism-haml.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haml'>;\n}\ndeclare module 'prismjs/components/prism-haml.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haml.min'>;\n}\ndeclare module 'prismjs/components/prism-handlebars.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-handlebars'>;\n}\ndeclare module 'prismjs/components/prism-handlebars.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-handlebars.min'>;\n}\ndeclare module 'prismjs/components/prism-haskell.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haskell'>;\n}\ndeclare module 'prismjs/components/prism-haskell.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haskell.min'>;\n}\ndeclare module 'prismjs/components/prism-haxe.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haxe'>;\n}\ndeclare module 'prismjs/components/prism-haxe.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-haxe.min'>;\n}\ndeclare module 'prismjs/components/prism-http.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-http'>;\n}\ndeclare module 'prismjs/components/prism-http.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-http.min'>;\n}\ndeclare module 'prismjs/components/prism-icon.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-icon'>;\n}\ndeclare module 'prismjs/components/prism-icon.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-icon.min'>;\n}\ndeclare module 'prismjs/components/prism-inform7.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-inform7'>;\n}\ndeclare module 'prismjs/components/prism-inform7.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-inform7.min'>;\n}\ndeclare module 'prismjs/components/prism-ini.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ini'>;\n}\ndeclare module 'prismjs/components/prism-ini.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ini.min'>;\n}\ndeclare module 'prismjs/components/prism-j.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-j'>;\n}\ndeclare module 'prismjs/components/prism-j.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-j.min'>;\n}\ndeclare module 'prismjs/components/prism-java.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-java'>;\n}\ndeclare module 'prismjs/components/prism-java.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-java.min'>;\n}\ndeclare module 'prismjs/components/prism-javascript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-javascript'>;\n}\ndeclare module 'prismjs/components/prism-javascript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-javascript.min'>;\n}\ndeclare module 'prismjs/components/prism-jolie.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-jolie'>;\n}\ndeclare module 'prismjs/components/prism-jolie.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-jolie.min'>;\n}\ndeclare module 'prismjs/components/prism-json.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-json'>;\n}\ndeclare module 'prismjs/components/prism-json.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-json.min'>;\n}\ndeclare module 'prismjs/components/prism-jsx.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-jsx'>;\n}\ndeclare module 'prismjs/components/prism-jsx.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-jsx.min'>;\n}\ndeclare module 'prismjs/components/prism-julia.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-julia'>;\n}\ndeclare module 'prismjs/components/prism-julia.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-julia.min'>;\n}\ndeclare module 'prismjs/components/prism-keyman.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-keyman'>;\n}\ndeclare module 'prismjs/components/prism-keyman.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-keyman.min'>;\n}\ndeclare module 'prismjs/components/prism-kotlin.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-kotlin'>;\n}\ndeclare module 'prismjs/components/prism-kotlin.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-kotlin.min'>;\n}\ndeclare module 'prismjs/components/prism-latex.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-latex'>;\n}\ndeclare module 'prismjs/components/prism-latex.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-latex.min'>;\n}\ndeclare module 'prismjs/components/prism-less.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-less'>;\n}\ndeclare module 'prismjs/components/prism-less.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-less.min'>;\n}\ndeclare module 'prismjs/components/prism-livescript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-livescript'>;\n}\ndeclare module 'prismjs/components/prism-livescript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-livescript.min'>;\n}\ndeclare module 'prismjs/components/prism-lolcode.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-lolcode'>;\n}\ndeclare module 'prismjs/components/prism-lolcode.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-lolcode.min'>;\n}\ndeclare module 'prismjs/components/prism-lua.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-lua'>;\n}\ndeclare module 'prismjs/components/prism-lua.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-lua.min'>;\n}\ndeclare module 'prismjs/components/prism-makefile.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-makefile'>;\n}\ndeclare module 'prismjs/components/prism-makefile.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-makefile.min'>;\n}\ndeclare module 'prismjs/components/prism-markdown.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-markdown'>;\n}\ndeclare module 'prismjs/components/prism-markdown.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-markdown.min'>;\n}\ndeclare module 'prismjs/components/prism-markup.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-markup'>;\n}\ndeclare module 'prismjs/components/prism-markup.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-markup.min'>;\n}\ndeclare module 'prismjs/components/prism-matlab.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-matlab'>;\n}\ndeclare module 'prismjs/components/prism-matlab.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-matlab.min'>;\n}\ndeclare module 'prismjs/components/prism-mel.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-mel'>;\n}\ndeclare module 'prismjs/components/prism-mel.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-mel.min'>;\n}\ndeclare module 'prismjs/components/prism-mizar.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-mizar'>;\n}\ndeclare module 'prismjs/components/prism-mizar.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-mizar.min'>;\n}\ndeclare module 'prismjs/components/prism-monkey.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-monkey'>;\n}\ndeclare module 'prismjs/components/prism-monkey.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-monkey.min'>;\n}\ndeclare module 'prismjs/components/prism-n4js.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-n4js'>;\n}\ndeclare module 'prismjs/components/prism-n4js.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-n4js.min'>;\n}\ndeclare module 'prismjs/components/prism-nasm.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nasm'>;\n}\ndeclare module 'prismjs/components/prism-nasm.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nasm.min'>;\n}\ndeclare module 'prismjs/components/prism-nginx.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nginx'>;\n}\ndeclare module 'prismjs/components/prism-nginx.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nginx.min'>;\n}\ndeclare module 'prismjs/components/prism-nim.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nim'>;\n}\ndeclare module 'prismjs/components/prism-nim.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nim.min'>;\n}\ndeclare module 'prismjs/components/prism-nix.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nix'>;\n}\ndeclare module 'prismjs/components/prism-nix.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nix.min'>;\n}\ndeclare module 'prismjs/components/prism-nsis.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nsis'>;\n}\ndeclare module 'prismjs/components/prism-nsis.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-nsis.min'>;\n}\ndeclare module 'prismjs/components/prism-objectivec.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-objectivec'>;\n}\ndeclare module 'prismjs/components/prism-objectivec.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-objectivec.min'>;\n}\ndeclare module 'prismjs/components/prism-ocaml.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ocaml'>;\n}\ndeclare module 'prismjs/components/prism-ocaml.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ocaml.min'>;\n}\ndeclare module 'prismjs/components/prism-opencl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-opencl'>;\n}\ndeclare module 'prismjs/components/prism-opencl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-opencl.min'>;\n}\ndeclare module 'prismjs/components/prism-oz.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-oz'>;\n}\ndeclare module 'prismjs/components/prism-oz.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-oz.min'>;\n}\ndeclare module 'prismjs/components/prism-parigp.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-parigp'>;\n}\ndeclare module 'prismjs/components/prism-parigp.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-parigp.min'>;\n}\ndeclare module 'prismjs/components/prism-parser.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-parser'>;\n}\ndeclare module 'prismjs/components/prism-parser.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-parser.min'>;\n}\ndeclare module 'prismjs/components/prism-pascal.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pascal'>;\n}\ndeclare module 'prismjs/components/prism-pascal.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pascal.min'>;\n}\ndeclare module 'prismjs/components/prism-perl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-perl'>;\n}\ndeclare module 'prismjs/components/prism-perl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-perl.min'>;\n}\ndeclare module 'prismjs/components/prism-php-extras.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-php-extras'>;\n}\ndeclare module 'prismjs/components/prism-php-extras.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-php-extras.min'>;\n}\ndeclare module 'prismjs/components/prism-php.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-php'>;\n}\ndeclare module 'prismjs/components/prism-php.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-php.min'>;\n}\ndeclare module 'prismjs/components/prism-powershell.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-powershell'>;\n}\ndeclare module 'prismjs/components/prism-powershell.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-powershell.min'>;\n}\ndeclare module 'prismjs/components/prism-processing.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-processing'>;\n}\ndeclare module 'prismjs/components/prism-processing.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-processing.min'>;\n}\ndeclare module 'prismjs/components/prism-prolog.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-prolog'>;\n}\ndeclare module 'prismjs/components/prism-prolog.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-prolog.min'>;\n}\ndeclare module 'prismjs/components/prism-properties.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-properties'>;\n}\ndeclare module 'prismjs/components/prism-properties.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-properties.min'>;\n}\ndeclare module 'prismjs/components/prism-protobuf.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-protobuf'>;\n}\ndeclare module 'prismjs/components/prism-protobuf.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-protobuf.min'>;\n}\ndeclare module 'prismjs/components/prism-pug.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pug'>;\n}\ndeclare module 'prismjs/components/prism-pug.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pug.min'>;\n}\ndeclare module 'prismjs/components/prism-puppet.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-puppet'>;\n}\ndeclare module 'prismjs/components/prism-puppet.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-puppet.min'>;\n}\ndeclare module 'prismjs/components/prism-pure.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pure'>;\n}\ndeclare module 'prismjs/components/prism-pure.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-pure.min'>;\n}\ndeclare module 'prismjs/components/prism-python.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-python'>;\n}\ndeclare module 'prismjs/components/prism-python.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-python.min'>;\n}\ndeclare module 'prismjs/components/prism-q.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-q'>;\n}\ndeclare module 'prismjs/components/prism-q.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-q.min'>;\n}\ndeclare module 'prismjs/components/prism-qore.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-qore'>;\n}\ndeclare module 'prismjs/components/prism-qore.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-qore.min'>;\n}\ndeclare module 'prismjs/components/prism-r.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-r'>;\n}\ndeclare module 'prismjs/components/prism-r.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-r.min'>;\n}\ndeclare module 'prismjs/components/prism-reason.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-reason'>;\n}\ndeclare module 'prismjs/components/prism-reason.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-reason.min'>;\n}\ndeclare module 'prismjs/components/prism-renpy.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-renpy'>;\n}\ndeclare module 'prismjs/components/prism-renpy.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-renpy.min'>;\n}\ndeclare module 'prismjs/components/prism-rest.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rest'>;\n}\ndeclare module 'prismjs/components/prism-rest.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rest.min'>;\n}\ndeclare module 'prismjs/components/prism-rip.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rip'>;\n}\ndeclare module 'prismjs/components/prism-rip.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rip.min'>;\n}\ndeclare module 'prismjs/components/prism-roboconf.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-roboconf'>;\n}\ndeclare module 'prismjs/components/prism-roboconf.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-roboconf.min'>;\n}\ndeclare module 'prismjs/components/prism-ruby.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ruby'>;\n}\ndeclare module 'prismjs/components/prism-ruby.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-ruby.min'>;\n}\ndeclare module 'prismjs/components/prism-rust.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rust'>;\n}\ndeclare module 'prismjs/components/prism-rust.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-rust.min'>;\n}\ndeclare module 'prismjs/components/prism-sas.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sas'>;\n}\ndeclare module 'prismjs/components/prism-sas.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sas.min'>;\n}\ndeclare module 'prismjs/components/prism-sass.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sass'>;\n}\ndeclare module 'prismjs/components/prism-sass.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sass.min'>;\n}\ndeclare module 'prismjs/components/prism-scala.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scala'>;\n}\ndeclare module 'prismjs/components/prism-scala.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scala.min'>;\n}\ndeclare module 'prismjs/components/prism-scheme.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scheme'>;\n}\ndeclare module 'prismjs/components/prism-scheme.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scheme.min'>;\n}\ndeclare module 'prismjs/components/prism-scss.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scss'>;\n}\ndeclare module 'prismjs/components/prism-scss.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-scss.min'>;\n}\ndeclare module 'prismjs/components/prism-smalltalk.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-smalltalk'>;\n}\ndeclare module 'prismjs/components/prism-smalltalk.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-smalltalk.min'>;\n}\ndeclare module 'prismjs/components/prism-smarty.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-smarty'>;\n}\ndeclare module 'prismjs/components/prism-smarty.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-smarty.min'>;\n}\ndeclare module 'prismjs/components/prism-sql.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sql'>;\n}\ndeclare module 'prismjs/components/prism-sql.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-sql.min'>;\n}\ndeclare module 'prismjs/components/prism-stylus.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-stylus'>;\n}\ndeclare module 'prismjs/components/prism-stylus.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-stylus.min'>;\n}\ndeclare module 'prismjs/components/prism-swift.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-swift'>;\n}\ndeclare module 'prismjs/components/prism-swift.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-swift.min'>;\n}\ndeclare module 'prismjs/components/prism-tcl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-tcl'>;\n}\ndeclare module 'prismjs/components/prism-tcl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-tcl.min'>;\n}\ndeclare module 'prismjs/components/prism-textile.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-textile'>;\n}\ndeclare module 'prismjs/components/prism-textile.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-textile.min'>;\n}\ndeclare module 'prismjs/components/prism-twig.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-twig'>;\n}\ndeclare module 'prismjs/components/prism-twig.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-twig.min'>;\n}\ndeclare module 'prismjs/components/prism-typescript.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-typescript'>;\n}\ndeclare module 'prismjs/components/prism-typescript.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-typescript.min'>;\n}\ndeclare module 'prismjs/components/prism-vbnet.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vbnet'>;\n}\ndeclare module 'prismjs/components/prism-vbnet.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vbnet.min'>;\n}\ndeclare module 'prismjs/components/prism-verilog.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-verilog'>;\n}\ndeclare module 'prismjs/components/prism-verilog.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-verilog.min'>;\n}\ndeclare module 'prismjs/components/prism-vhdl.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vhdl'>;\n}\ndeclare module 'prismjs/components/prism-vhdl.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vhdl.min'>;\n}\ndeclare module 'prismjs/components/prism-vim.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vim'>;\n}\ndeclare module 'prismjs/components/prism-vim.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-vim.min'>;\n}\ndeclare module 'prismjs/components/prism-wiki.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-wiki'>;\n}\ndeclare module 'prismjs/components/prism-wiki.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-wiki.min'>;\n}\ndeclare module 'prismjs/components/prism-xojo.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-xojo'>;\n}\ndeclare module 'prismjs/components/prism-xojo.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-xojo.min'>;\n}\ndeclare module 'prismjs/components/prism-yaml.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-yaml'>;\n}\ndeclare module 'prismjs/components/prism-yaml.min.js' {\n  declare module.exports: $Exports<'prismjs/components/prism-yaml.min'>;\n}\ndeclare module 'prismjs/examples.js' {\n  declare module.exports: $Exports<'prismjs/examples'>;\n}\ndeclare module 'prismjs/gulpfile.js' {\n  declare module.exports: $Exports<'prismjs/gulpfile'>;\n}\ndeclare module 'prismjs/plugins/autolinker/prism-autolinker.js' {\n  declare module.exports: $Exports<'prismjs/plugins/autolinker/prism-autolinker'>;\n}\ndeclare module 'prismjs/plugins/autolinker/prism-autolinker.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/autolinker/prism-autolinker.min'>;\n}\ndeclare module 'prismjs/plugins/autoloader/prism-autoloader.js' {\n  declare module.exports: $Exports<'prismjs/plugins/autoloader/prism-autoloader'>;\n}\ndeclare module 'prismjs/plugins/autoloader/prism-autoloader.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/autoloader/prism-autoloader.min'>;\n}\ndeclare module 'prismjs/plugins/command-line/prism-command-line.js' {\n  declare module.exports: $Exports<'prismjs/plugins/command-line/prism-command-line'>;\n}\ndeclare module 'prismjs/plugins/command-line/prism-command-line.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/command-line/prism-command-line.min'>;\n}\ndeclare module 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js' {\n  declare module.exports: $Exports<'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard'>;\n}\ndeclare module 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min'>;\n}\ndeclare module 'prismjs/plugins/custom-class/prism-custom-class.js' {\n  declare module.exports: $Exports<'prismjs/plugins/custom-class/prism-custom-class'>;\n}\ndeclare module 'prismjs/plugins/custom-class/prism-custom-class.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/custom-class/prism-custom-class.min'>;\n}\ndeclare module 'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js' {\n  declare module.exports: $Exports<'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight'>;\n}\ndeclare module 'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min'>;\n}\ndeclare module 'prismjs/plugins/file-highlight/prism-file-highlight.js' {\n  declare module.exports: $Exports<'prismjs/plugins/file-highlight/prism-file-highlight'>;\n}\ndeclare module 'prismjs/plugins/file-highlight/prism-file-highlight.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/file-highlight/prism-file-highlight.min'>;\n}\ndeclare module 'prismjs/plugins/highlight-keywords/prism-highlight-keywords.js' {\n  declare module.exports: $Exports<'prismjs/plugins/highlight-keywords/prism-highlight-keywords'>;\n}\ndeclare module 'prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/highlight-keywords/prism-highlight-keywords.min'>;\n}\ndeclare module 'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js' {\n  declare module.exports: $Exports<'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight'>;\n}\ndeclare module 'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min'>;\n}\ndeclare module 'prismjs/plugins/keep-markup/prism-keep-markup.js' {\n  declare module.exports: $Exports<'prismjs/plugins/keep-markup/prism-keep-markup'>;\n}\ndeclare module 'prismjs/plugins/keep-markup/prism-keep-markup.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/keep-markup/prism-keep-markup.min'>;\n}\ndeclare module 'prismjs/plugins/line-highlight/prism-line-highlight.js' {\n  declare module.exports: $Exports<'prismjs/plugins/line-highlight/prism-line-highlight'>;\n}\ndeclare module 'prismjs/plugins/line-highlight/prism-line-highlight.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/line-highlight/prism-line-highlight.min'>;\n}\ndeclare module 'prismjs/plugins/line-numbers/prism-line-numbers.js' {\n  declare module.exports: $Exports<'prismjs/plugins/line-numbers/prism-line-numbers'>;\n}\ndeclare module 'prismjs/plugins/line-numbers/prism-line-numbers.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/line-numbers/prism-line-numbers.min'>;\n}\ndeclare module 'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js' {\n  declare module.exports: $Exports<'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace'>;\n}\ndeclare module 'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-angle/prism-previewer-angle.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-angle/prism-previewer-angle'>;\n}\ndeclare module 'prismjs/plugins/previewer-angle/prism-previewer-angle.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-angle/prism-previewer-angle.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-base/prism-previewer-base.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-base/prism-previewer-base'>;\n}\ndeclare module 'prismjs/plugins/previewer-base/prism-previewer-base.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-base/prism-previewer-base.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-color/prism-previewer-color.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-color/prism-previewer-color'>;\n}\ndeclare module 'prismjs/plugins/previewer-color/prism-previewer-color.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-color/prism-previewer-color.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-easing/prism-previewer-easing.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-easing/prism-previewer-easing'>;\n}\ndeclare module 'prismjs/plugins/previewer-easing/prism-previewer-easing.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-easing/prism-previewer-easing.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-gradient/prism-previewer-gradient.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-gradient/prism-previewer-gradient'>;\n}\ndeclare module 'prismjs/plugins/previewer-gradient/prism-previewer-gradient.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-gradient/prism-previewer-gradient.min'>;\n}\ndeclare module 'prismjs/plugins/previewer-time/prism-previewer-time.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-time/prism-previewer-time'>;\n}\ndeclare module 'prismjs/plugins/previewer-time/prism-previewer-time.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/previewer-time/prism-previewer-time.min'>;\n}\ndeclare module 'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js' {\n  declare module.exports: $Exports<'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed'>;\n}\ndeclare module 'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min'>;\n}\ndeclare module 'prismjs/plugins/show-invisibles/prism-show-invisibles.js' {\n  declare module.exports: $Exports<'prismjs/plugins/show-invisibles/prism-show-invisibles'>;\n}\ndeclare module 'prismjs/plugins/show-invisibles/prism-show-invisibles.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/show-invisibles/prism-show-invisibles.min'>;\n}\ndeclare module 'prismjs/plugins/show-language/prism-show-language.js' {\n  declare module.exports: $Exports<'prismjs/plugins/show-language/prism-show-language'>;\n}\ndeclare module 'prismjs/plugins/show-language/prism-show-language.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/show-language/prism-show-language.min'>;\n}\ndeclare module 'prismjs/plugins/toolbar/prism-toolbar.js' {\n  declare module.exports: $Exports<'prismjs/plugins/toolbar/prism-toolbar'>;\n}\ndeclare module 'prismjs/plugins/toolbar/prism-toolbar.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/toolbar/prism-toolbar.min'>;\n}\ndeclare module 'prismjs/plugins/unescaped-markup/prism-unescaped-markup.js' {\n  declare module.exports: $Exports<'prismjs/plugins/unescaped-markup/prism-unescaped-markup'>;\n}\ndeclare module 'prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/unescaped-markup/prism-unescaped-markup.min'>;\n}\ndeclare module 'prismjs/plugins/wpd/prism-wpd.js' {\n  declare module.exports: $Exports<'prismjs/plugins/wpd/prism-wpd'>;\n}\ndeclare module 'prismjs/plugins/wpd/prism-wpd.min.js' {\n  declare module.exports: $Exports<'prismjs/plugins/wpd/prism-wpd.min'>;\n}\ndeclare module 'prismjs/prism.js' {\n  declare module.exports: $Exports<'prismjs/prism'>;\n}\ndeclare module 'prismjs/tests/helper/components.js' {\n  declare module.exports: $Exports<'prismjs/tests/helper/components'>;\n}\ndeclare module 'prismjs/tests/helper/prism-loader.js' {\n  declare module.exports: $Exports<'prismjs/tests/helper/prism-loader'>;\n}\ndeclare module 'prismjs/tests/helper/test-case.js' {\n  declare module.exports: $Exports<'prismjs/tests/helper/test-case'>;\n}\ndeclare module 'prismjs/tests/helper/test-discovery.js' {\n  declare module.exports: $Exports<'prismjs/tests/helper/test-discovery'>;\n}\ndeclare module 'prismjs/tests/helper/token-stream-transformer.js' {\n  declare module.exports: $Exports<'prismjs/tests/helper/token-stream-transformer'>;\n}\ndeclare module 'prismjs/tests/languages/asciidoc/entity_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/asciidoc/entity_feature'>;\n}\ndeclare module 'prismjs/tests/languages/groovy/issue1049.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/groovy/issue1049'>;\n}\ndeclare module 'prismjs/tests/languages/groovy/string-interpolation_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/groovy/string-interpolation_feature'>;\n}\ndeclare module 'prismjs/tests/languages/handlebars/handlebars_in_markup_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/handlebars/handlebars_in_markup_feature'>;\n}\ndeclare module 'prismjs/tests/languages/markup/entity_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/markup/entity_feature'>;\n}\ndeclare module 'prismjs/tests/languages/markup+php/php_in_markup_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/markup+php/php_in_markup_feature'>;\n}\ndeclare module 'prismjs/tests/languages/smarty/smarty_in_markup_feature.js' {\n  declare module.exports: $Exports<'prismjs/tests/languages/smarty/smarty_in_markup_feature'>;\n}\ndeclare module 'prismjs/tests/run-child.js' {\n  declare module.exports: $Exports<'prismjs/tests/run-child'>;\n}\ndeclare module 'prismjs/tests/run.js' {\n  declare module.exports: $Exports<'prismjs/tests/run'>;\n}\ndeclare module 'prismjs/tests/testrunner-tests.js' {\n  declare module.exports: $Exports<'prismjs/tests/testrunner-tests'>;\n}\ndeclare module 'prismjs/vendor/FileSaver.min.js' {\n  declare module.exports: $Exports<'prismjs/vendor/FileSaver.min'>;\n}\ndeclare module 'prismjs/vendor/jszip.min.js' {\n  declare module.exports: $Exports<'prismjs/vendor/jszip.min'>;\n}\ndeclare module 'prismjs/vendor/promise.js' {\n  declare module.exports: $Exports<'prismjs/vendor/promise'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/puppeteer_vx.x.x.js",
    "content": "// flow-typed signature: 2b4e7a3fbe46b17a6f5a4236fec5b090\n// flow-typed version: <<STUB>>/puppeteer_v^0.12.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'puppeteer'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'puppeteer' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'puppeteer/DeviceDescriptors' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/block-images' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/custom-event' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/detect-sniff' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/pdf' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/proxy' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/screenshot-fullpage' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/screenshot' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/examples/search' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/install' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Connection' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Dialog' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/ElementHandle' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/EmulationManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/ExecutionContext' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/FrameManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Input' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Launcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Multimap' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/NavigatorWatcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/NetworkManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Page' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Puppeteer' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/lib/Tracing' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Connection' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Dialog' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/ElementHandle' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/EmulationManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/ExecutionContext' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/FrameManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Input' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Launcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Multimap' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/NavigatorWatcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/NetworkManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Page' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Puppeteer' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/node6/Tracing' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/check_availability' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/ChromiumDownloader' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/check_public_api/Documentation' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/check_public_api/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/check_public_api/JSBuilder' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/check_public_api/MDBuilder' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/Message' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/preprocessor/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/preprocessor/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/SourceFactory' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/doclint/toc' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/ESTreeWalker' {\n  declare module.exports: any;\n}\n\ndeclare module 'puppeteer/utils/fetch_devices' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'puppeteer/DeviceDescriptors.js' {\n  declare module.exports: $Exports<'puppeteer/DeviceDescriptors'>;\n}\ndeclare module 'puppeteer/examples/block-images.js' {\n  declare module.exports: $Exports<'puppeteer/examples/block-images'>;\n}\ndeclare module 'puppeteer/examples/custom-event.js' {\n  declare module.exports: $Exports<'puppeteer/examples/custom-event'>;\n}\ndeclare module 'puppeteer/examples/detect-sniff.js' {\n  declare module.exports: $Exports<'puppeteer/examples/detect-sniff'>;\n}\ndeclare module 'puppeteer/examples/pdf.js' {\n  declare module.exports: $Exports<'puppeteer/examples/pdf'>;\n}\ndeclare module 'puppeteer/examples/proxy.js' {\n  declare module.exports: $Exports<'puppeteer/examples/proxy'>;\n}\ndeclare module 'puppeteer/examples/screenshot-fullpage.js' {\n  declare module.exports: $Exports<'puppeteer/examples/screenshot-fullpage'>;\n}\ndeclare module 'puppeteer/examples/screenshot.js' {\n  declare module.exports: $Exports<'puppeteer/examples/screenshot'>;\n}\ndeclare module 'puppeteer/examples/search.js' {\n  declare module.exports: $Exports<'puppeteer/examples/search'>;\n}\ndeclare module 'puppeteer/index' {\n  declare module.exports: $Exports<'puppeteer'>;\n}\ndeclare module 'puppeteer/index.js' {\n  declare module.exports: $Exports<'puppeteer'>;\n}\ndeclare module 'puppeteer/install.js' {\n  declare module.exports: $Exports<'puppeteer/install'>;\n}\ndeclare module 'puppeteer/lib/Browser.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Browser'>;\n}\ndeclare module 'puppeteer/lib/Connection.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Connection'>;\n}\ndeclare module 'puppeteer/lib/Dialog.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Dialog'>;\n}\ndeclare module 'puppeteer/lib/ElementHandle.js' {\n  declare module.exports: $Exports<'puppeteer/lib/ElementHandle'>;\n}\ndeclare module 'puppeteer/lib/EmulationManager.js' {\n  declare module.exports: $Exports<'puppeteer/lib/EmulationManager'>;\n}\ndeclare module 'puppeteer/lib/ExecutionContext.js' {\n  declare module.exports: $Exports<'puppeteer/lib/ExecutionContext'>;\n}\ndeclare module 'puppeteer/lib/FrameManager.js' {\n  declare module.exports: $Exports<'puppeteer/lib/FrameManager'>;\n}\ndeclare module 'puppeteer/lib/helper.js' {\n  declare module.exports: $Exports<'puppeteer/lib/helper'>;\n}\ndeclare module 'puppeteer/lib/Input.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Input'>;\n}\ndeclare module 'puppeteer/lib/Launcher.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Launcher'>;\n}\ndeclare module 'puppeteer/lib/Multimap.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Multimap'>;\n}\ndeclare module 'puppeteer/lib/NavigatorWatcher.js' {\n  declare module.exports: $Exports<'puppeteer/lib/NavigatorWatcher'>;\n}\ndeclare module 'puppeteer/lib/NetworkManager.js' {\n  declare module.exports: $Exports<'puppeteer/lib/NetworkManager'>;\n}\ndeclare module 'puppeteer/lib/Page.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Page'>;\n}\ndeclare module 'puppeteer/lib/Puppeteer.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Puppeteer'>;\n}\ndeclare module 'puppeteer/lib/Tracing.js' {\n  declare module.exports: $Exports<'puppeteer/lib/Tracing'>;\n}\ndeclare module 'puppeteer/node6/Browser.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Browser'>;\n}\ndeclare module 'puppeteer/node6/Connection.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Connection'>;\n}\ndeclare module 'puppeteer/node6/Dialog.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Dialog'>;\n}\ndeclare module 'puppeteer/node6/ElementHandle.js' {\n  declare module.exports: $Exports<'puppeteer/node6/ElementHandle'>;\n}\ndeclare module 'puppeteer/node6/EmulationManager.js' {\n  declare module.exports: $Exports<'puppeteer/node6/EmulationManager'>;\n}\ndeclare module 'puppeteer/node6/ExecutionContext.js' {\n  declare module.exports: $Exports<'puppeteer/node6/ExecutionContext'>;\n}\ndeclare module 'puppeteer/node6/FrameManager.js' {\n  declare module.exports: $Exports<'puppeteer/node6/FrameManager'>;\n}\ndeclare module 'puppeteer/node6/helper.js' {\n  declare module.exports: $Exports<'puppeteer/node6/helper'>;\n}\ndeclare module 'puppeteer/node6/Input.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Input'>;\n}\ndeclare module 'puppeteer/node6/Launcher.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Launcher'>;\n}\ndeclare module 'puppeteer/node6/Multimap.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Multimap'>;\n}\ndeclare module 'puppeteer/node6/NavigatorWatcher.js' {\n  declare module.exports: $Exports<'puppeteer/node6/NavigatorWatcher'>;\n}\ndeclare module 'puppeteer/node6/NetworkManager.js' {\n  declare module.exports: $Exports<'puppeteer/node6/NetworkManager'>;\n}\ndeclare module 'puppeteer/node6/Page.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Page'>;\n}\ndeclare module 'puppeteer/node6/Puppeteer.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Puppeteer'>;\n}\ndeclare module 'puppeteer/node6/Tracing.js' {\n  declare module.exports: $Exports<'puppeteer/node6/Tracing'>;\n}\ndeclare module 'puppeteer/utils/check_availability.js' {\n  declare module.exports: $Exports<'puppeteer/utils/check_availability'>;\n}\ndeclare module 'puppeteer/utils/ChromiumDownloader.js' {\n  declare module.exports: $Exports<'puppeteer/utils/ChromiumDownloader'>;\n}\ndeclare module 'puppeteer/utils/doclint/check_public_api/Documentation.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/check_public_api/Documentation'>;\n}\ndeclare module 'puppeteer/utils/doclint/check_public_api/index.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/check_public_api/index'>;\n}\ndeclare module 'puppeteer/utils/doclint/check_public_api/JSBuilder.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/check_public_api/JSBuilder'>;\n}\ndeclare module 'puppeteer/utils/doclint/check_public_api/MDBuilder.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/check_public_api/MDBuilder'>;\n}\ndeclare module 'puppeteer/utils/doclint/cli.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/cli'>;\n}\ndeclare module 'puppeteer/utils/doclint/Message.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/Message'>;\n}\ndeclare module 'puppeteer/utils/doclint/preprocessor/index.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/preprocessor/index'>;\n}\ndeclare module 'puppeteer/utils/doclint/preprocessor/test.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/preprocessor/test'>;\n}\ndeclare module 'puppeteer/utils/doclint/SourceFactory.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/SourceFactory'>;\n}\ndeclare module 'puppeteer/utils/doclint/toc.js' {\n  declare module.exports: $Exports<'puppeteer/utils/doclint/toc'>;\n}\ndeclare module 'puppeteer/utils/ESTreeWalker.js' {\n  declare module.exports: $Exports<'puppeteer/utils/ESTreeWalker'>;\n}\ndeclare module 'puppeteer/utils/fetch_devices.js' {\n  declare module.exports: $Exports<'puppeteer/utils/fetch_devices'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/query-string_vx.x.x.js",
    "content": "// flow-typed signature: 4e8e8bebea560639ddc15b6087ce2baf\n// flow-typed version: <<STUB>>/query-string_v6.1.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'query-string'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'query-string' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'query-string/index' {\n  declare module.exports: $Exports<'query-string'>;\n}\ndeclare module 'query-string/index.js' {\n  declare module.exports: $Exports<'query-string'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/raf_vx.x.x.js",
    "content": "// flow-typed signature: 887ce984c0a5fd424aeca109bae9ea61\n// flow-typed version: <<STUB>>/raf_v3.4.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'raf'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'raf' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'raf/polyfill' {\n  declare module.exports: any;\n}\n\ndeclare module 'raf/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raf/window' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'raf/index' {\n  declare module.exports: $Exports<'raf'>;\n}\ndeclare module 'raf/index.js' {\n  declare module.exports: $Exports<'raf'>;\n}\ndeclare module 'raf/polyfill.js' {\n  declare module.exports: $Exports<'raf/polyfill'>;\n}\ndeclare module 'raf/test.js' {\n  declare module.exports: $Exports<'raf/test'>;\n}\ndeclare module 'raf/window.js' {\n  declare module.exports: $Exports<'raf/window'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/raven-js_v3.17.x.js",
    "content": "// flow-typed signature: e1f97cc57b871f5647a2a5a8567b0b5b\n// flow-typed version: 39e54508d9/raven-js_v3.17.x/flow_>=v0.38.x\n\ntype LogLevel = \"critical\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n\ntype AutoBreadcrumbOptions = {\n  xhr?: boolean,\n  console?: boolean,\n  dom?: boolean,\n  location?: boolean\n};\n\ntype RavenInstrumentationOptions = {\n  tryCatch?: boolean\n};\n\ntype Breadcrumb = {\n  message?: string,\n  category?: string,\n  level?: LogLevel,\n  data?: any,\n  type?: BreadcrumbType\n};\n\ntype BreadcrumbType = \"navigation\" | \"http\";\n\ntype RavenOptions = {\n  /** The log level associated with this event. Default: error */\n  level?: LogLevel,\n\n  /** The name of the logger used by Sentry. Default: javascript */\n  logger?: string,\n\n  /** The environment of the application you are monitoring with Sentry */\n  environment?: string,\n\n  /** The release version of the application you are monitoring with Sentry */\n  release?: string,\n\n  /** The name of the server or device that the client is running on */\n  serverName?: string,\n\n  /** List of messages to be filtered out before being sent to Sentry. */\n  ignoreErrors?: (RegExp | string)[],\n\n  /** Similar to ignoreErrors, but will ignore errors from whole urls patching a regex pattern. */\n  ignoreUrls?: (RegExp | string)[],\n\n  /** The inverse of ignoreUrls. Only report errors from whole urls matching a regex pattern. */\n  whitelistUrls?: (RegExp | string)[],\n\n  /** An array of regex patterns to indicate which urls are a part of your app. */\n  includePaths?: (RegExp | string)[],\n\n  /** Additional data to be tagged onto the error. */\n  tags?: {\n    [id: string]: string\n  },\n\n  /** set to true to get the stack trace of your message */\n  stacktrace?: boolean,\n\n  extra?: any,\n\n  /** In some cases you may see issues where Sentry groups multiple events together when they should be separate entities. In other cases, Sentry simply doesn’t group events together because they’re so sporadic that they never look the same. */\n  fingerprint?: string[],\n\n  /** A function which allows mutation of the data payload right before being sent to Sentry */\n  dataCallback?: (data: any) => any,\n\n  /** A callback function that allows you to apply your own filters to determine if the message should be sent to Sentry. */\n  shouldSendCallback?: (data: any) => boolean,\n\n  /** By default, Raven does not truncate messages. If you need to truncate characters for whatever reason, you may set this to limit the length. */\n  maxMessageLength?: number,\n\n  /** By default, Raven will truncate URLs as they appear in breadcrumbs and other meta interfaces to 250 characters in order to minimize bytes over the wire. This does *not* affect URLs in stack traces. */\n  maxUrlLength?: number,\n\n  /** Override the default HTTP data transport handler. */\n  transport?: (options: RavenTransportOptions) => void,\n\n  /** Allow use of private/secretKey. */\n  allowSecretKey?: boolean,\n\n  /** Enables/disables instrumentation of globals. */\n  instrument?: boolean | RavenInstrumentationOptions,\n\n  /** Enables/disables automatic collection of breadcrumbs. */\n  autoBreadcrumbs?: boolean | AutoBreadcrumbOptions\n};\n\ntype RavenTransportOptions = {\n  url: string,\n  data: any,\n  auth: {\n    sentry_version: string,\n    sentry_client: string,\n    sentry_key: string\n  },\n  onSuccess: () => void,\n  onFailure: () => void\n};\n\ndeclare module \"raven-js\" {\n  declare type RavenPlugin = {\n    (raven: Raven, ...args: any[]): Raven\n  };\n\n  declare class Raven {\n    /** Raven.js version. */\n    VERSION: string,\n\n    Plugins: { [id: string]: RavenPlugin },\n\n    /*\n     * Allow Raven to be configured as soon as it is loaded\n     * It uses a global RavenConfig = {dsn: '...', config: {}}\n     */\n    afterLoad(): void,\n\n    /*\n     * Allow multiple versions of Raven to be installed.\n     * Strip Raven from the global context and returns the instance.\n     */\n    noConflict(): this,\n\n    /** Configure Raven with a DSN and extra options */\n    config(dsn: string, options?: RavenOptions): this,\n\n    /*\n     * Installs a global window.onerror error handler\n     * to capture and report uncaught exceptions.\n     * At this point, install() is required to be called due\n     * to the way TraceKit is set up.\n     */\n    install(): this,\n\n    /** Adds a plugin to Raven */\n    addPlugin(plugin: RavenPlugin, ...pluginArgs: any[]): this,\n\n    /*\n     * Wrap code within a context so Raven can capture errors\n     * reliably across domains that is executed immediately.\n     */\n    context(func: Function, ...args: any[]): void,\n    context(options: RavenOptions, func: Function, ...args: any[]): void,\n\n    /** Wrap code within a context and returns back a new function to be executed */\n    wrap(func: Function): Function,\n    wrap(options: RavenOptions, func: Function): Function,\n    wrap<T: Function>(func: T): T,\n    wrap<T: Function>(options: RavenOptions, func: T): T,\n\n    /** Uninstalls the global error handler. */\n    uninstall(): this,\n\n    /** Manually capture an exception and send it over to Sentry */\n    captureException(ex: Error, options?: RavenOptions): this,\n\n    /** Manually send a message to Sentry */\n    captureMessage(msg: string, options?: RavenOptions): this,\n\n    /** Log a breadcrumb */\n    captureBreadcrumb(crumb: Breadcrumb): this,\n\n    /**\n     * Clear the user context, removing the user data that would be sent to Sentry.\n     */\n    setUserContext(): this,\n\n    /** Set a user to be sent along with the payload. */\n    setUserContext(user: {\n      id?: string,\n      username?: string,\n      email?: string\n    }): this,\n\n    /** Merge extra attributes to be sent along with the payload. */\n    setExtraContext(context: Object): this,\n\n    /** Merge tags to be sent along with the payload. */\n    setTagsContext(tags: Object): this,\n\n    /** Clear all of the context. */\n    clearContext(): this,\n\n    /** Get a copy of the current context. This cannot be mutated.*/\n    getContext(): Object,\n\n    /** Override the default HTTP data transport handler. */\n    setTransport(\n      transportFunction: (options: RavenTransportOptions) => void\n    ): this,\n\n    /** Set environment of application */\n    setEnvironment(environment: string): this,\n\n    /** Set release version of application */\n    setRelease(release: string): this,\n\n    /** Get the latest raw exception that was captured by Raven.*/\n    lastException(): Error,\n\n    /** An event id is a globally unique id for the event that was just sent. This event id can be used to find the exact event from within Sentry. */\n    lastEventId(): string,\n\n    /** If you need to conditionally check if raven needs to be initialized or not, you can use the isSetup function. It will return true if Raven is already initialized. */\n    isSetup(): boolean,\n\n    /** Specify a function that allows mutation of the data payload right before being sent to Sentry. */\n    setDataCallback(data: any, orig?: any): this,\n\n    /** Specify a callback function that allows you to mutate or filter breadcrumbs when they are captured. */\n    setBreadcrumbCallback(data: any, orig?: any): this,\n\n    /** Specify a callback function that allows you to apply your own filters to determine if the message should be sent to Sentry. */\n    setShouldSendCallback(data: any, orig?: any): this,\n\n    /** Show Sentry user feedback dialog */\n    showReportDialog(options: Object): void,\n\n    /** Configure Raven DSN */\n    setDSN(dsn: string): void\n  }\n\n  declare export default Raven\n}\n"
  },
  {
    "path": "flow-typed/npm/raven-js_vx.x.x.js",
    "content": "// flow-typed signature: c658f4196509d17ff3117a640671a881\n// flow-typed version: <<STUB>>/raven-js_v^3.14.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'raven-js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'raven-js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'raven-js/dist/plugins/angular' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/angular.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/console' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/console.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/ember' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/ember.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/require' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/require.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/vue' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/plugins/vue.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/raven' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/dist/raven.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/file.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/file.sourcemap' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/file1' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/file2' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/scratch' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/example/stack' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/Gruntfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/angular' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/console' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/ember' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/react-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/require' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/plugins/vue' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/src/configError' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/src/console' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/src/raven' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/src/singleton' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/src/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/template/_copyright' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/integration/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/integration/throw-error' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/integration/throw-object' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/integration/throw-string' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/plugins/angular.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/plugins/console.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/plugins/react-native.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/plugins/vue.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/raven.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/utils.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/vendor/fixtures/captured-errors' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/vendor/json-stringify-safe.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/vendor/tracekit-parser.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/test/vendor/tracekit.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/vendor/json-stringify-safe/stringify' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven-js/vendor/TraceKit/tracekit' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'raven-js/dist/plugins/angular.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/angular'>;\n}\ndeclare module 'raven-js/dist/plugins/angular.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/angular.min'>;\n}\ndeclare module 'raven-js/dist/plugins/console.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/console'>;\n}\ndeclare module 'raven-js/dist/plugins/console.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/console.min'>;\n}\ndeclare module 'raven-js/dist/plugins/ember.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/ember'>;\n}\ndeclare module 'raven-js/dist/plugins/ember.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/ember.min'>;\n}\ndeclare module 'raven-js/dist/plugins/require.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/require'>;\n}\ndeclare module 'raven-js/dist/plugins/require.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/require.min'>;\n}\ndeclare module 'raven-js/dist/plugins/vue.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/vue'>;\n}\ndeclare module 'raven-js/dist/plugins/vue.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/plugins/vue.min'>;\n}\ndeclare module 'raven-js/dist/raven.js' {\n  declare module.exports: $Exports<'raven-js/dist/raven'>;\n}\ndeclare module 'raven-js/dist/raven.min.js' {\n  declare module.exports: $Exports<'raven-js/dist/raven.min'>;\n}\ndeclare module 'raven-js/example/file.min.js' {\n  declare module.exports: $Exports<'raven-js/example/file.min'>;\n}\ndeclare module 'raven-js/example/file.sourcemap.js' {\n  declare module.exports: $Exports<'raven-js/example/file.sourcemap'>;\n}\ndeclare module 'raven-js/example/file1.js' {\n  declare module.exports: $Exports<'raven-js/example/file1'>;\n}\ndeclare module 'raven-js/example/file2.js' {\n  declare module.exports: $Exports<'raven-js/example/file2'>;\n}\ndeclare module 'raven-js/example/scratch.js' {\n  declare module.exports: $Exports<'raven-js/example/scratch'>;\n}\ndeclare module 'raven-js/example/stack.js' {\n  declare module.exports: $Exports<'raven-js/example/stack'>;\n}\ndeclare module 'raven-js/Gruntfile.js' {\n  declare module.exports: $Exports<'raven-js/Gruntfile'>;\n}\ndeclare module 'raven-js/plugins/angular.js' {\n  declare module.exports: $Exports<'raven-js/plugins/angular'>;\n}\ndeclare module 'raven-js/plugins/console.js' {\n  declare module.exports: $Exports<'raven-js/plugins/console'>;\n}\ndeclare module 'raven-js/plugins/ember.js' {\n  declare module.exports: $Exports<'raven-js/plugins/ember'>;\n}\ndeclare module 'raven-js/plugins/react-native.js' {\n  declare module.exports: $Exports<'raven-js/plugins/react-native'>;\n}\ndeclare module 'raven-js/plugins/require.js' {\n  declare module.exports: $Exports<'raven-js/plugins/require'>;\n}\ndeclare module 'raven-js/plugins/vue.js' {\n  declare module.exports: $Exports<'raven-js/plugins/vue'>;\n}\ndeclare module 'raven-js/src/configError.js' {\n  declare module.exports: $Exports<'raven-js/src/configError'>;\n}\ndeclare module 'raven-js/src/console.js' {\n  declare module.exports: $Exports<'raven-js/src/console'>;\n}\ndeclare module 'raven-js/src/raven.js' {\n  declare module.exports: $Exports<'raven-js/src/raven'>;\n}\ndeclare module 'raven-js/src/singleton.js' {\n  declare module.exports: $Exports<'raven-js/src/singleton'>;\n}\ndeclare module 'raven-js/src/utils.js' {\n  declare module.exports: $Exports<'raven-js/src/utils'>;\n}\ndeclare module 'raven-js/template/_copyright.js' {\n  declare module.exports: $Exports<'raven-js/template/_copyright'>;\n}\ndeclare module 'raven-js/test/integration/test.js' {\n  declare module.exports: $Exports<'raven-js/test/integration/test'>;\n}\ndeclare module 'raven-js/test/integration/throw-error.js' {\n  declare module.exports: $Exports<'raven-js/test/integration/throw-error'>;\n}\ndeclare module 'raven-js/test/integration/throw-object.js' {\n  declare module.exports: $Exports<'raven-js/test/integration/throw-object'>;\n}\ndeclare module 'raven-js/test/integration/throw-string.js' {\n  declare module.exports: $Exports<'raven-js/test/integration/throw-string'>;\n}\ndeclare module 'raven-js/test/plugins/angular.test.js' {\n  declare module.exports: $Exports<'raven-js/test/plugins/angular.test'>;\n}\ndeclare module 'raven-js/test/plugins/console.test.js' {\n  declare module.exports: $Exports<'raven-js/test/plugins/console.test'>;\n}\ndeclare module 'raven-js/test/plugins/react-native.test.js' {\n  declare module.exports: $Exports<'raven-js/test/plugins/react-native.test'>;\n}\ndeclare module 'raven-js/test/plugins/vue.test.js' {\n  declare module.exports: $Exports<'raven-js/test/plugins/vue.test'>;\n}\ndeclare module 'raven-js/test/raven.test.js' {\n  declare module.exports: $Exports<'raven-js/test/raven.test'>;\n}\ndeclare module 'raven-js/test/utils.test.js' {\n  declare module.exports: $Exports<'raven-js/test/utils.test'>;\n}\ndeclare module 'raven-js/test/vendor/fixtures/captured-errors.js' {\n  declare module.exports: $Exports<'raven-js/test/vendor/fixtures/captured-errors'>;\n}\ndeclare module 'raven-js/test/vendor/json-stringify-safe.test.js' {\n  declare module.exports: $Exports<'raven-js/test/vendor/json-stringify-safe.test'>;\n}\ndeclare module 'raven-js/test/vendor/tracekit-parser.test.js' {\n  declare module.exports: $Exports<'raven-js/test/vendor/tracekit-parser.test'>;\n}\ndeclare module 'raven-js/test/vendor/tracekit.test.js' {\n  declare module.exports: $Exports<'raven-js/test/vendor/tracekit.test'>;\n}\ndeclare module 'raven-js/vendor/json-stringify-safe/stringify.js' {\n  declare module.exports: $Exports<'raven-js/vendor/json-stringify-safe/stringify'>;\n}\ndeclare module 'raven-js/vendor/TraceKit/tracekit.js' {\n  declare module.exports: $Exports<'raven-js/vendor/TraceKit/tracekit'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/raven_vx.x.x.js",
    "content": "// flow-typed signature: b0bfc7ad422a668138c6bcf1dbb6bb65\n// flow-typed version: <<STUB>>/raven_v^2.0.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'raven'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'raven' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'raven/lib/client' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/instrumentation/console' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/instrumentation/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/instrumentation/instrumentor' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/instrumentation/pg' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/parsers' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/transports' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/lib/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'raven/vendor/json-stringify-safe' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'raven/index' {\n  declare module.exports: $Exports<'raven'>;\n}\ndeclare module 'raven/index.js' {\n  declare module.exports: $Exports<'raven'>;\n}\ndeclare module 'raven/lib/client.js' {\n  declare module.exports: $Exports<'raven/lib/client'>;\n}\ndeclare module 'raven/lib/instrumentation/console.js' {\n  declare module.exports: $Exports<'raven/lib/instrumentation/console'>;\n}\ndeclare module 'raven/lib/instrumentation/http.js' {\n  declare module.exports: $Exports<'raven/lib/instrumentation/http'>;\n}\ndeclare module 'raven/lib/instrumentation/instrumentor.js' {\n  declare module.exports: $Exports<'raven/lib/instrumentation/instrumentor'>;\n}\ndeclare module 'raven/lib/instrumentation/pg.js' {\n  declare module.exports: $Exports<'raven/lib/instrumentation/pg'>;\n}\ndeclare module 'raven/lib/parsers.js' {\n  declare module.exports: $Exports<'raven/lib/parsers'>;\n}\ndeclare module 'raven/lib/transports.js' {\n  declare module.exports: $Exports<'raven/lib/transports'>;\n}\ndeclare module 'raven/lib/utils.js' {\n  declare module.exports: $Exports<'raven/lib/utils'>;\n}\ndeclare module 'raven/vendor/json-stringify-safe.js' {\n  declare module.exports: $Exports<'raven/vendor/json-stringify-safe'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/raw-loader_vx.x.x.js",
    "content": "// flow-typed signature: 9be49ab1ac8bcbb144315ee3375b66ec\n// flow-typed version: <<STUB>>/raw-loader_v^0.5.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'raw-loader'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'raw-loader' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'raw-loader/index' {\n  declare module.exports: $Exports<'raw-loader'>;\n}\ndeclare module 'raw-loader/index.js' {\n  declare module.exports: $Exports<'raw-loader'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-apollo_vx.x.x.js",
    "content": "// flow-typed signature: ec9430de7a06c401c6f2ed6c6e633c47\n// flow-typed version: <<STUB>>/react-apollo_v1.2.0/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-apollo'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-apollo' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-apollo/ApolloProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/graphql-anywhere_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/hoist-non-react-statics_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/invariant_v2.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/lodash.flatten_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/lodash.isequal_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/lodash.isobject_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/lodash.pick_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/object-assign_v4.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/prop-types_v15.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/flow-typed/npm/redux_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/graphql' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/queryRecycler' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/QueryRecyclerProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/react-apollo.browser.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/react-apollo.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/server' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/shallowEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/test-utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-apollo/withApollo' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-apollo/ApolloProvider.js' {\n  declare module.exports: $Exports<'react-apollo/ApolloProvider'>;\n}\ndeclare module 'react-apollo/browser.js' {\n  declare module.exports: $Exports<'react-apollo/browser'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/graphql-anywhere_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/graphql-anywhere_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/hoist-non-react-statics_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/hoist-non-react-statics_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/invariant_v2.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/invariant_v2.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/lodash.flatten_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/lodash.flatten_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/lodash.isequal_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/lodash.isequal_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/lodash.isobject_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/lodash.isobject_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/lodash.pick_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/lodash.pick_vx.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/object-assign_v4.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/object-assign_v4.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/prop-types_v15.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/prop-types_v15.x.x'>;\n}\ndeclare module 'react-apollo/flow-typed/npm/redux_vx.x.x.js' {\n  declare module.exports: $Exports<'react-apollo/flow-typed/npm/redux_vx.x.x'>;\n}\ndeclare module 'react-apollo/graphql.js' {\n  declare module.exports: $Exports<'react-apollo/graphql'>;\n}\ndeclare module 'react-apollo/index' {\n  declare module.exports: $Exports<'react-apollo'>;\n}\ndeclare module 'react-apollo/index.js' {\n  declare module.exports: $Exports<'react-apollo'>;\n}\ndeclare module 'react-apollo/parser.js' {\n  declare module.exports: $Exports<'react-apollo/parser'>;\n}\ndeclare module 'react-apollo/queryRecycler.js' {\n  declare module.exports: $Exports<'react-apollo/queryRecycler'>;\n}\ndeclare module 'react-apollo/QueryRecyclerProvider.js' {\n  declare module.exports: $Exports<'react-apollo/QueryRecyclerProvider'>;\n}\ndeclare module 'react-apollo/react-apollo.browser.umd.js' {\n  declare module.exports: $Exports<'react-apollo/react-apollo.browser.umd'>;\n}\ndeclare module 'react-apollo/react-apollo.umd.js' {\n  declare module.exports: $Exports<'react-apollo/react-apollo.umd'>;\n}\ndeclare module 'react-apollo/server.js' {\n  declare module.exports: $Exports<'react-apollo/server'>;\n}\ndeclare module 'react-apollo/shallowEqual.js' {\n  declare module.exports: $Exports<'react-apollo/shallowEqual'>;\n}\ndeclare module 'react-apollo/test-utils.js' {\n  declare module.exports: $Exports<'react-apollo/test-utils'>;\n}\ndeclare module 'react-apollo/types.js' {\n  declare module.exports: $Exports<'react-apollo/types'>;\n}\ndeclare module 'react-apollo/withApollo.js' {\n  declare module.exports: $Exports<'react-apollo/withApollo'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-app-rewire-styled-components_vx.x.x.js",
    "content": "// flow-typed signature: d95d361b0d8ef020f7c639303e217a7a\n// flow-typed version: <<STUB>>/react-app-rewire-styled-components_v^3.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-app-rewire-styled-components'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-app-rewire-styled-components' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-app-rewire-styled-components/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewire-styled-components/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-app-rewire-styled-components/dist/index.js' {\n  declare module.exports: $Exports<'react-app-rewire-styled-components/dist/index'>;\n}\ndeclare module 'react-app-rewire-styled-components/src/index.js' {\n  declare module.exports: $Exports<'react-app-rewire-styled-components/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-app-rewired_vx.x.x.js",
    "content": "// flow-typed signature: 4519396f778e344a974b7ba97e7e797e\n// flow-typed version: <<STUB>>/react-app-rewired_v^1.0.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-app-rewired'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-app-rewired' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-app-rewired/bin/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/config-overrides' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/build' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/start' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/utils/babelTransform' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/utils/paths' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-app-rewired/scripts/utils/rewireJestConfig' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-app-rewired/bin/index.js' {\n  declare module.exports: $Exports<'react-app-rewired/bin/index'>;\n}\ndeclare module 'react-app-rewired/config-overrides.js' {\n  declare module.exports: $Exports<'react-app-rewired/config-overrides'>;\n}\ndeclare module 'react-app-rewired/index' {\n  declare module.exports: $Exports<'react-app-rewired'>;\n}\ndeclare module 'react-app-rewired/index.js' {\n  declare module.exports: $Exports<'react-app-rewired'>;\n}\ndeclare module 'react-app-rewired/scripts/build.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/build'>;\n}\ndeclare module 'react-app-rewired/scripts/start.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/start'>;\n}\ndeclare module 'react-app-rewired/scripts/test.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/test'>;\n}\ndeclare module 'react-app-rewired/scripts/utils/babelTransform.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/utils/babelTransform'>;\n}\ndeclare module 'react-app-rewired/scripts/utils/paths.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/utils/paths'>;\n}\ndeclare module 'react-app-rewired/scripts/utils/rewireJestConfig.js' {\n  declare module.exports: $Exports<'react-app-rewired/scripts/utils/rewireJestConfig'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-async-hook_vx.x.x.js",
    "content": "// flow-typed signature: 035b7348b5830524b803d87212f30009\n// flow-typed version: <<STUB>>/react-async-hook_v1.0.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-async-hook'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-async-hook' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-async-hook/dist/index.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-async-hook/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-async-hook/dist/index.es.js' {\n  declare module.exports: $Exports<'react-async-hook/dist/index.es'>;\n}\ndeclare module 'react-async-hook/dist/index.js' {\n  declare module.exports: $Exports<'react-async-hook/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-clipboard.js_vx.x.x.js",
    "content": "// flow-typed signature: f7648c13dff3115b4021ff81f1260a83\n// flow-typed version: <<STUB>>/react-clipboard.js_v^1.1.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-clipboard.js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-clipboard.js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-clipboard.js/dist/react-clipboard' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-clipboard.js/dist/react-clipboard.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-clipboard.js/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-clipboard.js/dist/react-clipboard.js' {\n  declare module.exports: $Exports<'react-clipboard.js/dist/react-clipboard'>;\n}\ndeclare module 'react-clipboard.js/dist/react-clipboard.min.js' {\n  declare module.exports: $Exports<'react-clipboard.js/dist/react-clipboard.min'>;\n}\ndeclare module 'react-clipboard.js/index' {\n  declare module.exports: $Exports<'react-clipboard.js'>;\n}\ndeclare module 'react-clipboard.js/index.js' {\n  declare module.exports: $Exports<'react-clipboard.js'>;\n}\ndeclare module 'react-clipboard.js/webpack.config.js' {\n  declare module.exports: $Exports<'react-clipboard.js/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-dropzone_vx.x.x.js",
    "content": "// flow-typed signature: a5a6c5ef2495cde307215470bb3dd2b5\n// flow-typed version: <<STUB>>/react-dropzone_v8.0.3/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-dropzone'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-dropzone' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-dropzone/commitlint.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/dist/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/dist/es/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/dist/es/utils/styles' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/rollup.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/src/index.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/src/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/src/utils/index.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/src/utils/styles' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/styleguide.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-dropzone/testSetup' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-dropzone/commitlint.config.js' {\n  declare module.exports: $Exports<'react-dropzone/commitlint.config'>;\n}\ndeclare module 'react-dropzone/dist/es/index.js' {\n  declare module.exports: $Exports<'react-dropzone/dist/es/index'>;\n}\ndeclare module 'react-dropzone/dist/es/utils/index.js' {\n  declare module.exports: $Exports<'react-dropzone/dist/es/utils/index'>;\n}\ndeclare module 'react-dropzone/dist/es/utils/styles.js' {\n  declare module.exports: $Exports<'react-dropzone/dist/es/utils/styles'>;\n}\ndeclare module 'react-dropzone/dist/index.js' {\n  declare module.exports: $Exports<'react-dropzone/dist/index'>;\n}\ndeclare module 'react-dropzone/rollup.config.js' {\n  declare module.exports: $Exports<'react-dropzone/rollup.config'>;\n}\ndeclare module 'react-dropzone/src/index.js' {\n  declare module.exports: $Exports<'react-dropzone/src/index'>;\n}\ndeclare module 'react-dropzone/src/index.spec.js' {\n  declare module.exports: $Exports<'react-dropzone/src/index.spec'>;\n}\ndeclare module 'react-dropzone/src/utils/index.js' {\n  declare module.exports: $Exports<'react-dropzone/src/utils/index'>;\n}\ndeclare module 'react-dropzone/src/utils/index.spec.js' {\n  declare module.exports: $Exports<'react-dropzone/src/utils/index.spec'>;\n}\ndeclare module 'react-dropzone/src/utils/styles.js' {\n  declare module.exports: $Exports<'react-dropzone/src/utils/styles'>;\n}\ndeclare module 'react-dropzone/styleguide.config.js' {\n  declare module.exports: $Exports<'react-dropzone/styleguide.config'>;\n}\ndeclare module 'react-dropzone/testSetup.js' {\n  declare module.exports: $Exports<'react-dropzone/testSetup'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-error-boundary_vx.x.x.js",
    "content": "// flow-typed signature: 4f5b1d9927fde2b4384f0560cb8f8065\n// flow-typed version: <<STUB>>/react-error-boundary_v1.2.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-error-boundary'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-error-boundary' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-error-boundary/dist/commonjs/ErrorBoundary' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/commonjs/ErrorBoundaryFallbackComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/commonjs/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/es/ErrorBoundary' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/es/ErrorBoundaryFallbackComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-error-boundary/dist/umd/react-error-boundary' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-error-boundary/dist/commonjs/ErrorBoundary.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/commonjs/ErrorBoundary'>;\n}\ndeclare module 'react-error-boundary/dist/commonjs/ErrorBoundaryFallbackComponent.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/commonjs/ErrorBoundaryFallbackComponent'>;\n}\ndeclare module 'react-error-boundary/dist/commonjs/index.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/commonjs/index'>;\n}\ndeclare module 'react-error-boundary/dist/es/ErrorBoundary.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/es/ErrorBoundary'>;\n}\ndeclare module 'react-error-boundary/dist/es/ErrorBoundaryFallbackComponent.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/es/ErrorBoundaryFallbackComponent'>;\n}\ndeclare module 'react-error-boundary/dist/es/index.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/es/index'>;\n}\ndeclare module 'react-error-boundary/dist/umd/react-error-boundary.js' {\n  declare module.exports: $Exports<'react-error-boundary/dist/umd/react-error-boundary'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-flip-move_v2.9.x.js",
    "content": "// flow-typed signature: 423496219cf1ec834de810346b166e03\n// flow-typed version: bb2961bcf6/react-flip-move_v2.9.x/flow_>=v0.53.0\n\ndeclare module \"react-flip-move\" {\n  declare export type Styles = {\n    [key: string]: string\n  };\n\n  declare type ReactStyles = {\n    [key: string]: string | number\n  };\n\n  declare export type Animation = {\n    from: Styles,\n    to: Styles\n  };\n\n  declare export type Presets = {\n    elevator: Animation,\n    fade: Animation,\n    accordionVertical: Animation,\n    accordionHorizontal: Animation,\n    none: null\n  };\n\n  declare export type AnimationProp = $Keys<Presets> | boolean | Animation;\n\n  declare export type ClientRect = {\n    top: number,\n    right: number,\n    bottom: number,\n    left: number,\n    height: number,\n    width: number\n  };\n\n  // can't use $Shape<React$Element<*>> here, because we use it in intersection\n  declare export type ElementShape = {\n    +type: $PropertyType<React$Element<*>, \"type\">,\n    +props: $PropertyType<React$Element<*>, \"props\">,\n    +key: $PropertyType<React$Element<*>, \"key\">,\n    +ref: $PropertyType<React$Element<*>, \"ref\">\n  };\n\n  declare type ChildHook = (element: ElementShape, node: ?HTMLElement) => mixed;\n\n  declare export type ChildrenHook = (\n    elements: Array<ElementShape>,\n    nodes: Array<?HTMLElement>\n  ) => mixed;\n\n  declare export type GetPosition = (node: HTMLElement) => ClientRect;\n\n  declare export type VerticalAlignment = \"top\" | \"bottom\";\n\n  declare export type Child = void | null | boolean | React$Element<*>;\n\n  // can't import from React, see https://github.com/facebook/flow/issues/4787\n  declare type ChildrenArray<T> = $ReadOnlyArray<ChildrenArray<T>> | T;\n\n  declare type BaseProps = {\n    easing: string,\n    typeName: string,\n    disableAllAnimations: boolean,\n    getPosition: GetPosition,\n    maintainContainerHeight: boolean,\n    verticalAlignment: VerticalAlignment\n  };\n\n  declare type PolymorphicProps = {\n    duration: string | number,\n    delay: string | number,\n    staggerDurationBy: string | number,\n    staggerDelayBy: string | number,\n    enterAnimation: AnimationProp,\n    leaveAnimation: AnimationProp\n  };\n\n  declare type Hooks = {\n    onStart?: ChildHook,\n    onFinish?: ChildHook,\n    onStartAll?: ChildrenHook,\n    onFinishAll?: ChildrenHook\n  };\n\n  declare export type DelegatedProps = {\n    style?: ReactStyles\n  };\n\n  declare export type FlipMoveDefaultProps = BaseProps & PolymorphicProps;\n\n  declare export type CommonProps = BaseProps &\n    Hooks & {\n      children?: ChildrenArray<Child>\n    };\n\n  declare export type FlipMoveProps = FlipMoveDefaultProps &\n    CommonProps &\n    DelegatedProps & {\n      appearAnimation?: AnimationProp,\n      disableAnimations?: boolean // deprecated, use disableAllAnimations instead\n    };\n\n  declare class FlipMove extends React$Component<FlipMoveProps> {\n    static defaultProps: FlipMoveDefaultProps\n  }\n\n  declare export default typeof FlipMove\n}\n"
  },
  {
    "path": "flow-typed/npm/react-helmet-async_vx.x.x.js",
    "content": "// flow-typed signature: f04849aadd363869c492a68fc3aafa1a\n// flow-typed version: <<STUB>>/react-helmet-async_v^0.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-helmet-async'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-helmet-async' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-helmet-async/es/client' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/constants' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/Dispatcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/InstanceStore' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/server' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/es/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/client' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/constants' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/Dispatcher' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/InstanceStore' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/server' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet-async/lib/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-helmet-async/es/client.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/client'>;\n}\ndeclare module 'react-helmet-async/es/constants.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/constants'>;\n}\ndeclare module 'react-helmet-async/es/Dispatcher.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/Dispatcher'>;\n}\ndeclare module 'react-helmet-async/es/index.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/index'>;\n}\ndeclare module 'react-helmet-async/es/InstanceStore.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/InstanceStore'>;\n}\ndeclare module 'react-helmet-async/es/Provider.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/Provider'>;\n}\ndeclare module 'react-helmet-async/es/server.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/server'>;\n}\ndeclare module 'react-helmet-async/es/utils.js' {\n  declare module.exports: $Exports<'react-helmet-async/es/utils'>;\n}\ndeclare module 'react-helmet-async/lib/client.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/client'>;\n}\ndeclare module 'react-helmet-async/lib/constants.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/constants'>;\n}\ndeclare module 'react-helmet-async/lib/Dispatcher.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/Dispatcher'>;\n}\ndeclare module 'react-helmet-async/lib/index.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/index'>;\n}\ndeclare module 'react-helmet-async/lib/InstanceStore.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/InstanceStore'>;\n}\ndeclare module 'react-helmet-async/lib/Provider.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/Provider'>;\n}\ndeclare module 'react-helmet-async/lib/server.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/server'>;\n}\ndeclare module 'react-helmet-async/lib/utils.js' {\n  declare module.exports: $Exports<'react-helmet-async/lib/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-helmet_vx.x.x.js",
    "content": "// flow-typed signature: 184374a0896a8b43d22e543169d80eaa\n// flow-typed version: <<STUB>>/react-helmet_v5.x/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-helmet'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-helmet' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-helmet/es/Helmet' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/es/HelmetConstants' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/es/HelmetUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/lib/Helmet' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/lib/HelmetConstants' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/lib/HelmetUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/test/HelmetDeclarativeTest' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/test/HelmetTest' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-helmet/test/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-helmet/es/Helmet.js' {\n  declare module.exports: $Exports<'react-helmet/es/Helmet'>;\n}\ndeclare module 'react-helmet/es/HelmetConstants.js' {\n  declare module.exports: $Exports<'react-helmet/es/HelmetConstants'>;\n}\ndeclare module 'react-helmet/es/HelmetUtils.js' {\n  declare module.exports: $Exports<'react-helmet/es/HelmetUtils'>;\n}\ndeclare module 'react-helmet/lib/Helmet.js' {\n  declare module.exports: $Exports<'react-helmet/lib/Helmet'>;\n}\ndeclare module 'react-helmet/lib/HelmetConstants.js' {\n  declare module.exports: $Exports<'react-helmet/lib/HelmetConstants'>;\n}\ndeclare module 'react-helmet/lib/HelmetUtils.js' {\n  declare module.exports: $Exports<'react-helmet/lib/HelmetUtils'>;\n}\ndeclare module 'react-helmet/test/HelmetDeclarativeTest.js' {\n  declare module.exports: $Exports<'react-helmet/test/HelmetDeclarativeTest'>;\n}\ndeclare module 'react-helmet/test/HelmetTest.js' {\n  declare module.exports: $Exports<'react-helmet/test/HelmetTest'>;\n}\ndeclare module 'react-helmet/test/test.js' {\n  declare module.exports: $Exports<'react-helmet/test/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-hot-loader_vx.x.x.js",
    "content": "// flow-typed signature: e4fabee0a29fd025cb9354e1b63344aa\n// flow-typed version: <<STUB>>/react-hot-loader_v4.3.11/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-hot-loader'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-hot-loader' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-hot-loader/babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-hot-loader/dist/babel.development' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-hot-loader/dist/babel.production.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-hot-loader/dist/react-hot-loader.development' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-hot-loader/dist/react-hot-loader.production.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-hot-loader/patch' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-hot-loader/babel.js' {\n  declare module.exports: $Exports<'react-hot-loader/babel'>;\n}\ndeclare module 'react-hot-loader/dist/babel.development.js' {\n  declare module.exports: $Exports<'react-hot-loader/dist/babel.development'>;\n}\ndeclare module 'react-hot-loader/dist/babel.production.min.js' {\n  declare module.exports: $Exports<'react-hot-loader/dist/babel.production.min'>;\n}\ndeclare module 'react-hot-loader/dist/react-hot-loader.development.js' {\n  declare module.exports: $Exports<'react-hot-loader/dist/react-hot-loader.development'>;\n}\ndeclare module 'react-hot-loader/dist/react-hot-loader.production.min.js' {\n  declare module.exports: $Exports<'react-hot-loader/dist/react-hot-loader.production.min'>;\n}\ndeclare module 'react-hot-loader/index' {\n  declare module.exports: $Exports<'react-hot-loader'>;\n}\ndeclare module 'react-hot-loader/index.js' {\n  declare module.exports: $Exports<'react-hot-loader'>;\n}\ndeclare module 'react-hot-loader/patch.js' {\n  declare module.exports: $Exports<'react-hot-loader/patch'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-image_vx.x.x.js",
    "content": "// flow-typed signature: 70f7fe7601a56f8bfeb1f08c45ca056a\n// flow-typed version: <<STUB>>/react-image_v1.5.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-image'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-image' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-image/cjs/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/cjs/index.ssr-test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/cjs/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/es/index.ssr-test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/es/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/umd/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/umd/index.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-image/umd/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-image/cjs/index.js' {\n  declare module.exports: $Exports<'react-image/cjs/index'>;\n}\ndeclare module 'react-image/cjs/index.ssr-test.js' {\n  declare module.exports: $Exports<'react-image/cjs/index.ssr-test'>;\n}\ndeclare module 'react-image/cjs/index.test.js' {\n  declare module.exports: $Exports<'react-image/cjs/index.test'>;\n}\ndeclare module 'react-image/es/index.js' {\n  declare module.exports: $Exports<'react-image/es/index'>;\n}\ndeclare module 'react-image/es/index.ssr-test.js' {\n  declare module.exports: $Exports<'react-image/es/index.ssr-test'>;\n}\ndeclare module 'react-image/es/index.test.js' {\n  declare module.exports: $Exports<'react-image/es/index.test'>;\n}\ndeclare module 'react-image/umd/index.js' {\n  declare module.exports: $Exports<'react-image/umd/index'>;\n}\ndeclare module 'react-image/umd/index.min.js' {\n  declare module.exports: $Exports<'react-image/umd/index.min'>;\n}\ndeclare module 'react-image/umd/index.test.js' {\n  declare module.exports: $Exports<'react-image/umd/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-infinite-scroller-fork-mxstbr_vx.x.x.js",
    "content": "// flow-typed signature: ce15133e6fc07b478594da7d33ada1a8\n// flow-typed version: <<STUB>>/react-infinite-scroller-fork-mxstbr_v1.2.7/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-infinite-scroller-fork-mxstbr'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-infinite-scroller-fork-mxstbr' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-infinite-scroller-fork-mxstbr/dist/InfiniteScroll' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-infinite-scroller-fork-mxstbr/dist/InfiniteScroll.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-fork-mxstbr/dist/InfiniteScroll'>;\n}\ndeclare module 'react-infinite-scroller-fork-mxstbr/index' {\n  declare module.exports: $Exports<'react-infinite-scroller-fork-mxstbr'>;\n}\ndeclare module 'react-infinite-scroller-fork-mxstbr/index.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-fork-mxstbr'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-infinite-scroller-with-scroll-element_vx.x.x.js",
    "content": "// flow-typed signature: f79a676a27110a63801ef9af476e2c3d\n// flow-typed version: <<STUB>>/react-infinite-scroller-with-scroll-element_v^1.0.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-infinite-scroller-with-scroll-element'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-infinite-scroller-with-scroll-element' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-infinite-scroller-with-scroll-element/dist/InfiniteScroll' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/gulpfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/js/script' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-infinite-scroller-with-scroll-element/src/InfiniteScroll' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-infinite-scroller-with-scroll-element/dist/InfiniteScroll.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-with-scroll-element/dist/InfiniteScroll'>;\n}\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/gulpfile.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-with-scroll-element/docs/gulpfile'>;\n}\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/js/script.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-with-scroll-element/docs/js/script'>;\n}\ndeclare module 'react-infinite-scroller-with-scroll-element/docs/src/index.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-with-scroll-element/docs/src/index'>;\n}\ndeclare module 'react-infinite-scroller-with-scroll-element/src/InfiniteScroll.js' {\n  declare module.exports: $Exports<'react-infinite-scroller-with-scroll-element/src/InfiniteScroll'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-loadable_vx.x.x.js",
    "content": "// flow-typed signature: aae3091f4281be4785c6f2a5f47f3628\n// flow-typed version: <<STUB>>/react-loadable_v5.2.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-loadable'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-loadable' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-loadable/babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-loadable/lib/babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-loadable/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-loadable/lib/webpack' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-loadable/webpack' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-loadable/babel.js' {\n  declare module.exports: $Exports<'react-loadable/babel'>;\n}\ndeclare module 'react-loadable/lib/babel.js' {\n  declare module.exports: $Exports<'react-loadable/lib/babel'>;\n}\ndeclare module 'react-loadable/lib/index.js' {\n  declare module.exports: $Exports<'react-loadable/lib/index'>;\n}\ndeclare module 'react-loadable/lib/webpack.js' {\n  declare module.exports: $Exports<'react-loadable/lib/webpack'>;\n}\ndeclare module 'react-loadable/webpack.js' {\n  declare module.exports: $Exports<'react-loadable/webpack'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-mentions_vx.x.x.js",
    "content": "// flow-typed signature: 12ab11615dc44ebfea392e40b67a020e\n// flow-typed version: <<STUB>>/react-mentions_v2.4.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-mentions'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-mentions' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-mentions/es/Highlighter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/LoadingIndicator' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/Mention' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/MentionsInput' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/Suggestion' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/SuggestionsOverlay' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/es/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/Highlighter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/LoadingIndicator' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/Mention' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/MentionsInput' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/Suggestion' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/SuggestionsOverlay' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/lib/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/umd/react-mentions' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-mentions/umd/react-mentions.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-mentions/es/Highlighter.js' {\n  declare module.exports: $Exports<'react-mentions/es/Highlighter'>;\n}\ndeclare module 'react-mentions/es/index.js' {\n  declare module.exports: $Exports<'react-mentions/es/index'>;\n}\ndeclare module 'react-mentions/es/LoadingIndicator.js' {\n  declare module.exports: $Exports<'react-mentions/es/LoadingIndicator'>;\n}\ndeclare module 'react-mentions/es/Mention.js' {\n  declare module.exports: $Exports<'react-mentions/es/Mention'>;\n}\ndeclare module 'react-mentions/es/MentionsInput.js' {\n  declare module.exports: $Exports<'react-mentions/es/MentionsInput'>;\n}\ndeclare module 'react-mentions/es/Suggestion.js' {\n  declare module.exports: $Exports<'react-mentions/es/Suggestion'>;\n}\ndeclare module 'react-mentions/es/SuggestionsOverlay.js' {\n  declare module.exports: $Exports<'react-mentions/es/SuggestionsOverlay'>;\n}\ndeclare module 'react-mentions/es/utils.js' {\n  declare module.exports: $Exports<'react-mentions/es/utils'>;\n}\ndeclare module 'react-mentions/lib/Highlighter.js' {\n  declare module.exports: $Exports<'react-mentions/lib/Highlighter'>;\n}\ndeclare module 'react-mentions/lib/index.js' {\n  declare module.exports: $Exports<'react-mentions/lib/index'>;\n}\ndeclare module 'react-mentions/lib/LoadingIndicator.js' {\n  declare module.exports: $Exports<'react-mentions/lib/LoadingIndicator'>;\n}\ndeclare module 'react-mentions/lib/Mention.js' {\n  declare module.exports: $Exports<'react-mentions/lib/Mention'>;\n}\ndeclare module 'react-mentions/lib/MentionsInput.js' {\n  declare module.exports: $Exports<'react-mentions/lib/MentionsInput'>;\n}\ndeclare module 'react-mentions/lib/Suggestion.js' {\n  declare module.exports: $Exports<'react-mentions/lib/Suggestion'>;\n}\ndeclare module 'react-mentions/lib/SuggestionsOverlay.js' {\n  declare module.exports: $Exports<'react-mentions/lib/SuggestionsOverlay'>;\n}\ndeclare module 'react-mentions/lib/utils.js' {\n  declare module.exports: $Exports<'react-mentions/lib/utils'>;\n}\ndeclare module 'react-mentions/umd/react-mentions.js' {\n  declare module.exports: $Exports<'react-mentions/umd/react-mentions'>;\n}\ndeclare module 'react-mentions/umd/react-mentions.min.js' {\n  declare module.exports: $Exports<'react-mentions/umd/react-mentions.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-modal_vx.x.x.js",
    "content": "// flow-typed signature: b1af61880ac1a8110183bbbf35167673\n// flow-typed version: <<STUB>>/react-modal_v^1.6.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-modal'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-modal' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-anchorjs/anchor-style' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-codepen/embed-codepen' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-edit-link/plugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-fontsettings/fontsettings' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-github/plugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-livereload/plugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-lunr/lunr.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-lunr/search-lunr' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/lunr.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/search-engine' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/search' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-sharing/buttons' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/gitbook' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/_book/gitbook/theme' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/prettify' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/sorter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/coverage/lcov-report/prettify' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/coverage/lcov-report/sorter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/dist/react-modal' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/dist/react-modal.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/components/Modal' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/components/ModalPortal' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/helpers/ariaAppHider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/helpers/focusManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/helpers/refCount' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/helpers/scopeTab' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/helpers/tabbable' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/webpack.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/webpack.dist.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-modal/webpack.test.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-anchorjs/anchor-style.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-anchorjs/anchor-style'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-codepen/embed-codepen.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-codepen/embed-codepen'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-edit-link/plugin.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-edit-link/plugin'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-fontsettings/fontsettings.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-fontsettings/fontsettings'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-github/plugin.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-github/plugin'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-livereload/plugin.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-livereload/plugin'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-lunr/lunr.min.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-lunr/lunr.min'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-lunr/search-lunr.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-lunr/search-lunr'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/lunr.min.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-search/lunr.min'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/search-engine.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-search/search-engine'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-search/search.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-search/search'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook-plugin-sharing/buttons.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook-plugin-sharing/buttons'>;\n}\ndeclare module 'react-modal/_book/gitbook/gitbook.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/gitbook'>;\n}\ndeclare module 'react-modal/_book/gitbook/theme.js' {\n  declare module.exports: $Exports<'react-modal/_book/gitbook/theme'>;\n}\ndeclare module 'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/prettify.js' {\n  declare module.exports: $Exports<'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/prettify'>;\n}\ndeclare module 'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/sorter.js' {\n  declare module.exports: $Exports<'react-modal/coverage/Chrome 58.0.3029 (Mac OS X 10.12.5)/lcov-report/sorter'>;\n}\ndeclare module 'react-modal/coverage/lcov-report/prettify.js' {\n  declare module.exports: $Exports<'react-modal/coverage/lcov-report/prettify'>;\n}\ndeclare module 'react-modal/coverage/lcov-report/sorter.js' {\n  declare module.exports: $Exports<'react-modal/coverage/lcov-report/sorter'>;\n}\ndeclare module 'react-modal/dist/react-modal.js' {\n  declare module.exports: $Exports<'react-modal/dist/react-modal'>;\n}\ndeclare module 'react-modal/dist/react-modal.min.js' {\n  declare module.exports: $Exports<'react-modal/dist/react-modal.min'>;\n}\ndeclare module 'react-modal/lib/components/Modal.js' {\n  declare module.exports: $Exports<'react-modal/lib/components/Modal'>;\n}\ndeclare module 'react-modal/lib/components/ModalPortal.js' {\n  declare module.exports: $Exports<'react-modal/lib/components/ModalPortal'>;\n}\ndeclare module 'react-modal/lib/helpers/ariaAppHider.js' {\n  declare module.exports: $Exports<'react-modal/lib/helpers/ariaAppHider'>;\n}\ndeclare module 'react-modal/lib/helpers/focusManager.js' {\n  declare module.exports: $Exports<'react-modal/lib/helpers/focusManager'>;\n}\ndeclare module 'react-modal/lib/helpers/refCount.js' {\n  declare module.exports: $Exports<'react-modal/lib/helpers/refCount'>;\n}\ndeclare module 'react-modal/lib/helpers/scopeTab.js' {\n  declare module.exports: $Exports<'react-modal/lib/helpers/scopeTab'>;\n}\ndeclare module 'react-modal/lib/helpers/tabbable.js' {\n  declare module.exports: $Exports<'react-modal/lib/helpers/tabbable'>;\n}\ndeclare module 'react-modal/lib/index.js' {\n  declare module.exports: $Exports<'react-modal/lib/index'>;\n}\ndeclare module 'react-modal/webpack.config.js' {\n  declare module.exports: $Exports<'react-modal/webpack.config'>;\n}\ndeclare module 'react-modal/webpack.dist.config.js' {\n  declare module.exports: $Exports<'react-modal/webpack.dist.config'>;\n}\ndeclare module 'react-modal/webpack.test.config.js' {\n  declare module.exports: $Exports<'react-modal/webpack.test.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-popper_vx.x.x.js",
    "content": "// flow-typed signature: 3616931cff0dd9b73bbe98046f6a84d6\n// flow-typed version: <<STUB>>/react-popper_v1.0.2/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-popper'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-popper' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-popper/dist/index.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/dist/index.umd.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/__typings__/main-test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/Manager' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/Popper' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/Reference' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/cjs/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/__typings__/main-test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/Manager' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/Popper' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/Reference' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-popper/lib/esm/utils' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-popper/dist/index.umd.js' {\n  declare module.exports: $Exports<'react-popper/dist/index.umd'>;\n}\ndeclare module 'react-popper/dist/index.umd.min.js' {\n  declare module.exports: $Exports<'react-popper/dist/index.umd.min'>;\n}\ndeclare module 'react-popper/lib/cjs/__typings__/main-test.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/__typings__/main-test'>;\n}\ndeclare module 'react-popper/lib/cjs/index.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/index'>;\n}\ndeclare module 'react-popper/lib/cjs/Manager.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/Manager'>;\n}\ndeclare module 'react-popper/lib/cjs/Popper.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/Popper'>;\n}\ndeclare module 'react-popper/lib/cjs/Reference.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/Reference'>;\n}\ndeclare module 'react-popper/lib/cjs/utils.js' {\n  declare module.exports: $Exports<'react-popper/lib/cjs/utils'>;\n}\ndeclare module 'react-popper/lib/esm/__typings__/main-test.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/__typings__/main-test'>;\n}\ndeclare module 'react-popper/lib/esm/index.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/index'>;\n}\ndeclare module 'react-popper/lib/esm/Manager.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/Manager'>;\n}\ndeclare module 'react-popper/lib/esm/Popper.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/Popper'>;\n}\ndeclare module 'react-popper/lib/esm/Reference.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/Reference'>;\n}\ndeclare module 'react-popper/lib/esm/utils.js' {\n  declare module.exports: $Exports<'react-popper/lib/esm/utils'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-redux_v5.x.x.js",
    "content": "// flow-typed signature: f0d96df48e9abc14bcc1405ba2a47dde\n// flow-typed version: 83053e4020/react-redux_v5.x.x/flow_>=v0.53.x\n\n// flow-typed signature: 8db7b853f57c51094bf0ab8b2650fd9c\n// flow-typed version: ab8db5f14d/react-redux_v5.x.x/flow_>=v0.30.x\n\nimport type { Dispatch, Store } from 'redux';\n\ndeclare module 'react-redux' {\n  /*\n\n    S = State\n    A = Action\n    OP = OwnProps\n    SP = StateProps\n    DP = DispatchProps\n\n  */\n\n  declare type MapStateToProps<S, OP: Object, SP: Object> = (\n    state: S,\n    ownProps: OP\n  ) => ((state: S, ownProps: OP) => SP) | SP;\n\n  declare type MapDispatchToProps<A, OP: Object, DP: Object> =\n    | ((dispatch: Dispatch<A>, ownProps: OP) => DP)\n    | DP;\n\n  declare type MergeProps<SP, DP: Object, OP: Object, P: Object> = (\n    stateProps: SP,\n    dispatchProps: DP,\n    ownProps: OP\n  ) => P;\n\n  declare type Context = { store: Store<*, *> };\n\n  declare class ConnectedComponent<OP, P> extends React$Component<OP> {\n    static WrappedComponent: Class<React$Component<P>>,\n    getWrappedInstance(): React$Component<P>,\n    props: OP,\n    state: void,\n  }\n\n  declare type ConnectedComponentClass<OP, P> = Class<\n    ConnectedComponent<OP, P>\n  >;\n\n  declare type Connector<OP, P> = (\n    component: React$ComponentType<P>\n  ) => ConnectedComponentClass<OP, P>;\n\n  declare class Provider<S, A> extends React$Component<{\n    store: Store<S, A>,\n    children?: any,\n  }> {}\n\n  declare function createProvider(\n    storeKey?: string,\n    subKey?: string\n  ): Provider<*, *>;\n\n  declare type ConnectOptions = {\n    pure?: boolean,\n    withRef?: boolean,\n  };\n\n  declare type Null = null | void;\n\n  declare function connect<A, OP>(\n    ...rest: Array<void> // <= workaround for https://github.com/facebook/flow/issues/2360\n  ): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;\n\n  declare function connect<A, OP>(\n    mapStateToProps: Null,\n    mapDispatchToProps: Null,\n    mergeProps: Null,\n    options: ConnectOptions\n  ): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;\n\n  declare function connect<S, A, OP, SP>(\n    mapStateToProps: MapStateToProps<S, OP, SP>,\n    mapDispatchToProps: Null,\n    mergeProps: Null,\n    options?: ConnectOptions\n  ): Connector<OP, $Supertype<SP & { dispatch: Dispatch<A> } & OP>>;\n\n  declare function connect<A, OP, DP>(\n    mapStateToProps: Null,\n    mapDispatchToProps: MapDispatchToProps<A, OP, DP>,\n    mergeProps: Null,\n    options?: ConnectOptions\n  ): Connector<OP, $Supertype<DP & OP>>;\n\n  declare function connect<S, A, OP, SP, DP>(\n    mapStateToProps: MapStateToProps<S, OP, SP>,\n    mapDispatchToProps: MapDispatchToProps<A, OP, DP>,\n    mergeProps: Null,\n    options?: ConnectOptions\n  ): Connector<OP, $Supertype<SP & DP & OP>>;\n\n  declare function connect<S, A, OP, SP, DP, P>(\n    mapStateToProps: MapStateToProps<S, OP, SP>,\n    mapDispatchToProps: Null,\n    mergeProps: MergeProps<SP, DP, OP, P>,\n    options?: ConnectOptions\n  ): Connector<OP, P>;\n\n  declare function connect<S, A, OP, SP, DP, P>(\n    mapStateToProps: MapStateToProps<S, OP, SP>,\n    mapDispatchToProps: MapDispatchToProps<A, OP, DP>,\n    mergeProps: MergeProps<SP, DP, OP, P>,\n    options?: ConnectOptions\n  ): Connector<OP, P>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-remarkable_vx.x.x.js",
    "content": "// flow-typed signature: 945cd904850eeca8414f8e34587bb528\n// flow-typed version: <<STUB>>/react-remarkable_v^1.1.1/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-remarkable'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-remarkable' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-remarkable/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-remarkable/dist/index.js' {\n  declare module.exports: $Exports<'react-remarkable/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-router-dom_vx.x.x.js",
    "content": "// flow-typed signature: 5050035541282646ebfe1bc7e42e2916\n// flow-typed version: <<STUB>>/react-router-dom_v^4.0.0-beta.7/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-router-dom'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-router-dom' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-router-dom/BrowserRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/BrowserRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/HashRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Link' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/matchPath' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/MemoryRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/NavLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Prompt' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Redirect' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Route' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Router' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/StaticRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/Switch' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/es/withRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/HashRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Link' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/matchPath' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/MemoryRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/NavLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Prompt' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Redirect' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Route' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Router' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/StaticRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/Switch' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/umd/react-router-dom' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/umd/react-router-dom.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router-dom/withRouter' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-router-dom/BrowserRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/BrowserRouter'>;\n}\ndeclare module 'react-router-dom/es/BrowserRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/es/BrowserRouter'>;\n}\ndeclare module 'react-router-dom/es/HashRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/es/HashRouter'>;\n}\ndeclare module 'react-router-dom/es/index.js' {\n  declare module.exports: $Exports<'react-router-dom/es/index'>;\n}\ndeclare module 'react-router-dom/es/Link.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Link'>;\n}\ndeclare module 'react-router-dom/es/matchPath.js' {\n  declare module.exports: $Exports<'react-router-dom/es/matchPath'>;\n}\ndeclare module 'react-router-dom/es/MemoryRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/es/MemoryRouter'>;\n}\ndeclare module 'react-router-dom/es/NavLink.js' {\n  declare module.exports: $Exports<'react-router-dom/es/NavLink'>;\n}\ndeclare module 'react-router-dom/es/Prompt.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Prompt'>;\n}\ndeclare module 'react-router-dom/es/Redirect.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Redirect'>;\n}\ndeclare module 'react-router-dom/es/Route.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Route'>;\n}\ndeclare module 'react-router-dom/es/Router.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Router'>;\n}\ndeclare module 'react-router-dom/es/StaticRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/es/StaticRouter'>;\n}\ndeclare module 'react-router-dom/es/Switch.js' {\n  declare module.exports: $Exports<'react-router-dom/es/Switch'>;\n}\ndeclare module 'react-router-dom/es/withRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/es/withRouter'>;\n}\ndeclare module 'react-router-dom/HashRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/HashRouter'>;\n}\ndeclare module 'react-router-dom/index' {\n  declare module.exports: $Exports<'react-router-dom'>;\n}\ndeclare module 'react-router-dom/index.js' {\n  declare module.exports: $Exports<'react-router-dom'>;\n}\ndeclare module 'react-router-dom/Link.js' {\n  declare module.exports: $Exports<'react-router-dom/Link'>;\n}\ndeclare module 'react-router-dom/matchPath.js' {\n  declare module.exports: $Exports<'react-router-dom/matchPath'>;\n}\ndeclare module 'react-router-dom/MemoryRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/MemoryRouter'>;\n}\ndeclare module 'react-router-dom/NavLink.js' {\n  declare module.exports: $Exports<'react-router-dom/NavLink'>;\n}\ndeclare module 'react-router-dom/Prompt.js' {\n  declare module.exports: $Exports<'react-router-dom/Prompt'>;\n}\ndeclare module 'react-router-dom/Redirect.js' {\n  declare module.exports: $Exports<'react-router-dom/Redirect'>;\n}\ndeclare module 'react-router-dom/Route.js' {\n  declare module.exports: $Exports<'react-router-dom/Route'>;\n}\ndeclare module 'react-router-dom/Router.js' {\n  declare module.exports: $Exports<'react-router-dom/Router'>;\n}\ndeclare module 'react-router-dom/StaticRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/StaticRouter'>;\n}\ndeclare module 'react-router-dom/Switch.js' {\n  declare module.exports: $Exports<'react-router-dom/Switch'>;\n}\ndeclare module 'react-router-dom/umd/react-router-dom.js' {\n  declare module.exports: $Exports<'react-router-dom/umd/react-router-dom'>;\n}\ndeclare module 'react-router-dom/umd/react-router-dom.min.js' {\n  declare module.exports: $Exports<'react-router-dom/umd/react-router-dom.min'>;\n}\ndeclare module 'react-router-dom/withRouter.js' {\n  declare module.exports: $Exports<'react-router-dom/withRouter'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-router_v4.x.x.js",
    "content": "// flow-typed signature: 1e6728f0a649edac3689d6e2db7487a7\n// flow-typed version: 01716df816/react-router_v4.x.x/flow_>=v0.53.x\n\ndeclare module \"react-router\" {\n  // NOTE: many of these are re-exported by react-router-dom and\n  // react-router-native, so when making changes, please be sure to update those\n  // as well.\n  declare export type Location = {\n    pathname: string,\n    search: string,\n    hash: string,\n    state?: any,\n    key?: string\n  };\n\n  declare export type LocationShape = {\n    pathname?: string,\n    search?: string,\n    hash?: string,\n    state?: any\n  };\n\n  declare export type HistoryAction = \"PUSH\" | \"REPLACE\" | \"POP\";\n\n  declare export type RouterHistory = {\n    length: number,\n    location: Location,\n    action: HistoryAction,\n    listen(\n      callback: (location: Location, action: HistoryAction) => void\n    ): () => void,\n    push(path: string | LocationShape, state?: any): void,\n    replace(path: string | LocationShape, state?: any): void,\n    go(n: number): void,\n    goBack(): void,\n    goForward(): void,\n    canGo?: (n: number) => boolean,\n    block(\n      callback: (location: Location, action: HistoryAction) => boolean\n    ): void,\n    // createMemoryHistory\n    index?: number,\n    entries?: Array<Location>\n  };\n\n  declare export type Match = {\n    params: { [key: string]: ?string },\n    isExact: boolean,\n    path: string,\n    url: string\n  };\n\n  declare export type ContextRouter = {|\n    history: RouterHistory,\n    location: Location,\n    match: Match\n  |};\n\n  declare export type GetUserConfirmation = (\n    message: string,\n    callback: (confirmed: boolean) => void\n  ) => void;\n\n  declare type StaticRouterContext = {\n    url?: string\n  };\n\n  declare export class StaticRouter extends React$Component<{\n    basename?: string,\n    location?: string | Location,\n    context: StaticRouterContext,\n    children?: React$Node\n  }> {}\n\n  declare export class MemoryRouter extends React$Component<{\n    initialEntries?: Array<LocationShape | string>,\n    initialIndex?: number,\n    getUserConfirmation?: GetUserConfirmation,\n    keyLength?: number,\n    children?: React$Node\n  }> {}\n\n  declare export class Router extends React$Component<{\n    history: RouterHistory,\n    children?: React$Node\n  }> {}\n\n  declare export class Prompt extends React$Component<{\n    message: string | ((location: Location) => string | true),\n    when?: boolean\n  }> {}\n\n  declare export class Redirect extends React$Component<{\n    to: string | LocationShape,\n    push?: boolean\n  }> {}\n\n  declare export class Route extends React$Component<{\n    component?: React$ComponentType<*>,\n    render?: (router: ContextRouter) => React$Node,\n    children?: React$ComponentType<ContextRouter> | React$Node,\n    path?: string,\n    exact?: boolean,\n    strict?: boolean\n  }> {}\n\n  declare export class Switch extends React$Component<{\n    children?: React$Node\n  }> {}\n\n  declare export function withRouter<P>(\n    Component: React$ComponentType<{| ...ContextRouter, ...P |}>\n  ): React$ComponentType<P>;\n\n  declare type MatchPathOptions = {\n    path?: string,\n    exact?: boolean,\n    strict?: boolean,\n    sensitive?: boolean\n  };\n  declare export function matchPath(\n    pathname: string,\n    options?: MatchPathOptions | string\n  ): null | Match;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-router_vx.x.x.js",
    "content": "// flow-typed signature: 38348f99736642427eb37769cbb723f3\n// flow-typed version: <<STUB>>/react-router_v^4.0.0-beta.7/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-router'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-router' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-router/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/matchPath' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/MemoryRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/Prompt' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/Redirect' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/Route' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/Router' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/StaticRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/Switch' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/es/withRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/matchPath' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/MemoryRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/Prompt' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/Redirect' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/Route' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/Router' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/StaticRouter' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/Switch' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/umd/react-router' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/umd/react-router.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-router/withRouter' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-router/es/index.js' {\n  declare module.exports: $Exports<'react-router/es/index'>;\n}\ndeclare module 'react-router/es/matchPath.js' {\n  declare module.exports: $Exports<'react-router/es/matchPath'>;\n}\ndeclare module 'react-router/es/MemoryRouter.js' {\n  declare module.exports: $Exports<'react-router/es/MemoryRouter'>;\n}\ndeclare module 'react-router/es/Prompt.js' {\n  declare module.exports: $Exports<'react-router/es/Prompt'>;\n}\ndeclare module 'react-router/es/Redirect.js' {\n  declare module.exports: $Exports<'react-router/es/Redirect'>;\n}\ndeclare module 'react-router/es/Route.js' {\n  declare module.exports: $Exports<'react-router/es/Route'>;\n}\ndeclare module 'react-router/es/Router.js' {\n  declare module.exports: $Exports<'react-router/es/Router'>;\n}\ndeclare module 'react-router/es/StaticRouter.js' {\n  declare module.exports: $Exports<'react-router/es/StaticRouter'>;\n}\ndeclare module 'react-router/es/Switch.js' {\n  declare module.exports: $Exports<'react-router/es/Switch'>;\n}\ndeclare module 'react-router/es/withRouter.js' {\n  declare module.exports: $Exports<'react-router/es/withRouter'>;\n}\ndeclare module 'react-router/index' {\n  declare module.exports: $Exports<'react-router'>;\n}\ndeclare module 'react-router/index.js' {\n  declare module.exports: $Exports<'react-router'>;\n}\ndeclare module 'react-router/matchPath.js' {\n  declare module.exports: $Exports<'react-router/matchPath'>;\n}\ndeclare module 'react-router/MemoryRouter.js' {\n  declare module.exports: $Exports<'react-router/MemoryRouter'>;\n}\ndeclare module 'react-router/Prompt.js' {\n  declare module.exports: $Exports<'react-router/Prompt'>;\n}\ndeclare module 'react-router/Redirect.js' {\n  declare module.exports: $Exports<'react-router/Redirect'>;\n}\ndeclare module 'react-router/Route.js' {\n  declare module.exports: $Exports<'react-router/Route'>;\n}\ndeclare module 'react-router/Router.js' {\n  declare module.exports: $Exports<'react-router/Router'>;\n}\ndeclare module 'react-router/StaticRouter.js' {\n  declare module.exports: $Exports<'react-router/StaticRouter'>;\n}\ndeclare module 'react-router/Switch.js' {\n  declare module.exports: $Exports<'react-router/Switch'>;\n}\ndeclare module 'react-router/umd/react-router.js' {\n  declare module.exports: $Exports<'react-router/umd/react-router'>;\n}\ndeclare module 'react-router/umd/react-router.min.js' {\n  declare module.exports: $Exports<'react-router/umd/react-router.min'>;\n}\ndeclare module 'react-router/withRouter.js' {\n  declare module.exports: $Exports<'react-router/withRouter'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-scripts_vx.x.x.js",
    "content": "// flow-typed signature: 7ba383cef791c6b51db6d4193e087a9e\n// flow-typed version: <<STUB>>/react-scripts_v^1.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-scripts'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-scripts' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-scripts/bin/react-scripts' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/env' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/jest/babelTransform' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/jest/cssTransform' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/jest/fileTransform' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/paths' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/polyfills' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/webpack.config.dev' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/webpack.config.prod' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/config/webpackDevServer.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/build' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/eject' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/init' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/start' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/scripts/utils/createJestConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/template/src/App' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/template/src/App.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/template/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-scripts/template/src/registerServiceWorker' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-scripts/bin/react-scripts.js' {\n  declare module.exports: $Exports<'react-scripts/bin/react-scripts'>;\n}\ndeclare module 'react-scripts/config/env.js' {\n  declare module.exports: $Exports<'react-scripts/config/env'>;\n}\ndeclare module 'react-scripts/config/jest/babelTransform.js' {\n  declare module.exports: $Exports<'react-scripts/config/jest/babelTransform'>;\n}\ndeclare module 'react-scripts/config/jest/cssTransform.js' {\n  declare module.exports: $Exports<'react-scripts/config/jest/cssTransform'>;\n}\ndeclare module 'react-scripts/config/jest/fileTransform.js' {\n  declare module.exports: $Exports<'react-scripts/config/jest/fileTransform'>;\n}\ndeclare module 'react-scripts/config/paths.js' {\n  declare module.exports: $Exports<'react-scripts/config/paths'>;\n}\ndeclare module 'react-scripts/config/polyfills.js' {\n  declare module.exports: $Exports<'react-scripts/config/polyfills'>;\n}\ndeclare module 'react-scripts/config/webpack.config.dev.js' {\n  declare module.exports: $Exports<'react-scripts/config/webpack.config.dev'>;\n}\ndeclare module 'react-scripts/config/webpack.config.prod.js' {\n  declare module.exports: $Exports<'react-scripts/config/webpack.config.prod'>;\n}\ndeclare module 'react-scripts/config/webpackDevServer.config.js' {\n  declare module.exports: $Exports<'react-scripts/config/webpackDevServer.config'>;\n}\ndeclare module 'react-scripts/scripts/build.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/build'>;\n}\ndeclare module 'react-scripts/scripts/eject.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/eject'>;\n}\ndeclare module 'react-scripts/scripts/init.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/init'>;\n}\ndeclare module 'react-scripts/scripts/start.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/start'>;\n}\ndeclare module 'react-scripts/scripts/test.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/test'>;\n}\ndeclare module 'react-scripts/scripts/utils/createJestConfig.js' {\n  declare module.exports: $Exports<'react-scripts/scripts/utils/createJestConfig'>;\n}\ndeclare module 'react-scripts/template/src/App.js' {\n  declare module.exports: $Exports<'react-scripts/template/src/App'>;\n}\ndeclare module 'react-scripts/template/src/App.test.js' {\n  declare module.exports: $Exports<'react-scripts/template/src/App.test'>;\n}\ndeclare module 'react-scripts/template/src/index.js' {\n  declare module.exports: $Exports<'react-scripts/template/src/index'>;\n}\ndeclare module 'react-scripts/template/src/registerServiceWorker.js' {\n  declare module.exports: $Exports<'react-scripts/template/src/registerServiceWorker'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-stripe-checkout_vx.x.x.js",
    "content": "// flow-typed signature: ceddd7e823ee93c7c57568d8fea31f78\n// flow-typed version: <<STUB>>/react-stripe-checkout_v^2.2.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-stripe-checkout'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-stripe-checkout' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-stripe-checkout/dist/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-checkout/spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-checkout/StripeCheckout' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-stripe-checkout/dist/main.js' {\n  declare module.exports: $Exports<'react-stripe-checkout/dist/main'>;\n}\ndeclare module 'react-stripe-checkout/spec.js' {\n  declare module.exports: $Exports<'react-stripe-checkout/spec'>;\n}\ndeclare module 'react-stripe-checkout/StripeCheckout.js' {\n  declare module.exports: $Exports<'react-stripe-checkout/StripeCheckout'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-stripe-elements_vx.x.x.js",
    "content": "// flow-typed signature: 169f41bc5af42845e6303aad8d21be43\n// flow-typed version: <<STUB>>/react-stripe-elements_v1.4.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-stripe-elements'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-stripe-elements' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-stripe-elements/dist/react-stripe-elements' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/dist/react-stripe-elements.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Element' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Element.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Elements' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Elements.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/inject' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/inject.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/PaymentRequestButtonElement' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/PaymentRequestButtonElement.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/components/Provider.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/decls/Stripe' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/utils/shallowEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/es/utils/shallowEqual.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Element' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Element.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Elements' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Elements.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/inject' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/inject.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/PaymentRequestButtonElement' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/PaymentRequestButtonElement.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/components/Provider.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/decls/Stripe' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/utils/shallowEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/lib/utils/shallowEqual.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Element' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Element.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Elements' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Elements.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/inject' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/inject.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/PaymentRequestButtonElement' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/PaymentRequestButtonElement.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Provider' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/components/Provider.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/decls/Stripe' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/utils/shallowEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-stripe-elements/src/utils/shallowEqual.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-stripe-elements/dist/react-stripe-elements.js' {\n  declare module.exports: $Exports<'react-stripe-elements/dist/react-stripe-elements'>;\n}\ndeclare module 'react-stripe-elements/dist/react-stripe-elements.min.js' {\n  declare module.exports: $Exports<'react-stripe-elements/dist/react-stripe-elements.min'>;\n}\ndeclare module 'react-stripe-elements/es/components/Element.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Element'>;\n}\ndeclare module 'react-stripe-elements/es/components/Element.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Element.test'>;\n}\ndeclare module 'react-stripe-elements/es/components/Elements.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Elements'>;\n}\ndeclare module 'react-stripe-elements/es/components/Elements.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Elements.test'>;\n}\ndeclare module 'react-stripe-elements/es/components/inject.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/inject'>;\n}\ndeclare module 'react-stripe-elements/es/components/inject.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/inject.test'>;\n}\ndeclare module 'react-stripe-elements/es/components/PaymentRequestButtonElement.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/PaymentRequestButtonElement'>;\n}\ndeclare module 'react-stripe-elements/es/components/PaymentRequestButtonElement.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/PaymentRequestButtonElement.test'>;\n}\ndeclare module 'react-stripe-elements/es/components/Provider.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Provider'>;\n}\ndeclare module 'react-stripe-elements/es/components/Provider.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/components/Provider.test'>;\n}\ndeclare module 'react-stripe-elements/es/decls/Stripe.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/decls/Stripe'>;\n}\ndeclare module 'react-stripe-elements/es/index.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/index'>;\n}\ndeclare module 'react-stripe-elements/es/index.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/index.test'>;\n}\ndeclare module 'react-stripe-elements/es/utils/shallowEqual.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/utils/shallowEqual'>;\n}\ndeclare module 'react-stripe-elements/es/utils/shallowEqual.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/es/utils/shallowEqual.test'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Element.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Element'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Element.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Element.test'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Elements.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Elements'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Elements.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Elements.test'>;\n}\ndeclare module 'react-stripe-elements/lib/components/inject.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/inject'>;\n}\ndeclare module 'react-stripe-elements/lib/components/inject.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/inject.test'>;\n}\ndeclare module 'react-stripe-elements/lib/components/PaymentRequestButtonElement.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/PaymentRequestButtonElement'>;\n}\ndeclare module 'react-stripe-elements/lib/components/PaymentRequestButtonElement.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/PaymentRequestButtonElement.test'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Provider.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Provider'>;\n}\ndeclare module 'react-stripe-elements/lib/components/Provider.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/components/Provider.test'>;\n}\ndeclare module 'react-stripe-elements/lib/decls/Stripe.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/decls/Stripe'>;\n}\ndeclare module 'react-stripe-elements/lib/index.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/index'>;\n}\ndeclare module 'react-stripe-elements/lib/index.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/index.test'>;\n}\ndeclare module 'react-stripe-elements/lib/utils/shallowEqual.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/utils/shallowEqual'>;\n}\ndeclare module 'react-stripe-elements/lib/utils/shallowEqual.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/lib/utils/shallowEqual.test'>;\n}\ndeclare module 'react-stripe-elements/src/components/Element.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Element'>;\n}\ndeclare module 'react-stripe-elements/src/components/Element.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Element.test'>;\n}\ndeclare module 'react-stripe-elements/src/components/Elements.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Elements'>;\n}\ndeclare module 'react-stripe-elements/src/components/Elements.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Elements.test'>;\n}\ndeclare module 'react-stripe-elements/src/components/inject.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/inject'>;\n}\ndeclare module 'react-stripe-elements/src/components/inject.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/inject.test'>;\n}\ndeclare module 'react-stripe-elements/src/components/PaymentRequestButtonElement.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/PaymentRequestButtonElement'>;\n}\ndeclare module 'react-stripe-elements/src/components/PaymentRequestButtonElement.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/PaymentRequestButtonElement.test'>;\n}\ndeclare module 'react-stripe-elements/src/components/Provider.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Provider'>;\n}\ndeclare module 'react-stripe-elements/src/components/Provider.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/components/Provider.test'>;\n}\ndeclare module 'react-stripe-elements/src/decls/Stripe.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/decls/Stripe'>;\n}\ndeclare module 'react-stripe-elements/src/index.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/index'>;\n}\ndeclare module 'react-stripe-elements/src/index.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/index.test'>;\n}\ndeclare module 'react-stripe-elements/src/utils/shallowEqual.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/utils/shallowEqual'>;\n}\ndeclare module 'react-stripe-elements/src/utils/shallowEqual.test.js' {\n  declare module.exports: $Exports<'react-stripe-elements/src/utils/shallowEqual.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-textarea-autosize_vx.x.x.js",
    "content": "// flow-typed signature: cb305834ab55a493438180fa9c27fad0\n// flow-typed version: <<STUB>>/react-textarea-autosize_v^4.0.5/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-textarea-autosize'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-textarea-autosize' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-textarea-autosize/dist/react-textarea-autosize' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-textarea-autosize/dist/react-textarea-autosize.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-textarea-autosize/es/calculateNodeHeight' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-textarea-autosize/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-textarea-autosize/lib/calculateNodeHeight' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-textarea-autosize/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-textarea-autosize/dist/react-textarea-autosize.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/dist/react-textarea-autosize'>;\n}\ndeclare module 'react-textarea-autosize/dist/react-textarea-autosize.min.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/dist/react-textarea-autosize.min'>;\n}\ndeclare module 'react-textarea-autosize/es/calculateNodeHeight.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/es/calculateNodeHeight'>;\n}\ndeclare module 'react-textarea-autosize/es/index.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/es/index'>;\n}\ndeclare module 'react-textarea-autosize/lib/calculateNodeHeight.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/lib/calculateNodeHeight'>;\n}\ndeclare module 'react-textarea-autosize/lib/index.js' {\n  declare module.exports: $Exports<'react-textarea-autosize/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-transition-group_vx.x.x.js",
    "content": "// flow-typed signature: 91b3b7126c21d726d16331e4ba7da1c1\n// flow-typed version: <<STUB>>/react-transition-group_v^2.2.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-transition-group'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-transition-group' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-transition-group/CSSTransition' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/dist/react-transition-group' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/dist/react-transition-group.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/Transition' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/TransitionGroup' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/utils/ChildMapping' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/utils/PropTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-transition-group/utils/SimpleSet' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-transition-group/CSSTransition.js' {\n  declare module.exports: $Exports<'react-transition-group/CSSTransition'>;\n}\ndeclare module 'react-transition-group/dist/react-transition-group.js' {\n  declare module.exports: $Exports<'react-transition-group/dist/react-transition-group'>;\n}\ndeclare module 'react-transition-group/dist/react-transition-group.min.js' {\n  declare module.exports: $Exports<'react-transition-group/dist/react-transition-group.min'>;\n}\ndeclare module 'react-transition-group/index' {\n  declare module.exports: $Exports<'react-transition-group'>;\n}\ndeclare module 'react-transition-group/index.js' {\n  declare module.exports: $Exports<'react-transition-group'>;\n}\ndeclare module 'react-transition-group/Transition.js' {\n  declare module.exports: $Exports<'react-transition-group/Transition'>;\n}\ndeclare module 'react-transition-group/TransitionGroup.js' {\n  declare module.exports: $Exports<'react-transition-group/TransitionGroup'>;\n}\ndeclare module 'react-transition-group/utils/ChildMapping.js' {\n  declare module.exports: $Exports<'react-transition-group/utils/ChildMapping'>;\n}\ndeclare module 'react-transition-group/utils/PropTypes.js' {\n  declare module.exports: $Exports<'react-transition-group/utils/PropTypes'>;\n}\ndeclare module 'react-transition-group/utils/SimpleSet.js' {\n  declare module.exports: $Exports<'react-transition-group/utils/SimpleSet'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-trend_vx.x.x.js",
    "content": "// flow-typed signature: 903e41ed7728c9effa03a38e16f0b7f5\n// flow-typed version: <<STUB>>/react-trend_v^1.2.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-trend'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-trend' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-trend/es/components/Trend/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/components/Trend/Trend.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/components/Trend/Trend' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/helpers/DOM.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/helpers/math.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/helpers/misc.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/es/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/components/Trend/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/components/Trend/Trend.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/components/Trend/Trend' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/helpers/DOM.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/helpers/math.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/helpers/misc.helpers' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/lib/utils/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/umd/react-trend' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-trend/umd/react-trend.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-trend/es/components/Trend/index.js' {\n  declare module.exports: $Exports<'react-trend/es/components/Trend/index'>;\n}\ndeclare module 'react-trend/es/components/Trend/Trend.helpers.js' {\n  declare module.exports: $Exports<'react-trend/es/components/Trend/Trend.helpers'>;\n}\ndeclare module 'react-trend/es/components/Trend/Trend.js' {\n  declare module.exports: $Exports<'react-trend/es/components/Trend/Trend'>;\n}\ndeclare module 'react-trend/es/helpers/DOM.helpers.js' {\n  declare module.exports: $Exports<'react-trend/es/helpers/DOM.helpers'>;\n}\ndeclare module 'react-trend/es/helpers/math.helpers.js' {\n  declare module.exports: $Exports<'react-trend/es/helpers/math.helpers'>;\n}\ndeclare module 'react-trend/es/helpers/misc.helpers.js' {\n  declare module.exports: $Exports<'react-trend/es/helpers/misc.helpers'>;\n}\ndeclare module 'react-trend/es/index.js' {\n  declare module.exports: $Exports<'react-trend/es/index'>;\n}\ndeclare module 'react-trend/es/utils/index.js' {\n  declare module.exports: $Exports<'react-trend/es/utils/index'>;\n}\ndeclare module 'react-trend/lib/components/Trend/index.js' {\n  declare module.exports: $Exports<'react-trend/lib/components/Trend/index'>;\n}\ndeclare module 'react-trend/lib/components/Trend/Trend.helpers.js' {\n  declare module.exports: $Exports<'react-trend/lib/components/Trend/Trend.helpers'>;\n}\ndeclare module 'react-trend/lib/components/Trend/Trend.js' {\n  declare module.exports: $Exports<'react-trend/lib/components/Trend/Trend'>;\n}\ndeclare module 'react-trend/lib/helpers/DOM.helpers.js' {\n  declare module.exports: $Exports<'react-trend/lib/helpers/DOM.helpers'>;\n}\ndeclare module 'react-trend/lib/helpers/math.helpers.js' {\n  declare module.exports: $Exports<'react-trend/lib/helpers/math.helpers'>;\n}\ndeclare module 'react-trend/lib/helpers/misc.helpers.js' {\n  declare module.exports: $Exports<'react-trend/lib/helpers/misc.helpers'>;\n}\ndeclare module 'react-trend/lib/index.js' {\n  declare module.exports: $Exports<'react-trend/lib/index'>;\n}\ndeclare module 'react-trend/lib/utils/index.js' {\n  declare module.exports: $Exports<'react-trend/lib/utils/index'>;\n}\ndeclare module 'react-trend/umd/react-trend.js' {\n  declare module.exports: $Exports<'react-trend/umd/react-trend'>;\n}\ndeclare module 'react-trend/umd/react-trend.min.js' {\n  declare module.exports: $Exports<'react-trend/umd/react-trend.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react-visibility-sensor_vx.x.x.js",
    "content": "// flow-typed signature: dfcf03dc1a3f237551ec04c69d552049\n// flow-typed version: <<STUB>>/react-visibility-sensor_v5.0.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'react-visibility-sensor'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'react-visibility-sensor' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'react-visibility-sensor/dist/visibility-sensor' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/dist/visibility-sensor.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/example-umd/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/example/dist/bundle' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/example/main' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/gulpfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/karma.conf' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/lib/is-visible-with-offset' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/testconf' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/tests/bundle' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/tests/visibility-sensor-spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/visibility-sensor' {\n  declare module.exports: any;\n}\n\ndeclare module 'react-visibility-sensor/webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'react-visibility-sensor/dist/visibility-sensor.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/dist/visibility-sensor'>;\n}\ndeclare module 'react-visibility-sensor/dist/visibility-sensor.min.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/dist/visibility-sensor.min'>;\n}\ndeclare module 'react-visibility-sensor/example-umd/main.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/example-umd/main'>;\n}\ndeclare module 'react-visibility-sensor/example/dist/bundle.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/example/dist/bundle'>;\n}\ndeclare module 'react-visibility-sensor/example/main.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/example/main'>;\n}\ndeclare module 'react-visibility-sensor/gulpfile.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/gulpfile'>;\n}\ndeclare module 'react-visibility-sensor/karma.conf.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/karma.conf'>;\n}\ndeclare module 'react-visibility-sensor/lib/is-visible-with-offset.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/lib/is-visible-with-offset'>;\n}\ndeclare module 'react-visibility-sensor/testconf.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/testconf'>;\n}\ndeclare module 'react-visibility-sensor/tests/bundle.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/tests/bundle'>;\n}\ndeclare module 'react-visibility-sensor/tests/visibility-sensor-spec.jsx' {\n  declare module.exports: $Exports<'react-visibility-sensor/tests/visibility-sensor-spec'>;\n}\ndeclare module 'react-visibility-sensor/visibility-sensor.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/visibility-sensor'>;\n}\ndeclare module 'react-visibility-sensor/webpack.config.js' {\n  declare module.exports: $Exports<'react-visibility-sensor/webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/react_v16.8.0.js",
    "content": "// flow-typed signature: 9d52bd849b0802b1d5cbd55e71c61057\n// flow-typed version: <<STUB>>/react_v16.8.0/flow_v0.66.0\n\n/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of the facebook/flow source tree.\n */\n\n// Copied from https://github.com/facebook/flow/edit/master/lib/react.js\n\n/**\n * A UI node that can be rendered by React. React can render most primitives in\n * addition to elements and arrays of nodes.\n */\n\ndeclare type React$Node =\n  | null\n  | boolean\n  | number\n  | string\n  | React$Element<any>\n  | React$Portal\n  | Iterable<?React$Node>;\n\n/**\n * Base class of ES6 React classes, modeled as a polymorphic class whose main\n * type parameters are Props and State.\n */\ndeclare class React$Component<Props, State = void> {\n  // fields\n\n  props: Props;\n  state: State;\n\n  // action methods\n\n  setState(\n    partialState: ?$Shape<State> | ((State, Props) => ?$Shape<State>),\n    callback?: () => mixed,\n  ): void;\n\n  forceUpdate(callback?: () => void): void;\n\n  // lifecycle methods\n\n  constructor(props?: Props, context?: any): void;\n  render(): React$Node;\n  componentWillMount(): mixed;\n  UNSAFE_componentWillMount(): mixed;\n  componentDidMount(): mixed;\n  componentWillReceiveProps(\n    nextProps: Props,\n    nextContext: any,\n  ): mixed;\n  UNSAFE_componentWillReceiveProps(\n    nextProps: Props,\n    nextContext: any,\n  ): mixed;\n  shouldComponentUpdate(\n    nextProps: Props,\n    nextState: State,\n    nextContext: any,\n  ): boolean;\n  componentWillUpdate(\n    nextProps: Props,\n    nextState: State,\n    nextContext: any,\n  ): mixed;\n  UNSAFE_componentWillUpdate(\n    nextProps: Props,\n    nextState: State,\n    nextContext: any,\n  ): mixed;\n  componentDidUpdate(\n    prevProps: Props,\n    prevState: State,\n    prevContext: any,\n  ): mixed;\n  componentWillUnmount(): mixed;\n  componentDidCatch(\n    error: Error,\n    info: {\n      componentStack: string,\n    }\n  ): mixed;\n\n  // long tail of other stuff not modeled very well\n\n  refs: any;\n  context: any;\n  getChildContext(): any;\n  static displayName?: ?string;\n  static childContextTypes: any;\n  static contextTypes: any;\n  static propTypes: any;\n\n  // We don't add a type for `defaultProps` so that its type may be entirely\n  // inferred when we diff the type for `defaultProps` with `Props`. Otherwise\n  // the user would need to define a type (which would be redundant) to override\n  // the type we provide here in the base class.\n  //\n  // static defaultProps: $Shape<Props>;\n}\n\ndeclare class React$PureComponent<Props, State = void>\n  extends React$Component<Props, State> {\n  // TODO: Due to bugs in Flow's handling of React.createClass, some fields\n  // already declared in the base class need to be redeclared below. Ideally\n  // they should simply be inherited.\n\n  props: Props;\n  state: State;\n}\n\n/**\n * Base class of legacy React classes, which extends the base class of ES6 React\n * classes and supports additional methods.\n */\ndeclare class LegacyReactComponent<Props, State>\n  extends React$Component<Props, State> {\n  // additional methods\n\n  replaceState(state: State, callback?: () => void): void;\n\n  isMounted(): bool;\n\n  // TODO: Due to bugs in Flow's handling of React.createClass, some fields\n  // already declared in the base class need to be redeclared below. Ideally\n  // they should simply be inherited.\n\n  props: Props;\n  state: State;\n}\n\ndeclare type React$AbstractComponentStatics = {\n  displayName?: ?string,\n  // This is only on function components, but trying to access name when\n  // displayName is undefined is a common pattern.\n  name?: ?string,\n};\n\n/**\n * The type of a stateless functional component. In most cases these components\n * are a single function. However, they may have some static properties that we\n * can type check.\n */\ndeclare type React$StatelessFunctionalComponent<Props> = {\n  (props: Props, context: any): React$Node,\n  displayName?: ?string,\n  propTypes?: any,\n  contextTypes?: any\n};\n\n/**\n * The type of a component in React. A React component may be a:\n *\n * - Stateless functional components. Functions that take in props as an\n *   argument and return a React node.\n * - ES6 class component. Components with state defined either using the ES6\n *   class syntax, or with the legacy `React.createClass()` helper.\n */\n// $FlowIssue\ndeclare type React$ComponentType<-Config> = React$AbstractComponent<Config, any>;\n\n/**\n * The type of an element in React. A React element may be a:\n *\n * - String. These elements are intrinsics that depend on the React renderer\n *   implementation.\n * - React component. See `ComponentType` for more information about its\n *   different variants.\n */\ndeclare type React$ElementType =\n  | string\n  | React$AbstractComponent<any, any>;\n\n/**\n * Type of a React element. React elements are commonly created using JSX\n * literals, which desugar to React.createElement calls (see below).\n */\ndeclare type React$Element<+ElementType: React$ElementType> = {|\n  +type: ElementType,\n  +props: React$ElementProps<ElementType>,\n  +key: React$Key | null,\n  +ref: any,\n|};\n\n/**\n * The type of the key that React uses to determine where items in a new list\n * have moved.\n */\ndeclare type React$Key = string | number;\n\n/**\n * The type of the ref prop available on all React components.\n */\ndeclare type React$Ref<ElementType: React$ElementType> =\n  | {-current: React$ElementRef<ElementType> | null}\n  | ((React$ElementRef<ElementType> | null) => mixed)\n  | string;\n\n/**\n * The type of a React Context.  React Contexts are created by calling\n * createContext() with a default value.\n */\ndeclare type React$Context<T> = {\n  Provider: React$ComponentType<{ value: T, children?: ?React$Node }>,\n  Consumer: React$ComponentType<{ children: (value: T) => ?React$Node }>,\n\n  // Optional, user-specified value for custom display label in React DevTools.\n  displayName?: string,\n}\n\n/**\n * A React portal node. The implementation of the portal node is hidden to React\n * users so we use an opaque type.\n */\ndeclare opaque type React$Portal;\n\ndeclare module react {\n  declare export var DOM: any;\n  declare export var PropTypes: ReactPropTypes;\n  declare export var version: string;\n\n  declare export function checkPropTypes<V>(\n    propTypes : any,\n    values: V,\n    location: string,\n    componentName: string,\n    getStack: ?(() => ?string)\n  ) : void;\n\n  declare export var createClass: React$CreateClass;\n  declare export function createContext<T>(\n    defaultValue: T,\n    calculateChangedBits: ?(a: T, b: T) => number,\n  ): React$Context<T>;\n  declare export var createElement: React$CreateElement;\n  declare export var cloneElement: React$CloneElement;\n  declare export function createFactory<ElementType: React$ElementType>(\n    type: ElementType,\n  ): React$ElementFactory<ElementType>;\n  declare export function createRef<T>(\n  ): {|current: null | T|};\n\n  declare export function isValidElement(element: any): boolean;\n\n  declare export var Component: typeof React$Component;\n  declare export var PureComponent: typeof React$PureComponent;\n  declare export type StatelessFunctionalComponent<P> =\n    React$StatelessFunctionalComponent<P>;\n  declare export type ComponentType<-P> = React$ComponentType<P>;\n  declare export type AbstractComponent<\n    -Config,\n    +Instance = mixed,\n  > = React$AbstractComponent<Config, Instance>;\n  declare export type ElementType = React$ElementType;\n  declare export type Element<+C> = React$Element<C>;\n  declare export var Fragment: ({children: ?React$Node}) => React$Node;\n  declare export type Key = React$Key;\n  declare export type Ref<C> = React$Ref<C>;\n  declare export type Node = React$Node;\n  declare export type Context<T> = React$Context<T>;\n  declare export type Portal = React$Portal;\n  declare export var ConcurrentMode: ({children: ?React$Node}) => React$Node; // 16.7+\n  declare export var StrictMode: ({children: ?React$Node}) => React$Node;\n\n  declare export var Suspense: React$ComponentType<{\n    children?: ?React$Node,\n    fallback?: React$Node,\n    maxDuration?: number\n  }>; // 16.6+\n\n  declare export type ElementProps<C> = React$ElementProps<C>;\n  declare export type ElementConfig<C> = React$ElementConfig<C>;\n  declare export type ElementRef<C> = React$ElementRef<C>;\n  // $FlowIssue\n  declare export type Config<Props, DefaultProps> = React$Config<Props, DefaultProps>;\n\n  declare export type ChildrenArray<+T> = $ReadOnlyArray<ChildrenArray<T>> | T;\n  declare export var Children: {\n    map<T, U>(\n      children: ChildrenArray<T>,\n      fn: (child: $NonMaybeType<T>, index: number) => U,\n      thisArg?: mixed,\n    ): Array<$NonMaybeType<U>>;\n    forEach<T>(\n      children: ChildrenArray<T>,\n      fn: (child: T, index: number) => mixed,\n      thisArg?: mixed,\n    ): void;\n    count(children: ChildrenArray<any>): number;\n    only<T>(children: ChildrenArray<T>): $NonMaybeType<T>;\n    toArray<T>(children: ChildrenArray<T>): Array<$NonMaybeType<T>>;\n  };\n\n  declare export function forwardRef<Config, Instance>(\n    render: (\n      props: Config,\n      ref: {current: null | Instance} | ((null | Instance) => mixed),\n    ) => React$Node,\n  ): React$AbstractComponent<Config, Instance>;\n\n  declare export function memo<P>(\n    component: React$ComponentType<P>,\n    equal?: (P, P) => boolean,\n  ): React$ComponentType<P>;\n\n  declare export function lazy<P>(\n    component: () => Promise<{ default: React$ComponentType<P> }>,\n  ): React$ComponentType<P>;\n\n  declare type MaybeCleanUpFn = void | (() => void);\n\n  declare export function useContext<T>(\n    context: React$Context<T>,\n    observedBits: void | number | boolean,\n  ): T;\n\n  declare export function useState<S>(\n    initialState: (() => S) | S,\n  ): [S, ((S => S) | S) => void];\n\n  declare type Dispatch<A> = (A) => void;\n\n  declare export function useReducer<S, A>(\n    reducer: (S, A) => S,\n    initialState: S,\n  ): [S, Dispatch<A>];\n\n  declare export function useReducer<S, A>(\n    reducer: (S, A) => S,\n    initialState: S,\n    init: void,\n  ): [S, Dispatch<A>];\n\n  declare export function useReducer<S, A, I>(\n    reducer: (S, A) => S,\n    initialArg: I,\n    init: (I) => S,\n  ): [S, Dispatch<A>];\n\n  declare export function useRef<T>(initialValue: T): {|current: T|};\n\n  declare export function useDebugValue(value: any): void;\n\n  declare export function useEffect(\n    create: () => MaybeCleanUpFn,\n    inputs: ?$ReadOnlyArray<mixed>,\n  ): void;\n\n  declare export function useLayoutEffect(\n    create: () => MaybeCleanUpFn,\n    inputs: ?$ReadOnlyArray<mixed>,\n  ): void;\n\n  declare export function useCallback<T: (...args: $ReadOnlyArray<empty>) => mixed>(\n    callback: T,\n    inputs: ?$ReadOnlyArray<mixed>,\n  ): T;\n\n  declare export function useMemo<T>(\n    create: () => T,\n    inputs: ?$ReadOnlyArray<mixed>,\n  ): T;\n\n  declare export function useImperativeHandle<T>(\n    ref: {current: T | null} | ((inst: T | null) => mixed) | null | void,\n    create: () => T,\n    inputs: ?$ReadOnlyArray<mixed>,\n  ): void;\n\n  declare export default {|\n    +DOM: typeof DOM,\n    +PropTypes: typeof PropTypes,\n    +version: typeof version,\n    +checkPropTypes: typeof checkPropTypes,\n    +memo: typeof memo,\n    +lazy: typeof lazy,\n    +createClass: typeof createClass,\n    +createContext: typeof createContext,\n    +createElement: typeof createElement,\n    +cloneElement: typeof cloneElement,\n    +createFactory: typeof createFactory,\n    +createRef: typeof createRef,\n    +forwardRef: typeof forwardRef,\n    +isValidElement: typeof isValidElement,\n    +Component: typeof Component,\n    +PureComponent: typeof PureComponent,\n    +Fragment: typeof Fragment,\n    +Children: typeof Children,\n    +ConcurrentMode: typeof ConcurrentMode,\n    +StrictMode: typeof StrictMode,\n    +Suspense: typeof Suspense,\n    +useContext: typeof useContext,\n    +useState: typeof useState,\n    +useReducer: typeof useReducer,\n    +useRef: typeof useRef,\n    +useEffect: typeof useEffect,\n    +useLayoutEffect: typeof useLayoutEffect,\n    +useCallback: typeof useCallback,\n    +useMemo: typeof useMemo,\n    +useImperativeHandle: typeof useImperativeHandle,\n  |};\n}\n\n// TODO Delete this once https://github.com/facebook/react/pull/3031 lands\n// and \"react\" becomes the standard name for this module\ndeclare module React {\n  declare module.exports: $Exports<'react'>;\n}\n\ntype ReactPropsCheckType = (\n  props: any,\n  propName: string,\n  componentName: string,\n  href?: string) => ?Error;\n\ntype ReactPropsChainableTypeChecker = {\n  isRequired: ReactPropsCheckType;\n  (props: any, propName: string, componentName: string, href?: string): ?Error;\n};\n\ntype React$PropTypes$arrayOf =\n  (typeChecker: ReactPropsCheckType) => ReactPropsChainableTypeChecker;\ntype React$PropTypes$instanceOf =\n  (expectedClass: any) => ReactPropsChainableTypeChecker;\ntype React$PropTypes$objectOf =\n  (typeChecker: ReactPropsCheckType) => ReactPropsChainableTypeChecker;\ntype React$PropTypes$oneOf =\n  (expectedValues: Array<any>) => ReactPropsChainableTypeChecker;\ntype React$PropTypes$oneOfType =\n  (arrayOfTypeCheckers: Array<ReactPropsCheckType>) =>\n    ReactPropsChainableTypeChecker;\ntype React$PropTypes$shape =\n  (shapeTypes: { [key: string]: ReactPropsCheckType }) =>\n    ReactPropsChainableTypeChecker;\n\ntype ReactPropTypes = {\n  array: React$PropType$Primitive<Array<any>>;\n  bool: React$PropType$Primitive<boolean>;\n  func: React$PropType$Primitive<Function>;\n  number: React$PropType$Primitive<number>;\n  object: React$PropType$Primitive<Object>;\n  string: React$PropType$Primitive<string>;\n  any: React$PropType$Primitive<any>;\n  arrayOf: React$PropType$ArrayOf;\n  element: React$PropType$Primitive<any>; /* TODO */\n  instanceOf: React$PropType$InstanceOf;\n  node: React$PropType$Primitive<any>; /* TODO */\n  objectOf: React$PropType$ObjectOf;\n  oneOf: React$PropType$OneOf;\n  oneOfType: React$PropType$OneOfType;\n  shape: React$PropType$Shape;\n}\n"
  },
  {
    "path": "flow-typed/npm/recharts_vx.x.x.js",
    "content": "// flow-typed signature: b20edcad541cddad6f2020dfc58742c4\n// flow-typed version: <<STUB>>/recharts_v^1.0.0-alpha.6/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'recharts'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'recharts' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'recharts/demo/component/AreaChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/BarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/BrushDemo' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/CartesianAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/CartesianGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/ComposedChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Curve' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/CustomLineDot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/DemoRadarItem' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/DemoSankeyLink' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/DemoSankeyNode' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/DemoTreemapItem' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Legend' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/LineChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Pie' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/PieChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/PolarAngleAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/PolarGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/PolarRadiusAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/RadarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/RadialBarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Rectangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/ResponsiveContainer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Sankey' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/ScatterChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Sector' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/TextDemo' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/Treemap' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/component/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/container/App' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/demo/webpack.config' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/Area' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/Bar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/Brush' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/CartesianAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/CartesianGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/ErrorBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/Line' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/ReferenceArea' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/ReferenceDot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/ReferenceLine' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/Scatter' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/XAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/YAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/cartesian/ZAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/AreaChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/BarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/ComposedChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/generateCategoricalChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/LineChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/PieChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/RadarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/RadialBarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/Sankey' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/ScatterChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/chart/Treemap' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/Cell' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/DefaultLegendContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/DefaultTooltipContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/Label' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/LabelList' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/Legend' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/ResponsiveContainer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/Text' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/component/Tooltip' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/container/Layer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/container/Surface' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/Pie' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/PolarAngleAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/PolarGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/PolarRadiusAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/Radar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polar/RadialBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/polyfill' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Cross' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Curve' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Dot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Polygon' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Rectangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Sector' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/shape/Symbols' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/AnimationDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/CartesianUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/ChartUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/CssPrefixUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/DataUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/DOMUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/Events' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/LogUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/PolarUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/PureRender' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/es6/util/ReactUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/Area' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/Bar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/Brush' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/CartesianAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/CartesianGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/ErrorBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/Line' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/ReferenceArea' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/ReferenceDot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/ReferenceLine' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/Scatter' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/XAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/YAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/cartesian/ZAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/AreaChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/BarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/ComposedChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/generateCategoricalChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/LineChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/PieChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/RadarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/RadialBarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/Sankey' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/ScatterChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/chart/Treemap' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/Cell' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/DefaultLegendContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/DefaultTooltipContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/Label' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/LabelList' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/Legend' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/ResponsiveContainer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/Text' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/component/Tooltip' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/container/Layer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/container/Surface' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/Pie' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/PolarAngleAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/PolarGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/PolarRadiusAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/Radar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polar/RadialBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/polyfill' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Cross' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Curve' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Dot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Polygon' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Rectangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Sector' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/shape/Symbols' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/AnimationDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/CartesianUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/ChartUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/CssPrefixUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/DataUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/DOMUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/Events' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/LogUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/PolarUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/PureRender' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/lib/util/ReactUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/Area' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/Bar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/Brush' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/CartesianAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/CartesianGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/ErrorBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/Line' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/ReferenceArea' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/ReferenceDot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/ReferenceLine' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/Scatter' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/XAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/YAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/cartesian/ZAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/AreaChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/BarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/ComposedChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/generateCategoricalChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/LineChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/PieChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/RadarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/RadialBarChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/Sankey' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/ScatterChart' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/chart/Treemap' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/Cell' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/DefaultLegendContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/DefaultTooltipContent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/Label' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/LabelList' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/Legend' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/ResponsiveContainer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/Text' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/component/Tooltip' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/container/Layer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/container/Surface' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/Pie' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/PolarAngleAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/PolarGrid' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/PolarRadiusAxis' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/Radar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polar/RadialBar' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/polyfill' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Cross' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Curve' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Dot' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Polygon' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Rectangle' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Sector' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/shape/Symbols' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/AnimationDecorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/CartesianUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/ChartUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/CssPrefixUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/DataUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/DOMUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/Events' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/LogUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/PolarUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/PureRender' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/src/util/ReactUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/umd/Recharts' {\n  declare module.exports: any;\n}\n\ndeclare module 'recharts/umd/Recharts.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'recharts/demo/component/AreaChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/AreaChart'>;\n}\ndeclare module 'recharts/demo/component/BarChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/BarChart'>;\n}\ndeclare module 'recharts/demo/component/BrushDemo.js' {\n  declare module.exports: $Exports<'recharts/demo/component/BrushDemo'>;\n}\ndeclare module 'recharts/demo/component/CartesianAxis.js' {\n  declare module.exports: $Exports<'recharts/demo/component/CartesianAxis'>;\n}\ndeclare module 'recharts/demo/component/CartesianGrid.js' {\n  declare module.exports: $Exports<'recharts/demo/component/CartesianGrid'>;\n}\ndeclare module 'recharts/demo/component/ComposedChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/ComposedChart'>;\n}\ndeclare module 'recharts/demo/component/Curve.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Curve'>;\n}\ndeclare module 'recharts/demo/component/CustomLineDot.js' {\n  declare module.exports: $Exports<'recharts/demo/component/CustomLineDot'>;\n}\ndeclare module 'recharts/demo/component/DemoRadarItem.js' {\n  declare module.exports: $Exports<'recharts/demo/component/DemoRadarItem'>;\n}\ndeclare module 'recharts/demo/component/DemoSankeyLink.js' {\n  declare module.exports: $Exports<'recharts/demo/component/DemoSankeyLink'>;\n}\ndeclare module 'recharts/demo/component/DemoSankeyNode.js' {\n  declare module.exports: $Exports<'recharts/demo/component/DemoSankeyNode'>;\n}\ndeclare module 'recharts/demo/component/DemoTreemapItem.js' {\n  declare module.exports: $Exports<'recharts/demo/component/DemoTreemapItem'>;\n}\ndeclare module 'recharts/demo/component/index.js' {\n  declare module.exports: $Exports<'recharts/demo/component/index'>;\n}\ndeclare module 'recharts/demo/component/Legend.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Legend'>;\n}\ndeclare module 'recharts/demo/component/LineChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/LineChart'>;\n}\ndeclare module 'recharts/demo/component/Pie.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Pie'>;\n}\ndeclare module 'recharts/demo/component/PieChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/PieChart'>;\n}\ndeclare module 'recharts/demo/component/PolarAngleAxis.js' {\n  declare module.exports: $Exports<'recharts/demo/component/PolarAngleAxis'>;\n}\ndeclare module 'recharts/demo/component/PolarGrid.js' {\n  declare module.exports: $Exports<'recharts/demo/component/PolarGrid'>;\n}\ndeclare module 'recharts/demo/component/PolarRadiusAxis.js' {\n  declare module.exports: $Exports<'recharts/demo/component/PolarRadiusAxis'>;\n}\ndeclare module 'recharts/demo/component/RadarChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/RadarChart'>;\n}\ndeclare module 'recharts/demo/component/RadialBarChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/RadialBarChart'>;\n}\ndeclare module 'recharts/demo/component/Rectangle.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Rectangle'>;\n}\ndeclare module 'recharts/demo/component/ResponsiveContainer.js' {\n  declare module.exports: $Exports<'recharts/demo/component/ResponsiveContainer'>;\n}\ndeclare module 'recharts/demo/component/Sankey.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Sankey'>;\n}\ndeclare module 'recharts/demo/component/ScatterChart.js' {\n  declare module.exports: $Exports<'recharts/demo/component/ScatterChart'>;\n}\ndeclare module 'recharts/demo/component/Sector.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Sector'>;\n}\ndeclare module 'recharts/demo/component/TextDemo.js' {\n  declare module.exports: $Exports<'recharts/demo/component/TextDemo'>;\n}\ndeclare module 'recharts/demo/component/Treemap.js' {\n  declare module.exports: $Exports<'recharts/demo/component/Treemap'>;\n}\ndeclare module 'recharts/demo/component/utils.js' {\n  declare module.exports: $Exports<'recharts/demo/component/utils'>;\n}\ndeclare module 'recharts/demo/container/App.js' {\n  declare module.exports: $Exports<'recharts/demo/container/App'>;\n}\ndeclare module 'recharts/demo/index.js' {\n  declare module.exports: $Exports<'recharts/demo/index'>;\n}\ndeclare module 'recharts/demo/webpack.config.js' {\n  declare module.exports: $Exports<'recharts/demo/webpack.config'>;\n}\ndeclare module 'recharts/es6/cartesian/Area.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/Area'>;\n}\ndeclare module 'recharts/es6/cartesian/Bar.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/Bar'>;\n}\ndeclare module 'recharts/es6/cartesian/Brush.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/Brush'>;\n}\ndeclare module 'recharts/es6/cartesian/CartesianAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/CartesianAxis'>;\n}\ndeclare module 'recharts/es6/cartesian/CartesianGrid.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/CartesianGrid'>;\n}\ndeclare module 'recharts/es6/cartesian/ErrorBar.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/ErrorBar'>;\n}\ndeclare module 'recharts/es6/cartesian/Line.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/Line'>;\n}\ndeclare module 'recharts/es6/cartesian/ReferenceArea.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/ReferenceArea'>;\n}\ndeclare module 'recharts/es6/cartesian/ReferenceDot.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/ReferenceDot'>;\n}\ndeclare module 'recharts/es6/cartesian/ReferenceLine.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/ReferenceLine'>;\n}\ndeclare module 'recharts/es6/cartesian/Scatter.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/Scatter'>;\n}\ndeclare module 'recharts/es6/cartesian/XAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/XAxis'>;\n}\ndeclare module 'recharts/es6/cartesian/YAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/YAxis'>;\n}\ndeclare module 'recharts/es6/cartesian/ZAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/cartesian/ZAxis'>;\n}\ndeclare module 'recharts/es6/chart/AreaChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/AreaChart'>;\n}\ndeclare module 'recharts/es6/chart/BarChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/BarChart'>;\n}\ndeclare module 'recharts/es6/chart/ComposedChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/ComposedChart'>;\n}\ndeclare module 'recharts/es6/chart/generateCategoricalChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/generateCategoricalChart'>;\n}\ndeclare module 'recharts/es6/chart/LineChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/LineChart'>;\n}\ndeclare module 'recharts/es6/chart/PieChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/PieChart'>;\n}\ndeclare module 'recharts/es6/chart/RadarChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/RadarChart'>;\n}\ndeclare module 'recharts/es6/chart/RadialBarChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/RadialBarChart'>;\n}\ndeclare module 'recharts/es6/chart/Sankey.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/Sankey'>;\n}\ndeclare module 'recharts/es6/chart/ScatterChart.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/ScatterChart'>;\n}\ndeclare module 'recharts/es6/chart/Treemap.js' {\n  declare module.exports: $Exports<'recharts/es6/chart/Treemap'>;\n}\ndeclare module 'recharts/es6/component/Cell.js' {\n  declare module.exports: $Exports<'recharts/es6/component/Cell'>;\n}\ndeclare module 'recharts/es6/component/DefaultLegendContent.js' {\n  declare module.exports: $Exports<'recharts/es6/component/DefaultLegendContent'>;\n}\ndeclare module 'recharts/es6/component/DefaultTooltipContent.js' {\n  declare module.exports: $Exports<'recharts/es6/component/DefaultTooltipContent'>;\n}\ndeclare module 'recharts/es6/component/Label.js' {\n  declare module.exports: $Exports<'recharts/es6/component/Label'>;\n}\ndeclare module 'recharts/es6/component/LabelList.js' {\n  declare module.exports: $Exports<'recharts/es6/component/LabelList'>;\n}\ndeclare module 'recharts/es6/component/Legend.js' {\n  declare module.exports: $Exports<'recharts/es6/component/Legend'>;\n}\ndeclare module 'recharts/es6/component/ResponsiveContainer.js' {\n  declare module.exports: $Exports<'recharts/es6/component/ResponsiveContainer'>;\n}\ndeclare module 'recharts/es6/component/Text.js' {\n  declare module.exports: $Exports<'recharts/es6/component/Text'>;\n}\ndeclare module 'recharts/es6/component/Tooltip.js' {\n  declare module.exports: $Exports<'recharts/es6/component/Tooltip'>;\n}\ndeclare module 'recharts/es6/container/Layer.js' {\n  declare module.exports: $Exports<'recharts/es6/container/Layer'>;\n}\ndeclare module 'recharts/es6/container/Surface.js' {\n  declare module.exports: $Exports<'recharts/es6/container/Surface'>;\n}\ndeclare module 'recharts/es6/index.js' {\n  declare module.exports: $Exports<'recharts/es6/index'>;\n}\ndeclare module 'recharts/es6/polar/Pie.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/Pie'>;\n}\ndeclare module 'recharts/es6/polar/PolarAngleAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/PolarAngleAxis'>;\n}\ndeclare module 'recharts/es6/polar/PolarGrid.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/PolarGrid'>;\n}\ndeclare module 'recharts/es6/polar/PolarRadiusAxis.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/PolarRadiusAxis'>;\n}\ndeclare module 'recharts/es6/polar/Radar.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/Radar'>;\n}\ndeclare module 'recharts/es6/polar/RadialBar.js' {\n  declare module.exports: $Exports<'recharts/es6/polar/RadialBar'>;\n}\ndeclare module 'recharts/es6/polyfill.js' {\n  declare module.exports: $Exports<'recharts/es6/polyfill'>;\n}\ndeclare module 'recharts/es6/shape/Cross.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Cross'>;\n}\ndeclare module 'recharts/es6/shape/Curve.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Curve'>;\n}\ndeclare module 'recharts/es6/shape/Dot.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Dot'>;\n}\ndeclare module 'recharts/es6/shape/Polygon.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Polygon'>;\n}\ndeclare module 'recharts/es6/shape/Rectangle.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Rectangle'>;\n}\ndeclare module 'recharts/es6/shape/Sector.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Sector'>;\n}\ndeclare module 'recharts/es6/shape/Symbols.js' {\n  declare module.exports: $Exports<'recharts/es6/shape/Symbols'>;\n}\ndeclare module 'recharts/es6/util/AnimationDecorator.js' {\n  declare module.exports: $Exports<'recharts/es6/util/AnimationDecorator'>;\n}\ndeclare module 'recharts/es6/util/CartesianUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/CartesianUtils'>;\n}\ndeclare module 'recharts/es6/util/ChartUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/ChartUtils'>;\n}\ndeclare module 'recharts/es6/util/CssPrefixUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/CssPrefixUtils'>;\n}\ndeclare module 'recharts/es6/util/DataUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/DataUtils'>;\n}\ndeclare module 'recharts/es6/util/DOMUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/DOMUtils'>;\n}\ndeclare module 'recharts/es6/util/Events.js' {\n  declare module.exports: $Exports<'recharts/es6/util/Events'>;\n}\ndeclare module 'recharts/es6/util/LogUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/LogUtils'>;\n}\ndeclare module 'recharts/es6/util/PolarUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/PolarUtils'>;\n}\ndeclare module 'recharts/es6/util/PureRender.js' {\n  declare module.exports: $Exports<'recharts/es6/util/PureRender'>;\n}\ndeclare module 'recharts/es6/util/ReactUtils.js' {\n  declare module.exports: $Exports<'recharts/es6/util/ReactUtils'>;\n}\ndeclare module 'recharts/lib/cartesian/Area.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/Area'>;\n}\ndeclare module 'recharts/lib/cartesian/Bar.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/Bar'>;\n}\ndeclare module 'recharts/lib/cartesian/Brush.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/Brush'>;\n}\ndeclare module 'recharts/lib/cartesian/CartesianAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/CartesianAxis'>;\n}\ndeclare module 'recharts/lib/cartesian/CartesianGrid.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/CartesianGrid'>;\n}\ndeclare module 'recharts/lib/cartesian/ErrorBar.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/ErrorBar'>;\n}\ndeclare module 'recharts/lib/cartesian/Line.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/Line'>;\n}\ndeclare module 'recharts/lib/cartesian/ReferenceArea.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/ReferenceArea'>;\n}\ndeclare module 'recharts/lib/cartesian/ReferenceDot.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/ReferenceDot'>;\n}\ndeclare module 'recharts/lib/cartesian/ReferenceLine.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/ReferenceLine'>;\n}\ndeclare module 'recharts/lib/cartesian/Scatter.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/Scatter'>;\n}\ndeclare module 'recharts/lib/cartesian/XAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/XAxis'>;\n}\ndeclare module 'recharts/lib/cartesian/YAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/YAxis'>;\n}\ndeclare module 'recharts/lib/cartesian/ZAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/cartesian/ZAxis'>;\n}\ndeclare module 'recharts/lib/chart/AreaChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/AreaChart'>;\n}\ndeclare module 'recharts/lib/chart/BarChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/BarChart'>;\n}\ndeclare module 'recharts/lib/chart/ComposedChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/ComposedChart'>;\n}\ndeclare module 'recharts/lib/chart/generateCategoricalChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/generateCategoricalChart'>;\n}\ndeclare module 'recharts/lib/chart/LineChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/LineChart'>;\n}\ndeclare module 'recharts/lib/chart/PieChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/PieChart'>;\n}\ndeclare module 'recharts/lib/chart/RadarChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/RadarChart'>;\n}\ndeclare module 'recharts/lib/chart/RadialBarChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/RadialBarChart'>;\n}\ndeclare module 'recharts/lib/chart/Sankey.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/Sankey'>;\n}\ndeclare module 'recharts/lib/chart/ScatterChart.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/ScatterChart'>;\n}\ndeclare module 'recharts/lib/chart/Treemap.js' {\n  declare module.exports: $Exports<'recharts/lib/chart/Treemap'>;\n}\ndeclare module 'recharts/lib/component/Cell.js' {\n  declare module.exports: $Exports<'recharts/lib/component/Cell'>;\n}\ndeclare module 'recharts/lib/component/DefaultLegendContent.js' {\n  declare module.exports: $Exports<'recharts/lib/component/DefaultLegendContent'>;\n}\ndeclare module 'recharts/lib/component/DefaultTooltipContent.js' {\n  declare module.exports: $Exports<'recharts/lib/component/DefaultTooltipContent'>;\n}\ndeclare module 'recharts/lib/component/Label.js' {\n  declare module.exports: $Exports<'recharts/lib/component/Label'>;\n}\ndeclare module 'recharts/lib/component/LabelList.js' {\n  declare module.exports: $Exports<'recharts/lib/component/LabelList'>;\n}\ndeclare module 'recharts/lib/component/Legend.js' {\n  declare module.exports: $Exports<'recharts/lib/component/Legend'>;\n}\ndeclare module 'recharts/lib/component/ResponsiveContainer.js' {\n  declare module.exports: $Exports<'recharts/lib/component/ResponsiveContainer'>;\n}\ndeclare module 'recharts/lib/component/Text.js' {\n  declare module.exports: $Exports<'recharts/lib/component/Text'>;\n}\ndeclare module 'recharts/lib/component/Tooltip.js' {\n  declare module.exports: $Exports<'recharts/lib/component/Tooltip'>;\n}\ndeclare module 'recharts/lib/container/Layer.js' {\n  declare module.exports: $Exports<'recharts/lib/container/Layer'>;\n}\ndeclare module 'recharts/lib/container/Surface.js' {\n  declare module.exports: $Exports<'recharts/lib/container/Surface'>;\n}\ndeclare module 'recharts/lib/index.js' {\n  declare module.exports: $Exports<'recharts/lib/index'>;\n}\ndeclare module 'recharts/lib/polar/Pie.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/Pie'>;\n}\ndeclare module 'recharts/lib/polar/PolarAngleAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/PolarAngleAxis'>;\n}\ndeclare module 'recharts/lib/polar/PolarGrid.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/PolarGrid'>;\n}\ndeclare module 'recharts/lib/polar/PolarRadiusAxis.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/PolarRadiusAxis'>;\n}\ndeclare module 'recharts/lib/polar/Radar.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/Radar'>;\n}\ndeclare module 'recharts/lib/polar/RadialBar.js' {\n  declare module.exports: $Exports<'recharts/lib/polar/RadialBar'>;\n}\ndeclare module 'recharts/lib/polyfill.js' {\n  declare module.exports: $Exports<'recharts/lib/polyfill'>;\n}\ndeclare module 'recharts/lib/shape/Cross.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Cross'>;\n}\ndeclare module 'recharts/lib/shape/Curve.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Curve'>;\n}\ndeclare module 'recharts/lib/shape/Dot.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Dot'>;\n}\ndeclare module 'recharts/lib/shape/Polygon.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Polygon'>;\n}\ndeclare module 'recharts/lib/shape/Rectangle.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Rectangle'>;\n}\ndeclare module 'recharts/lib/shape/Sector.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Sector'>;\n}\ndeclare module 'recharts/lib/shape/Symbols.js' {\n  declare module.exports: $Exports<'recharts/lib/shape/Symbols'>;\n}\ndeclare module 'recharts/lib/util/AnimationDecorator.js' {\n  declare module.exports: $Exports<'recharts/lib/util/AnimationDecorator'>;\n}\ndeclare module 'recharts/lib/util/CartesianUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/CartesianUtils'>;\n}\ndeclare module 'recharts/lib/util/ChartUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/ChartUtils'>;\n}\ndeclare module 'recharts/lib/util/CssPrefixUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/CssPrefixUtils'>;\n}\ndeclare module 'recharts/lib/util/DataUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/DataUtils'>;\n}\ndeclare module 'recharts/lib/util/DOMUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/DOMUtils'>;\n}\ndeclare module 'recharts/lib/util/Events.js' {\n  declare module.exports: $Exports<'recharts/lib/util/Events'>;\n}\ndeclare module 'recharts/lib/util/LogUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/LogUtils'>;\n}\ndeclare module 'recharts/lib/util/PolarUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/PolarUtils'>;\n}\ndeclare module 'recharts/lib/util/PureRender.js' {\n  declare module.exports: $Exports<'recharts/lib/util/PureRender'>;\n}\ndeclare module 'recharts/lib/util/ReactUtils.js' {\n  declare module.exports: $Exports<'recharts/lib/util/ReactUtils'>;\n}\ndeclare module 'recharts/src/cartesian/Area.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/Area'>;\n}\ndeclare module 'recharts/src/cartesian/Bar.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/Bar'>;\n}\ndeclare module 'recharts/src/cartesian/Brush.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/Brush'>;\n}\ndeclare module 'recharts/src/cartesian/CartesianAxis.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/CartesianAxis'>;\n}\ndeclare module 'recharts/src/cartesian/CartesianGrid.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/CartesianGrid'>;\n}\ndeclare module 'recharts/src/cartesian/ErrorBar.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/ErrorBar'>;\n}\ndeclare module 'recharts/src/cartesian/Line.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/Line'>;\n}\ndeclare module 'recharts/src/cartesian/ReferenceArea.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/ReferenceArea'>;\n}\ndeclare module 'recharts/src/cartesian/ReferenceDot.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/ReferenceDot'>;\n}\ndeclare module 'recharts/src/cartesian/ReferenceLine.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/ReferenceLine'>;\n}\ndeclare module 'recharts/src/cartesian/Scatter.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/Scatter'>;\n}\ndeclare module 'recharts/src/cartesian/XAxis.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/XAxis'>;\n}\ndeclare module 'recharts/src/cartesian/YAxis.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/YAxis'>;\n}\ndeclare module 'recharts/src/cartesian/ZAxis.js' {\n  declare module.exports: $Exports<'recharts/src/cartesian/ZAxis'>;\n}\ndeclare module 'recharts/src/chart/AreaChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/AreaChart'>;\n}\ndeclare module 'recharts/src/chart/BarChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/BarChart'>;\n}\ndeclare module 'recharts/src/chart/ComposedChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/ComposedChart'>;\n}\ndeclare module 'recharts/src/chart/generateCategoricalChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/generateCategoricalChart'>;\n}\ndeclare module 'recharts/src/chart/LineChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/LineChart'>;\n}\ndeclare module 'recharts/src/chart/PieChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/PieChart'>;\n}\ndeclare module 'recharts/src/chart/RadarChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/RadarChart'>;\n}\ndeclare module 'recharts/src/chart/RadialBarChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/RadialBarChart'>;\n}\ndeclare module 'recharts/src/chart/Sankey.js' {\n  declare module.exports: $Exports<'recharts/src/chart/Sankey'>;\n}\ndeclare module 'recharts/src/chart/ScatterChart.js' {\n  declare module.exports: $Exports<'recharts/src/chart/ScatterChart'>;\n}\ndeclare module 'recharts/src/chart/Treemap.js' {\n  declare module.exports: $Exports<'recharts/src/chart/Treemap'>;\n}\ndeclare module 'recharts/src/component/Cell.js' {\n  declare module.exports: $Exports<'recharts/src/component/Cell'>;\n}\ndeclare module 'recharts/src/component/DefaultLegendContent.js' {\n  declare module.exports: $Exports<'recharts/src/component/DefaultLegendContent'>;\n}\ndeclare module 'recharts/src/component/DefaultTooltipContent.js' {\n  declare module.exports: $Exports<'recharts/src/component/DefaultTooltipContent'>;\n}\ndeclare module 'recharts/src/component/Label.js' {\n  declare module.exports: $Exports<'recharts/src/component/Label'>;\n}\ndeclare module 'recharts/src/component/LabelList.js' {\n  declare module.exports: $Exports<'recharts/src/component/LabelList'>;\n}\ndeclare module 'recharts/src/component/Legend.js' {\n  declare module.exports: $Exports<'recharts/src/component/Legend'>;\n}\ndeclare module 'recharts/src/component/ResponsiveContainer.js' {\n  declare module.exports: $Exports<'recharts/src/component/ResponsiveContainer'>;\n}\ndeclare module 'recharts/src/component/Text.js' {\n  declare module.exports: $Exports<'recharts/src/component/Text'>;\n}\ndeclare module 'recharts/src/component/Tooltip.js' {\n  declare module.exports: $Exports<'recharts/src/component/Tooltip'>;\n}\ndeclare module 'recharts/src/container/Layer.js' {\n  declare module.exports: $Exports<'recharts/src/container/Layer'>;\n}\ndeclare module 'recharts/src/container/Surface.js' {\n  declare module.exports: $Exports<'recharts/src/container/Surface'>;\n}\ndeclare module 'recharts/src/index.js' {\n  declare module.exports: $Exports<'recharts/src/index'>;\n}\ndeclare module 'recharts/src/polar/Pie.js' {\n  declare module.exports: $Exports<'recharts/src/polar/Pie'>;\n}\ndeclare module 'recharts/src/polar/PolarAngleAxis.js' {\n  declare module.exports: $Exports<'recharts/src/polar/PolarAngleAxis'>;\n}\ndeclare module 'recharts/src/polar/PolarGrid.js' {\n  declare module.exports: $Exports<'recharts/src/polar/PolarGrid'>;\n}\ndeclare module 'recharts/src/polar/PolarRadiusAxis.js' {\n  declare module.exports: $Exports<'recharts/src/polar/PolarRadiusAxis'>;\n}\ndeclare module 'recharts/src/polar/Radar.js' {\n  declare module.exports: $Exports<'recharts/src/polar/Radar'>;\n}\ndeclare module 'recharts/src/polar/RadialBar.js' {\n  declare module.exports: $Exports<'recharts/src/polar/RadialBar'>;\n}\ndeclare module 'recharts/src/polyfill.js' {\n  declare module.exports: $Exports<'recharts/src/polyfill'>;\n}\ndeclare module 'recharts/src/shape/Cross.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Cross'>;\n}\ndeclare module 'recharts/src/shape/Curve.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Curve'>;\n}\ndeclare module 'recharts/src/shape/Dot.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Dot'>;\n}\ndeclare module 'recharts/src/shape/Polygon.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Polygon'>;\n}\ndeclare module 'recharts/src/shape/Rectangle.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Rectangle'>;\n}\ndeclare module 'recharts/src/shape/Sector.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Sector'>;\n}\ndeclare module 'recharts/src/shape/Symbols.js' {\n  declare module.exports: $Exports<'recharts/src/shape/Symbols'>;\n}\ndeclare module 'recharts/src/util/AnimationDecorator.js' {\n  declare module.exports: $Exports<'recharts/src/util/AnimationDecorator'>;\n}\ndeclare module 'recharts/src/util/CartesianUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/CartesianUtils'>;\n}\ndeclare module 'recharts/src/util/ChartUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/ChartUtils'>;\n}\ndeclare module 'recharts/src/util/CssPrefixUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/CssPrefixUtils'>;\n}\ndeclare module 'recharts/src/util/DataUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/DataUtils'>;\n}\ndeclare module 'recharts/src/util/DOMUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/DOMUtils'>;\n}\ndeclare module 'recharts/src/util/Events.js' {\n  declare module.exports: $Exports<'recharts/src/util/Events'>;\n}\ndeclare module 'recharts/src/util/LogUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/LogUtils'>;\n}\ndeclare module 'recharts/src/util/PolarUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/PolarUtils'>;\n}\ndeclare module 'recharts/src/util/PureRender.js' {\n  declare module.exports: $Exports<'recharts/src/util/PureRender'>;\n}\ndeclare module 'recharts/src/util/ReactUtils.js' {\n  declare module.exports: $Exports<'recharts/src/util/ReactUtils'>;\n}\ndeclare module 'recharts/umd/Recharts.js' {\n  declare module.exports: $Exports<'recharts/umd/Recharts'>;\n}\ndeclare module 'recharts/umd/Recharts.min.js' {\n  declare module.exports: $Exports<'recharts/umd/Recharts.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/recompose_v0.x.x.js",
    "content": "// flow-typed signature: ababb4f540ef52bbdbb2fdd0e473eb0d\n// flow-typed version: 245513abee/recompose_v0.x.x/flow_>=v0.57.x\n\n/**\n * 1) Types give additional constraint on a language, recompose was written on the untyped language\n * as a consequence of this fact\n * for some recompose HOCs is near impossible to add correct typings.\n * 2) flow sometimes does not work as expected.\n *\n *  So any help and suggestions will be very appreciated.\n *\n * -----------------------------------------------------------------------------------\n * Type definition of recompose HOCs are splitted into 2 parts,\n * \"HOCs with good flow support\" - in most cases you can use them without big issues,\n * see `test_${hocName}.js` for the idea.\n * Some known issues:\n * see test_mapProps.js - inference work but type errors are not detected in hocs\n *\n * SUPPORTED HOCs:\n * defaultProps, mapProps, withProps, withStateHandlers, withHandlers, pure,\n * onlyUpdateForKeys, shouldUpdate, renderNothing, renderComponent, branch, withPropsOnChange,\n * onlyUpdateForPropTypes, toClass, withContext, getContext,\n * setStatic, setPropTypes, setDisplayName,\n * -----------------------------------------------------------------------------------\n * \"TODO (UNSUPPORTED) HOCs\" - you need to provide type information\n * (no automatic type inference), voodoo dancing etc\n * see `test_voodoo.js` for the idea\n *\n * remember that:\n * flattenProp,renameProp, renameProps can easily be replaced with withProps\n * withReducer, withState -> use withStateHandlers instead\n * lifecycle -> you don't need recompose if you need a lifecycle, just use React class instead\n * mapPropsStream -> see test_mapPropsStream.js\n * -----------------------------------------------------------------------------------\n *\n * utils:\n * getDisplayName, wrapDisplayName, shallowEqual,\n * isClassComponent, createEagerElement, createEagerFactory, createSink, componentFromProp,\n * nest, hoistStatics,\n */\n\n//-------------------\n\ndeclare module \"recompose\" {\n  // -----------------------------------------------------------------\n  // Private declarations\n  // -----------------------------------------------------------------\n\n  declare type Void_<A, B, C, D, R, Fn: (A, B, C, D) => R> = (\n    A,\n    B,\n    C,\n    D\n  ) => void;\n\n  declare type Void<T> = Void_<*, *, *, *, *, T>;\n\n  declare type ExtractStateHandlersCodomain = <State, Enhanced, V>(\n    v: (state: State, props: Enhanced) => V\n  ) => Void<V>;\n\n  declare type ExtractHandlersCodomain = <Enhanced, V>(\n    v: (props: Enhanced) => V\n  ) => V;\n\n  declare type UnaryFn<A, R> = (a: A) => R;\n\n  // -----------------------------------------------------------------\n  // Public declarations\n  // -----------------------------------------------------------------\n\n  declare export type Component<A> = React$ComponentType<A>;\n\n  declare export type HOC<Base, Enhanced> = UnaryFn<\n    Component<Base>,\n    Component<Enhanced>\n  >;\n\n  declare export var compose: $Compose;\n\n  // ---------------------------------------------------------------------------\n  // ----------------===<<<HOCs with good flow support>>>===--------------------\n  // ---------------------------------------------------------------------------\n\n  declare export function defaultProps<Default, Enhanced>(\n    defProps: Default\n  ): HOC<{ ...$Exact<Enhanced>, ...Default }, Enhanced>;\n\n  declare export function mapProps<Base, Enhanced>(\n    propsMapper: (ownerProps: Enhanced) => Base\n  ): HOC<Base, Enhanced>;\n\n  declare export function withProps<BaseAdd, Enhanced>(\n    propsMapper: ((ownerProps: Enhanced) => BaseAdd) | BaseAdd\n  ): HOC<{ ...$Exact<Enhanced>, ...BaseAdd }, Enhanced>;\n\n  declare export function withStateHandlers<\n    State,\n    Enhanced,\n    StateHandlers: {\n      [key: string]: (\n        state: State,\n        props: Enhanced\n      ) => (...payload: any[]) => $Shape<State>\n    }\n  >(\n    initialState: ((props: Enhanced) => State) | State,\n    stateUpdaters: StateHandlers\n  ): HOC<\n    {\n      ...$Exact<Enhanced>,\n      ...$Exact<State>,\n      ...$ObjMap<StateHandlers, ExtractStateHandlersCodomain>\n    },\n    Enhanced\n  >;\n\n  declare export function withHandlers<\n    Enhanced,\n    Handlers:\n      | ((\n          props: Enhanced\n        ) => {\n          [key: string]: (props: Enhanced) => Function\n        })\n      | {\n          [key: string]: (props: Enhanced) => Function\n        }\n  >(\n    handlers: ((props: Enhanced) => Handlers) | Handlers\n  ): HOC<\n    {\n      ...$Exact<Enhanced>,\n      ...$ObjMap<Handlers, ExtractHandlersCodomain>\n    },\n    Enhanced\n  >;\n\n  declare export function pure<A>(a: Component<A>): Component<A>;\n  declare export function onlyUpdateForPropTypes<A>(\n    a: Component<A>\n  ): Component<A>;\n  declare export function onlyUpdateForKeys<A>(Array<$Keys<A>>): HOC<A, A>;\n  declare export function shouldUpdate<A>(\n    (props: A, nextProps: A) => boolean\n  ): HOC<A, A>;\n\n  declare export function toClass<A>(a: Component<A>): Component<A>;\n\n  declare export function withContext<A, ContextPropTypes, ContextObj>(\n    childContextTypes: ContextPropTypes,\n    getChildContext: (props: A) => ContextObj\n  ): HOC<A, A>;\n\n  declare export function getContext<CtxTypes, Enhanced>(\n    contextTypes: CtxTypes\n  ): HOC<{ ...$Exact<Enhanced>, ...CtxTypes }, Enhanced>;\n\n  /**\n   * It's wrong declaration but having that renderNothing and renderComponent are somehow useless\n   * outside branch enhancer, we just give it an id type\n   * so common way of using branch like\n   * `branch(testFn, renderNothing | renderComponent(Comp))` will work as expected.\n   * Tests are placed at test_branch.\n   */\n  declare export function renderNothing<A>(C: Component<A>): Component<A>;\n  declare export function renderComponent<A>(a: Component<A>): HOC<A, A>;\n\n  /**\n   * We make an assumtion that left and right have the same type if exists\n   */\n  declare export function branch<Base, Enhanced>(\n    testFn: (props: Enhanced) => boolean,\n    // not a HOC because of inference problems, this works but HOC<Base, Enhanced> is not\n    left: (Component<Base>) => Component<Enhanced>,\n    // I never use right part and it can be a problem with inference as should be same type as left\n    right?: (Component<Base>) => Component<Enhanced>\n  ): HOC<Base, Enhanced>;\n\n  // test_statics\n  declare export function setStatic<A>(key: string, value: any): HOC<A, A>;\n  declare export function setPropTypes<A>(propTypes: Object): HOC<A, A>;\n  declare export function setDisplayName<A>(displayName: string): HOC<A, A>;\n\n  declare export function withPropsOnChange<BaseAdd, Enhanced>(\n    shouldMapOrKeys:\n      | ((props: Enhanced, nextProps: Enhanced) => boolean)\n      | Array<$Keys<Enhanced>>,\n    propsMapper: (ownerProps: Enhanced) => BaseAdd\n  ): HOC<{ ...$Exact<Enhanced>, ...BaseAdd }, Enhanced>;\n\n  // ---------------------------------------------------------------------------\n  // ----------------===<<<TODO (UNSUPPORTED) HOCs>>>===------------------------\n  // ---------------------------------------------------------------------------\n\n  // use withProps instead\n  declare export function flattenProp<Base, Enhanced>(\n    propName: $Keys<Enhanced>\n  ): HOC<Base, Enhanced>;\n\n  // use withProps instead\n  declare export function renameProp<Base, Enhanced>(\n    oldName: $Keys<Enhanced>,\n    newName: $Keys<Base>\n  ): HOC<Base, Enhanced>;\n\n  // use withProps instead\n  declare export function renameProps<Base, Enhanced>(nameMap: {\n    [key: $Keys<Enhanced>]: $Keys<Base>\n  }): HOC<Base, Enhanced>;\n\n  // use withStateHandlers instead\n  declare export function withState<Base, Enhanced, T>(\n    stateName: string,\n    stateUpdaterName: string,\n    initialState: T | ((props: Enhanced) => T)\n  ): HOC<Base, Enhanced>;\n\n  // use withStateHandlers instead\n  declare export function withReducer<A, B, Action, State>(\n    stateName: string,\n    dispatchName: string,\n    reducer: (state: State, action: Action) => State,\n    initialState: State\n  ): HOC<A, B>;\n\n  // lifecycle use React instead\n  declare export function lifecycle<A, B>(spec: Object): HOC<A, B>;\n\n  // Help needed, as explicitly providing the type\n  // errors not detected, see TODO at test_mapPropsStream.js\n  declare export function mapPropsStream<Base, Enhanced>(\n    (props$: any) => any\n  ): HOC<Base, Enhanced>;\n\n  // ---------------------------------------------------------------------------\n  // -----------------------------===<<<Utils>>>===-----------------------------\n  // ---------------------------------------------------------------------------\n\n  declare export function getDisplayName<A>(C: Component<A>): string;\n\n  declare export function wrapDisplayName<A>(\n    C: Component<A>,\n    wrapperName: string\n  ): string;\n\n  declare export function shallowEqual(objA: mixed, objB: mixed): boolean;\n\n  declare export function isClassComponent(value: any): boolean;\n\n  declare export function createEagerElement<A>(\n    type: Component<A> | string,\n    props: ?A,\n    children?: ?React$Node\n  ): React$Element<any>;\n\n  declare export function createEagerFactory<A>(\n    type: Component<A> | string\n  ): (props: ?A, children?: ?React$Node) => React$Element<any>;\n\n  declare export function createSink<A>(\n    callback: (props: A) => void\n  ): Component<A>;\n\n  declare export function componentFromProp<A>(propName: string): Component<A>;\n\n  declare export function nest<A>(\n    ...Components: Array<Component<any> | string>\n  ): Component<A>;\n\n  declare export function hoistStatics<A, B, H: HOC<A, B>>(hoc: H): H;\n\n  declare export function componentFromStream<T>(\n    (props$: any) => any\n  ): T => React$Element<any>;\n\n  declare export function createEventHandler(): {\n    stream: any,\n    handler: Function\n  };\n}\n\ndeclare module \"recompose/defaultProps\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"defaultProps\">;\n}\n\ndeclare module \"recompose/mapProps\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"mapProps\">;\n}\n\ndeclare module \"recompose/withProps\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"withProps\">;\n}\n\ndeclare module \"recompose/withStateHandlers\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"withStateHandlers\"\n  >;\n}\n\ndeclare module \"recompose/withHandlers\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"withHandlers\">;\n}\n\ndeclare module \"recompose/pure\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"pure\">;\n}\n\ndeclare module \"recompose/onlyUpdateForPropTypes\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"onlyUpdateForPropTypes\"\n  >;\n}\n\ndeclare module \"recompose/onlyUpdateForKeys\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"onlyUpdateForKeys\"\n  >;\n}\n\ndeclare module \"recompose/shouldUpdate\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"shouldUpdate\">;\n}\n\ndeclare module \"recompose/toClass\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"toClass\">;\n}\n\ndeclare module \"recompose/withContext\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"withContext\">;\n}\n\ndeclare module \"recompose/getContext\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"getContext\">;\n}\n\ndeclare module \"recompose/renderNothing\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"renderNothing\">;\n}\n\ndeclare module \"recompose/renderComponent\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"renderComponent\"\n  >;\n}\n\ndeclare module \"recompose/branch\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"branch\">;\n}\n\ndeclare module \"recompose/setStatic\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"setStatic\">;\n}\n\ndeclare module \"recompose/setPropTypes\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"setPropTypes\">;\n}\n\ndeclare module \"recompose/setDisplayName\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"setDisplayName\"\n  >;\n}\n\ndeclare module \"recompose/withPropsOnChange\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"withPropsOnChange\"\n  >;\n}\n\ndeclare module \"recompose/flattenProp\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"flattenProp\">;\n}\n\ndeclare module \"recompose/renameProp\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"renameProp\">;\n}\n\ndeclare module \"recompose/renameProps\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"renameProps\">;\n}\n\ndeclare module \"recompose/withState\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"withState\">;\n}\n\ndeclare module \"recompose/withReducer\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"withReducer\">;\n}\n\ndeclare module \"recompose/lifecycle\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"lifecycle\">;\n}\n\ndeclare module \"recompose/mapPropsStream\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"mapPropsStream\"\n  >;\n}\n\ndeclare module \"recompose/getDisplayName\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"getDisplayName\"\n  >;\n}\n\ndeclare module \"recompose/wrapDisplayName\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"wrapDisplayName\"\n  >;\n}\n\ndeclare module \"recompose/shallowEqual\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"shallowEqual\">;\n}\n\ndeclare module \"recompose/isClassComponent\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"isClassComponent\"\n  >;\n}\n\ndeclare module \"recompose/createEagerElement\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"createEagerElement\"\n  >;\n}\n\ndeclare module \"recompose/createEagerFactory\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"createEagerFactory\"\n  >;\n}\n\ndeclare module \"recompose/createSink\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"createSink\">;\n}\n\ndeclare module \"recompose/componentFromProp\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"componentFromProp\"\n  >;\n}\n\ndeclare module \"recompose/nest\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"nest\">;\n}\n\ndeclare module \"recompose/hoistStatics\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"hoistStatics\">;\n}\n\ndeclare module \"recompose/componentFromStream\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"componentFromStream\"\n  >;\n}\n\ndeclare module \"recompose/createEventHandler\" {\n  declare module.exports: $PropertyType<\n    $Exports<\"recompose\">,\n    \"createEventHandler\"\n  >;\n}\n\ndeclare module \"recompose/compose\" {\n  declare module.exports: $PropertyType<$Exports<\"recompose\">, \"compose\">;\n}\n"
  },
  {
    "path": "flow-typed/npm/recompose_vx.x.x.js",
    "content": "// flow-typed signature: 18f8472eab52fd1408ec607cec5e2b7a\n// flow-typed version: <<STUB>>/recompose_v^0.23.4/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'recompose'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'recompose' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'recompose/baconObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/branch' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/build/Recompose' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/build/Recompose.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/cjs/Recompose' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/componentFromProp' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/componentFromStream' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/compose' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/createEagerElement' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/createEagerFactory' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/createEventHandler' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/createSink' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/defaultProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/es/Recompose' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/flattenProp' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/flydObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/getContext' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/getDisplayName' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/hoistStatics' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/isClassComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/isReferentiallyTransparentFunctionComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/kefirObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/lifecycle' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/mapProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/mapPropsStream' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/mostObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/nest' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/onlyUpdateForKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/onlyUpdateForPropTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/pure' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/renameProp' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/renameProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/renderComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/renderNothing' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/rxjs4ObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/rxjsObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/setDisplayName' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/setObservableConfig' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/setPropTypes' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/setStatic' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/shallowEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/shouldUpdate' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/toClass' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/utils/createEagerElementUtil' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/utils/omit' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/utils/pick' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withContext' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withHandlers' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withProps' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withPropsOnChange' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withReducer' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/withState' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/wrapDisplayName' {\n  declare module.exports: any;\n}\n\ndeclare module 'recompose/xstreamObservableConfig' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'recompose/baconObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/baconObservableConfig'>;\n}\ndeclare module 'recompose/branch.js' {\n  declare module.exports: $Exports<'recompose/branch'>;\n}\ndeclare module 'recompose/build/Recompose.js' {\n  declare module.exports: $Exports<'recompose/build/Recompose'>;\n}\ndeclare module 'recompose/build/Recompose.min.js' {\n  declare module.exports: $Exports<'recompose/build/Recompose.min'>;\n}\ndeclare module 'recompose/cjs/Recompose.js' {\n  declare module.exports: $Exports<'recompose/cjs/Recompose'>;\n}\ndeclare module 'recompose/componentFromProp.js' {\n  declare module.exports: $Exports<'recompose/componentFromProp'>;\n}\ndeclare module 'recompose/componentFromStream.js' {\n  declare module.exports: $Exports<'recompose/componentFromStream'>;\n}\ndeclare module 'recompose/compose.js' {\n  declare module.exports: $Exports<'recompose/compose'>;\n}\ndeclare module 'recompose/createEagerElement.js' {\n  declare module.exports: $Exports<'recompose/createEagerElement'>;\n}\ndeclare module 'recompose/createEagerFactory.js' {\n  declare module.exports: $Exports<'recompose/createEagerFactory'>;\n}\ndeclare module 'recompose/createEventHandler.js' {\n  declare module.exports: $Exports<'recompose/createEventHandler'>;\n}\ndeclare module 'recompose/createSink.js' {\n  declare module.exports: $Exports<'recompose/createSink'>;\n}\ndeclare module 'recompose/defaultProps.js' {\n  declare module.exports: $Exports<'recompose/defaultProps'>;\n}\ndeclare module 'recompose/es/Recompose.js' {\n  declare module.exports: $Exports<'recompose/es/Recompose'>;\n}\ndeclare module 'recompose/flattenProp.js' {\n  declare module.exports: $Exports<'recompose/flattenProp'>;\n}\ndeclare module 'recompose/flydObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/flydObservableConfig'>;\n}\ndeclare module 'recompose/getContext.js' {\n  declare module.exports: $Exports<'recompose/getContext'>;\n}\ndeclare module 'recompose/getDisplayName.js' {\n  declare module.exports: $Exports<'recompose/getDisplayName'>;\n}\ndeclare module 'recompose/hoistStatics.js' {\n  declare module.exports: $Exports<'recompose/hoistStatics'>;\n}\ndeclare module 'recompose/index' {\n  declare module.exports: $Exports<'recompose'>;\n}\ndeclare module 'recompose/index.js' {\n  declare module.exports: $Exports<'recompose'>;\n}\ndeclare module 'recompose/isClassComponent.js' {\n  declare module.exports: $Exports<'recompose/isClassComponent'>;\n}\ndeclare module 'recompose/isReferentiallyTransparentFunctionComponent.js' {\n  declare module.exports: $Exports<'recompose/isReferentiallyTransparentFunctionComponent'>;\n}\ndeclare module 'recompose/kefirObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/kefirObservableConfig'>;\n}\ndeclare module 'recompose/lifecycle.js' {\n  declare module.exports: $Exports<'recompose/lifecycle'>;\n}\ndeclare module 'recompose/mapProps.js' {\n  declare module.exports: $Exports<'recompose/mapProps'>;\n}\ndeclare module 'recompose/mapPropsStream.js' {\n  declare module.exports: $Exports<'recompose/mapPropsStream'>;\n}\ndeclare module 'recompose/mostObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/mostObservableConfig'>;\n}\ndeclare module 'recompose/nest.js' {\n  declare module.exports: $Exports<'recompose/nest'>;\n}\ndeclare module 'recompose/onlyUpdateForKeys.js' {\n  declare module.exports: $Exports<'recompose/onlyUpdateForKeys'>;\n}\ndeclare module 'recompose/onlyUpdateForPropTypes.js' {\n  declare module.exports: $Exports<'recompose/onlyUpdateForPropTypes'>;\n}\ndeclare module 'recompose/pure.js' {\n  declare module.exports: $Exports<'recompose/pure'>;\n}\ndeclare module 'recompose/renameProp.js' {\n  declare module.exports: $Exports<'recompose/renameProp'>;\n}\ndeclare module 'recompose/renameProps.js' {\n  declare module.exports: $Exports<'recompose/renameProps'>;\n}\ndeclare module 'recompose/renderComponent.js' {\n  declare module.exports: $Exports<'recompose/renderComponent'>;\n}\ndeclare module 'recompose/renderNothing.js' {\n  declare module.exports: $Exports<'recompose/renderNothing'>;\n}\ndeclare module 'recompose/rxjs4ObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/rxjs4ObservableConfig'>;\n}\ndeclare module 'recompose/rxjsObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/rxjsObservableConfig'>;\n}\ndeclare module 'recompose/setDisplayName.js' {\n  declare module.exports: $Exports<'recompose/setDisplayName'>;\n}\ndeclare module 'recompose/setObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/setObservableConfig'>;\n}\ndeclare module 'recompose/setPropTypes.js' {\n  declare module.exports: $Exports<'recompose/setPropTypes'>;\n}\ndeclare module 'recompose/setStatic.js' {\n  declare module.exports: $Exports<'recompose/setStatic'>;\n}\ndeclare module 'recompose/shallowEqual.js' {\n  declare module.exports: $Exports<'recompose/shallowEqual'>;\n}\ndeclare module 'recompose/shouldUpdate.js' {\n  declare module.exports: $Exports<'recompose/shouldUpdate'>;\n}\ndeclare module 'recompose/toClass.js' {\n  declare module.exports: $Exports<'recompose/toClass'>;\n}\ndeclare module 'recompose/utils/createEagerElementUtil.js' {\n  declare module.exports: $Exports<'recompose/utils/createEagerElementUtil'>;\n}\ndeclare module 'recompose/utils/omit.js' {\n  declare module.exports: $Exports<'recompose/utils/omit'>;\n}\ndeclare module 'recompose/utils/pick.js' {\n  declare module.exports: $Exports<'recompose/utils/pick'>;\n}\ndeclare module 'recompose/withContext.js' {\n  declare module.exports: $Exports<'recompose/withContext'>;\n}\ndeclare module 'recompose/withHandlers.js' {\n  declare module.exports: $Exports<'recompose/withHandlers'>;\n}\ndeclare module 'recompose/withProps.js' {\n  declare module.exports: $Exports<'recompose/withProps'>;\n}\ndeclare module 'recompose/withPropsOnChange.js' {\n  declare module.exports: $Exports<'recompose/withPropsOnChange'>;\n}\ndeclare module 'recompose/withReducer.js' {\n  declare module.exports: $Exports<'recompose/withReducer'>;\n}\ndeclare module 'recompose/withState.js' {\n  declare module.exports: $Exports<'recompose/withState'>;\n}\ndeclare module 'recompose/wrapDisplayName.js' {\n  declare module.exports: $Exports<'recompose/wrapDisplayName'>;\n}\ndeclare module 'recompose/xstreamObservableConfig.js' {\n  declare module.exports: $Exports<'recompose/xstreamObservableConfig'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/redis-tag-cache_vx.x.x.js",
    "content": "// flow-typed signature: c7f5b43c5e1b103e542648906166804f\n// flow-typed version: <<STUB>>/redis-tag-cache_v1.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'redis-tag-cache'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\nimport type { RedisOptions } from 'ioredis';\n\ndeclare module 'redis-tag-cache' {\n  declare type Options = {\n    defaultTimeout?: number,\n    redis?: RedisOptions,\n  }\n\n  declare type SetOptions = {\n     timeout?: number\n  }\n\n  declare class TagCache {\n    constructor(options?: Options): void;\n    get(...keys: Array<string>): Promise<?any>;\n    set(key: string, data: any, tags: Array<string>, options?: SetOptions): Promise<void>;\n    invalidate(...tags: Array<string>): Promise<void>;\n  }\n\n  declare module.exports: typeof TagCache;\n}\n\n"
  },
  {
    "path": "flow-typed/npm/redraft_vx.x.x.js",
    "content": "// flow-typed signature: a33fbd6ef285c13738540a6c718e3635\n// flow-typed version: <<STUB>>/redraft_v0.8.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'redraft'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'redraft' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'redraft/lib/ContentNode' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/createStyleRenderer' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/defaultOptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/arrayEqual' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/checkCleanup' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/checkJoin' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/getKeyGenerator' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/pushString' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/stubContentBlock' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/helpers/warn' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/RawParser' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/render' {\n  declare module.exports: any;\n}\n\ndeclare module 'redraft/lib/withDecorators' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'redraft/lib/ContentNode.js' {\n  declare module.exports: $Exports<'redraft/lib/ContentNode'>;\n}\ndeclare module 'redraft/lib/createStyleRenderer.js' {\n  declare module.exports: $Exports<'redraft/lib/createStyleRenderer'>;\n}\ndeclare module 'redraft/lib/defaultOptions.js' {\n  declare module.exports: $Exports<'redraft/lib/defaultOptions'>;\n}\ndeclare module 'redraft/lib/helpers/arrayEqual.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/arrayEqual'>;\n}\ndeclare module 'redraft/lib/helpers/checkCleanup.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/checkCleanup'>;\n}\ndeclare module 'redraft/lib/helpers/checkJoin.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/checkJoin'>;\n}\ndeclare module 'redraft/lib/helpers/getKeyGenerator.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/getKeyGenerator'>;\n}\ndeclare module 'redraft/lib/helpers/pushString.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/pushString'>;\n}\ndeclare module 'redraft/lib/helpers/stubContentBlock.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/stubContentBlock'>;\n}\ndeclare module 'redraft/lib/helpers/warn.js' {\n  declare module.exports: $Exports<'redraft/lib/helpers/warn'>;\n}\ndeclare module 'redraft/lib/index.js' {\n  declare module.exports: $Exports<'redraft/lib/index'>;\n}\ndeclare module 'redraft/lib/RawParser.js' {\n  declare module.exports: $Exports<'redraft/lib/RawParser'>;\n}\ndeclare module 'redraft/lib/render.js' {\n  declare module.exports: $Exports<'redraft/lib/render'>;\n}\ndeclare module 'redraft/lib/withDecorators.js' {\n  declare module.exports: $Exports<'redraft/lib/withDecorators'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/redux-thunk_vx.x.x.js",
    "content": "// flow-typed signature: 19a75723ac134fae1bc601cc5d735e91\n// flow-typed version: <<STUB>>/redux-thunk_v^2.2.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'redux-thunk'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'redux-thunk' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'redux-thunk/dist/redux-thunk' {\n  declare module.exports: any;\n}\n\ndeclare module 'redux-thunk/dist/redux-thunk.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'redux-thunk/es/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'redux-thunk/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'redux-thunk/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'redux-thunk/dist/redux-thunk.js' {\n  declare module.exports: $Exports<'redux-thunk/dist/redux-thunk'>;\n}\ndeclare module 'redux-thunk/dist/redux-thunk.min.js' {\n  declare module.exports: $Exports<'redux-thunk/dist/redux-thunk.min'>;\n}\ndeclare module 'redux-thunk/es/index.js' {\n  declare module.exports: $Exports<'redux-thunk/es/index'>;\n}\ndeclare module 'redux-thunk/lib/index.js' {\n  declare module.exports: $Exports<'redux-thunk/lib/index'>;\n}\ndeclare module 'redux-thunk/src/index.js' {\n  declare module.exports: $Exports<'redux-thunk/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/redux_v3.x.x.js",
    "content": "// flow-typed signature: 86993bd000012d3e1ef10d757d16952d\n// flow-typed version: a165222d28/redux_v3.x.x/flow_>=v0.33.x\n\ndeclare module 'redux' {\n  /*\n\n    S = State\n    A = Action\n    D = Dispatch\n\n  */\n\n  declare type DispatchAPI<A> = (action: A) => A;\n  declare type Dispatch<A: { type: $Subtype<string> }> = DispatchAPI<A>;\n\n  declare type MiddlewareAPI<S, A, D = Dispatch<A>> = {\n    dispatch: D,\n    getState(): S,\n  };\n\n  declare type Store<S, A, D = Dispatch<A>> = {\n    // rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages)\n    dispatch: D,\n    getState(): S,\n    subscribe(listener: () => void): () => void,\n    replaceReducer(nextReducer: Reducer<S, A>): void,\n  };\n\n  declare type Reducer<S, A> = (state: S, action: A) => S;\n\n  declare type CombinedReducer<S, A> = (\n    state: ($Shape<S> & {}) | void,\n    action: A\n  ) => S;\n\n  declare type Middleware<S, A, D = Dispatch<A>> = (\n    api: MiddlewareAPI<S, A, D>\n  ) => (next: D) => D;\n\n  declare type StoreCreator<S, A, D = Dispatch<A>> = {\n    (reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A, D>): Store<S, A, D>,\n    (\n      reducer: Reducer<S, A>,\n      preloadedState: S,\n      enhancer?: StoreEnhancer<S, A, D>\n    ): Store<S, A, D>,\n  };\n\n  declare type StoreEnhancer<S, A, D = Dispatch<A>> = (\n    next: StoreCreator<S, A, D>\n  ) => StoreCreator<S, A, D>;\n\n  declare function createStore<S, A, D>(\n    reducer: Reducer<S, A>,\n    enhancer?: StoreEnhancer<S, A, D>\n  ): Store<S, A, D>;\n  declare function createStore<S, A, D>(\n    reducer: Reducer<S, A>,\n    preloadedState: S,\n    enhancer?: StoreEnhancer<S, A, D>\n  ): Store<S, A, D>;\n\n  declare function applyMiddleware<S, A, D>(\n    ...middlewares: Array<Middleware<S, A, D>>\n  ): StoreEnhancer<S, A, D>;\n\n  declare type ActionCreator<A, B> = (...args: Array<B>) => A;\n  declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };\n\n  declare function bindActionCreators<\n    A,\n    C: ActionCreator<A, any>,\n    D: DispatchAPI<A>\n  >(\n    actionCreator: C,\n    dispatch: D\n  ): C;\n  declare function bindActionCreators<\n    A,\n    K,\n    C: ActionCreators<K, A>,\n    D: DispatchAPI<A>\n  >(\n    actionCreators: C,\n    dispatch: D\n  ): C;\n\n  declare function combineReducers<O: Object, A>(\n    reducers: O\n  ): CombinedReducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;\n\n  declare function compose<A, B>(ab: (a: A) => B): (a: A) => B;\n  declare function compose<A, B, C>(\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => C;\n  declare function compose<A, B, C, D>(\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => D;\n  declare function compose<A, B, C, D, E>(\n    de: (d: D) => E,\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => E;\n  declare function compose<A, B, C, D, E, F>(\n    ef: (e: E) => F,\n    de: (d: D) => E,\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => F;\n  declare function compose<A, B, C, D, E, F, G>(\n    fg: (f: F) => G,\n    ef: (e: E) => F,\n    de: (d: D) => E,\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => G;\n  declare function compose<A, B, C, D, E, F, G, H>(\n    gh: (g: G) => H,\n    fg: (f: F) => G,\n    ef: (e: E) => F,\n    de: (d: D) => E,\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => H;\n  declare function compose<A, B, C, D, E, F, G, H, I>(\n    hi: (h: H) => I,\n    gh: (g: G) => H,\n    fg: (f: F) => G,\n    ef: (e: E) => F,\n    de: (d: D) => E,\n    cd: (c: C) => D,\n    bc: (b: B) => C,\n    ab: (a: A) => B\n  ): (a: A) => I;\n}\n"
  },
  {
    "path": "flow-typed/npm/request-ip_vx.x.x.js",
    "content": "// flow-typed signature: 78b6b0fc3ee7604a3e67412a6cd6a121\n// flow-typed version: <<STUB>>/request-ip_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'request-ip'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'request-ip' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'request-ip/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'request-ip/dist/index.js' {\n  declare module.exports: $Exports<'request-ip/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rethinkdb-changefeed-reconnect_vx.x.x.js",
    "content": "// flow-typed signature: 592c0e5852cd969e5602279b98fb79c2\n// flow-typed version: <<STUB>>/rethinkdb-changefeed-reconnect_v0.3.2/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rethinkdb-changefeed-reconnect'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rethinkdb-changefeed-reconnect' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rethinkdb-changefeed-reconnect/example/example.babel' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/example/example' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/example/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/lib/__tests__/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/src/__tests__/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-changefeed-reconnect/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rethinkdb-changefeed-reconnect/example/example.babel.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/example/example.babel'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/example/example.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/example/example'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/example/index.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/example/index'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/lib/__tests__/index.test.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/lib/__tests__/index.test'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/lib/index.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/lib/index'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/src/__tests__/index.test.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/src/__tests__/index.test'>;\n}\ndeclare module 'rethinkdb-changefeed-reconnect/src/index.js' {\n  declare module.exports: $Exports<'rethinkdb-changefeed-reconnect/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rethinkdb-inspector_vx.x.x.js",
    "content": "// flow-typed signature: 9d1c99b3d5cd0cb7ce1484adb1ad5554\n// flow-typed version: <<STUB>>/rethinkdb-inspector_v^0.3.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rethinkdb-inspector'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rethinkdb-inspector' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rethinkdb-inspector/dist/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/dist/get-query-string' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-polyfill_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-env_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-es2015_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-stage-2_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/eslint-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/husky_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/jest_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/performance-now_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/prettier_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/rethinkdbdash_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/flow-typed/npm/rimraf_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/src/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/src/get-query-string' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/src/test/index.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-inspector/src/test/on-query-complete.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rethinkdb-inspector/dist/error.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/dist/error'>;\n}\ndeclare module 'rethinkdb-inspector/dist/get-query-string.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/dist/get-query-string'>;\n}\ndeclare module 'rethinkdb-inspector/dist/index.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/dist/index'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-react-jsx_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-polyfill_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-polyfill_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-env_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-preset-env_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-es2015_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-preset-es2015_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-preset-flow_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/babel-preset-stage-2_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/babel-preset-stage-2_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/eslint-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/eslint-plugin-babel_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/husky_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/husky_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/jest_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/jest_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/performance-now_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/performance-now_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/prettier_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/prettier_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/rethinkdbdash_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/rethinkdbdash_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/flow-typed/npm/rimraf_vx.x.x.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/flow-typed/npm/rimraf_vx.x.x'>;\n}\ndeclare module 'rethinkdb-inspector/src/error.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/src/error'>;\n}\ndeclare module 'rethinkdb-inspector/src/get-query-string.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/src/get-query-string'>;\n}\ndeclare module 'rethinkdb-inspector/src/index.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/src/index'>;\n}\ndeclare module 'rethinkdb-inspector/src/test/index.test.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/src/test/index.test'>;\n}\ndeclare module 'rethinkdb-inspector/src/test/on-query-complete.test.js' {\n  declare module.exports: $Exports<'rethinkdb-inspector/src/test/on-query-complete.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rethinkdb-migrate_vx.x.x.js",
    "content": "// flow-typed signature: d534b3f2a8403beadba92fe908433790\n// flow-typed version: <<STUB>>/rethinkdb-migrate_v^1.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rethinkdb-migrate'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rethinkdb-migrate' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rethinkdb-migrate/Gruntfile' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/lib/create' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/lib/migrate' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/lib/template' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/create' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations/20151005145709-create-table' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations/20151005165432-insert-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005145709-create-table' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005165432-insert-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005185432-remove-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdb-migrate/test/migrate' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rethinkdb-migrate/Gruntfile.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/Gruntfile'>;\n}\ndeclare module 'rethinkdb-migrate/lib/create.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/lib/create'>;\n}\ndeclare module 'rethinkdb-migrate/lib/index.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/lib/index'>;\n}\ndeclare module 'rethinkdb-migrate/lib/migrate.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/lib/migrate'>;\n}\ndeclare module 'rethinkdb-migrate/lib/template.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/lib/template'>;\n}\ndeclare module 'rethinkdb-migrate/test/create.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/create'>;\n}\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations/20151005145709-create-table.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/fixtures/migrations/20151005145709-create-table'>;\n}\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations/20151005165432-insert-data.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/fixtures/migrations/20151005165432-insert-data'>;\n}\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005145709-create-table.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/fixtures/migrations2/20151005145709-create-table'>;\n}\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005165432-insert-data.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/fixtures/migrations2/20151005165432-insert-data'>;\n}\ndeclare module 'rethinkdb-migrate/test/fixtures/migrations2/20151005185432-remove-data.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/fixtures/migrations2/20151005185432-remove-data'>;\n}\ndeclare module 'rethinkdb-migrate/test/index.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/index'>;\n}\ndeclare module 'rethinkdb-migrate/test/migrate.js' {\n  declare module.exports: $Exports<'rethinkdb-migrate/test/migrate'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rethinkdbdash_vx.x.x.js",
    "content": "// flow-typed signature: 8aa2281f96fb7c2a1d233f3f4503561a\n// flow-typed version: <<STUB>>/rethinkdbdash_v^2.3.29/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rethinkdbdash'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rethinkdbdash' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rethinkdbdash/browserify' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/connection' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/dequeue' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/metadata' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/pool_master' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/pool' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/protodef' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/term' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/transform_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/lib/writable_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/long_test/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/long_test/discovery' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/long_test/static' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/long_test/writable_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/accessing-reql' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/administration' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/aggregation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/backtrace' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/client-backtrace' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/control-structures' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/coverage' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/dates-and-times' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/datum' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/dequeue' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/document-manipulation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/extra' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/geo' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/joins' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/manipulating-databases' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/manipulating-tables' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/math-and-logic' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/multiple-require' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/nodeify' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/pool_legacy' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/selecting-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/stable' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/string-manipulation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/transform-stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/transformations' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/common' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/database' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/document' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/group' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/protodef' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/query' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/sequence' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/util/fake_server/table' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/writable-stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/test/writing-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/tool/generateTest' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkdbdash/tool/ulimit' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rethinkdbdash/browserify.js' {\n  declare module.exports: $Exports<'rethinkdbdash/browserify'>;\n}\ndeclare module 'rethinkdbdash/lib/connection.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/connection'>;\n}\ndeclare module 'rethinkdbdash/lib/cursor.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/cursor'>;\n}\ndeclare module 'rethinkdbdash/lib/dequeue.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/dequeue'>;\n}\ndeclare module 'rethinkdbdash/lib/error.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/error'>;\n}\ndeclare module 'rethinkdbdash/lib/helper.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/helper'>;\n}\ndeclare module 'rethinkdbdash/lib/index.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/index'>;\n}\ndeclare module 'rethinkdbdash/lib/metadata.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/metadata'>;\n}\ndeclare module 'rethinkdbdash/lib/pool_master.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/pool_master'>;\n}\ndeclare module 'rethinkdbdash/lib/pool.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/pool'>;\n}\ndeclare module 'rethinkdbdash/lib/protodef.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/protodef'>;\n}\ndeclare module 'rethinkdbdash/lib/stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/stream'>;\n}\ndeclare module 'rethinkdbdash/lib/term.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/term'>;\n}\ndeclare module 'rethinkdbdash/lib/transform_stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/transform_stream'>;\n}\ndeclare module 'rethinkdbdash/lib/writable_stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/lib/writable_stream'>;\n}\ndeclare module 'rethinkdbdash/long_test/config.js' {\n  declare module.exports: $Exports<'rethinkdbdash/long_test/config'>;\n}\ndeclare module 'rethinkdbdash/long_test/discovery.js' {\n  declare module.exports: $Exports<'rethinkdbdash/long_test/discovery'>;\n}\ndeclare module 'rethinkdbdash/long_test/static.js' {\n  declare module.exports: $Exports<'rethinkdbdash/long_test/static'>;\n}\ndeclare module 'rethinkdbdash/long_test/writable_stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/long_test/writable_stream'>;\n}\ndeclare module 'rethinkdbdash/test/accessing-reql.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/accessing-reql'>;\n}\ndeclare module 'rethinkdbdash/test/administration.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/administration'>;\n}\ndeclare module 'rethinkdbdash/test/aggregation.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/aggregation'>;\n}\ndeclare module 'rethinkdbdash/test/backtrace.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/backtrace'>;\n}\ndeclare module 'rethinkdbdash/test/client-backtrace.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/client-backtrace'>;\n}\ndeclare module 'rethinkdbdash/test/config.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/config'>;\n}\ndeclare module 'rethinkdbdash/test/control-structures.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/control-structures'>;\n}\ndeclare module 'rethinkdbdash/test/coverage.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/coverage'>;\n}\ndeclare module 'rethinkdbdash/test/cursor.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/cursor'>;\n}\ndeclare module 'rethinkdbdash/test/dates-and-times.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/dates-and-times'>;\n}\ndeclare module 'rethinkdbdash/test/datum.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/datum'>;\n}\ndeclare module 'rethinkdbdash/test/dequeue.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/dequeue'>;\n}\ndeclare module 'rethinkdbdash/test/document-manipulation.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/document-manipulation'>;\n}\ndeclare module 'rethinkdbdash/test/error.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/error'>;\n}\ndeclare module 'rethinkdbdash/test/extra.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/extra'>;\n}\ndeclare module 'rethinkdbdash/test/geo.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/geo'>;\n}\ndeclare module 'rethinkdbdash/test/joins.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/joins'>;\n}\ndeclare module 'rethinkdbdash/test/manipulating-databases.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/manipulating-databases'>;\n}\ndeclare module 'rethinkdbdash/test/manipulating-tables.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/manipulating-tables'>;\n}\ndeclare module 'rethinkdbdash/test/math-and-logic.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/math-and-logic'>;\n}\ndeclare module 'rethinkdbdash/test/multiple-require.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/multiple-require'>;\n}\ndeclare module 'rethinkdbdash/test/nodeify.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/nodeify'>;\n}\ndeclare module 'rethinkdbdash/test/pool_legacy.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/pool_legacy'>;\n}\ndeclare module 'rethinkdbdash/test/selecting-data.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/selecting-data'>;\n}\ndeclare module 'rethinkdbdash/test/stable.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/stable'>;\n}\ndeclare module 'rethinkdbdash/test/stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/stream'>;\n}\ndeclare module 'rethinkdbdash/test/string-manipulation.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/string-manipulation'>;\n}\ndeclare module 'rethinkdbdash/test/transform-stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/transform-stream'>;\n}\ndeclare module 'rethinkdbdash/test/transformations.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/transformations'>;\n}\ndeclare module 'rethinkdbdash/test/util/common.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/common'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/database.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/database'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/document.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/document'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/error.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/error'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/group.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/group'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/helper.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/helper'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/index.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/index'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/node.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/node'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/protodef.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/protodef'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/query.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/query'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/selection.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/selection'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/sequence.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/sequence'>;\n}\ndeclare module 'rethinkdbdash/test/util/fake_server/table.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/util/fake_server/table'>;\n}\ndeclare module 'rethinkdbdash/test/writable-stream.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/writable-stream'>;\n}\ndeclare module 'rethinkdbdash/test/writing-data.js' {\n  declare module.exports: $Exports<'rethinkdbdash/test/writing-data'>;\n}\ndeclare module 'rethinkdbdash/tool/generateTest.js' {\n  declare module.exports: $Exports<'rethinkdbdash/tool/generateTest'>;\n}\ndeclare module 'rethinkdbdash/tool/ulimit.js' {\n  declare module.exports: $Exports<'rethinkdbdash/tool/ulimit'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rethinkhaberdashery_vx.x.x.js",
    "content": "// flow-typed signature: 3bbe1f5fd24a38093d3be861a7f3eeb7\n// flow-typed version: <<STUB>>/rethinkhaberdashery_v2.3.32/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rethinkhaberdashery'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rethinkhaberdashery' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rethinkhaberdashery/browserify' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/connection' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/dequeue' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/metadata' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/pool_master' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/pool' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/protodef' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/term' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/transform_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/lib/writable_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/long_test/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/long_test/discovery' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/long_test/static' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/long_test/writable_stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/accessing-reql' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/administration' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/aggregation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/backtrace' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/client-backtrace' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/config' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/control-structures' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/coverage' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/cursor' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/dates-and-times' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/datum' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/dequeue' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/document-manipulation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/extra' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/geo' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/joins' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/manipulating-databases' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/manipulating-tables' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/math-and-logic' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/multiple-require' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/nodeify' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/pool_legacy' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/selecting-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/stable' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/string-manipulation' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/transform-stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/transformations' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/common' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/database' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/document' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/error' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/group' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/protodef' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/query' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/sequence' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/util/fake_server/table' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/writable-stream' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/test/writing-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/tool/generateTest' {\n  declare module.exports: any;\n}\n\ndeclare module 'rethinkhaberdashery/tool/ulimit' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rethinkhaberdashery/browserify.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/browserify'>;\n}\ndeclare module 'rethinkhaberdashery/lib/connection.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/connection'>;\n}\ndeclare module 'rethinkhaberdashery/lib/cursor.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/cursor'>;\n}\ndeclare module 'rethinkhaberdashery/lib/dequeue.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/dequeue'>;\n}\ndeclare module 'rethinkhaberdashery/lib/error.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/error'>;\n}\ndeclare module 'rethinkhaberdashery/lib/helper.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/helper'>;\n}\ndeclare module 'rethinkhaberdashery/lib/index.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/index'>;\n}\ndeclare module 'rethinkhaberdashery/lib/metadata.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/metadata'>;\n}\ndeclare module 'rethinkhaberdashery/lib/pool_master.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/pool_master'>;\n}\ndeclare module 'rethinkhaberdashery/lib/pool.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/pool'>;\n}\ndeclare module 'rethinkhaberdashery/lib/protodef.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/protodef'>;\n}\ndeclare module 'rethinkhaberdashery/lib/stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/stream'>;\n}\ndeclare module 'rethinkhaberdashery/lib/term.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/term'>;\n}\ndeclare module 'rethinkhaberdashery/lib/transform_stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/transform_stream'>;\n}\ndeclare module 'rethinkhaberdashery/lib/writable_stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/lib/writable_stream'>;\n}\ndeclare module 'rethinkhaberdashery/long_test/config.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/long_test/config'>;\n}\ndeclare module 'rethinkhaberdashery/long_test/discovery.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/long_test/discovery'>;\n}\ndeclare module 'rethinkhaberdashery/long_test/static.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/long_test/static'>;\n}\ndeclare module 'rethinkhaberdashery/long_test/writable_stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/long_test/writable_stream'>;\n}\ndeclare module 'rethinkhaberdashery/test/accessing-reql.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/accessing-reql'>;\n}\ndeclare module 'rethinkhaberdashery/test/administration.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/administration'>;\n}\ndeclare module 'rethinkhaberdashery/test/aggregation.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/aggregation'>;\n}\ndeclare module 'rethinkhaberdashery/test/backtrace.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/backtrace'>;\n}\ndeclare module 'rethinkhaberdashery/test/client-backtrace.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/client-backtrace'>;\n}\ndeclare module 'rethinkhaberdashery/test/config.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/config'>;\n}\ndeclare module 'rethinkhaberdashery/test/control-structures.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/control-structures'>;\n}\ndeclare module 'rethinkhaberdashery/test/coverage.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/coverage'>;\n}\ndeclare module 'rethinkhaberdashery/test/cursor.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/cursor'>;\n}\ndeclare module 'rethinkhaberdashery/test/dates-and-times.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/dates-and-times'>;\n}\ndeclare module 'rethinkhaberdashery/test/datum.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/datum'>;\n}\ndeclare module 'rethinkhaberdashery/test/dequeue.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/dequeue'>;\n}\ndeclare module 'rethinkhaberdashery/test/document-manipulation.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/document-manipulation'>;\n}\ndeclare module 'rethinkhaberdashery/test/error.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/error'>;\n}\ndeclare module 'rethinkhaberdashery/test/extra.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/extra'>;\n}\ndeclare module 'rethinkhaberdashery/test/geo.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/geo'>;\n}\ndeclare module 'rethinkhaberdashery/test/joins.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/joins'>;\n}\ndeclare module 'rethinkhaberdashery/test/manipulating-databases.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/manipulating-databases'>;\n}\ndeclare module 'rethinkhaberdashery/test/manipulating-tables.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/manipulating-tables'>;\n}\ndeclare module 'rethinkhaberdashery/test/math-and-logic.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/math-and-logic'>;\n}\ndeclare module 'rethinkhaberdashery/test/multiple-require.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/multiple-require'>;\n}\ndeclare module 'rethinkhaberdashery/test/nodeify.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/nodeify'>;\n}\ndeclare module 'rethinkhaberdashery/test/pool_legacy.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/pool_legacy'>;\n}\ndeclare module 'rethinkhaberdashery/test/selecting-data.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/selecting-data'>;\n}\ndeclare module 'rethinkhaberdashery/test/stable.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/stable'>;\n}\ndeclare module 'rethinkhaberdashery/test/stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/stream'>;\n}\ndeclare module 'rethinkhaberdashery/test/string-manipulation.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/string-manipulation'>;\n}\ndeclare module 'rethinkhaberdashery/test/transform-stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/transform-stream'>;\n}\ndeclare module 'rethinkhaberdashery/test/transformations.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/transformations'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/common.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/common'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/database.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/database'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/document.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/document'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/error.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/error'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/group.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/group'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/helper.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/helper'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/index.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/index'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/node.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/node'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/protodef.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/protodef'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/query.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/query'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/selection.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/selection'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/sequence.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/sequence'>;\n}\ndeclare module 'rethinkhaberdashery/test/util/fake_server/table.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/util/fake_server/table'>;\n}\ndeclare module 'rethinkhaberdashery/test/writable-stream.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/writable-stream'>;\n}\ndeclare module 'rethinkhaberdashery/test/writing-data.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/test/writing-data'>;\n}\ndeclare module 'rethinkhaberdashery/tool/generateTest.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/tool/generateTest'>;\n}\ndeclare module 'rethinkhaberdashery/tool/ulimit.js' {\n  declare module.exports: $Exports<'rethinkhaberdashery/tool/ulimit'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/rimraf_v2.x.x.js",
    "content": "// flow-typed signature: 1dff23447d5e18f5ac2b05aaec7cfb74\n// flow-typed version: a453e98ea2/rimraf_v2.x.x/flow_>=v0.25.0\n\ndeclare module 'rimraf' {\n  declare type Options = {\n\t  maxBusyTries?: number,\n\t  emfileWait?: number,\n\t  glob?: boolean,\n\t  disableGlob?: boolean\n  };\n  \n  declare type Callback = (err: ?Error, path: ?string) => void;\n\n  declare module.exports: {\n    (f: string, opts?: Options | Callback, callback?: Callback): void;\n    sync(path: string, opts?: Options): void;\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/rimraf_vx.x.x.js",
    "content": "// flow-typed signature: f10cd949018dd037d8804460e06c78e6\n// flow-typed version: <<STUB>>/rimraf_v^2.6.1/flow_v0.55.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'rimraf'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'rimraf' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'rimraf/bin' {\n  declare module.exports: any;\n}\n\ndeclare module 'rimraf/rimraf' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'rimraf/bin.js' {\n  declare module.exports: $Exports<'rimraf/bin'>;\n}\ndeclare module 'rimraf/rimraf.js' {\n  declare module.exports: $Exports<'rimraf/rimraf'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/sanitize-filename_vx.x.x.js",
    "content": "// flow-typed signature: caab09a417f5e378fe417ec757b5b726\n// flow-typed version: <<STUB>>/sanitize-filename_v1.6.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'sanitize-filename'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'sanitize-filename' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'sanitize-filename/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'sanitize-filename/index' {\n  declare module.exports: $Exports<'sanitize-filename'>;\n}\ndeclare module 'sanitize-filename/index.js' {\n  declare module.exports: $Exports<'sanitize-filename'>;\n}\ndeclare module 'sanitize-filename/test.js' {\n  declare module.exports: $Exports<'sanitize-filename/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/sentry-expo_vx.x.x.js",
    "content": "// flow-typed signature: 25940cfb9401c1fbcc661adf692edf15\n// flow-typed version: <<STUB>>/sentry-expo_v1.7.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'sentry-expo'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'sentry-expo' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/serialize-javascript_vx.x.x.js",
    "content": "// flow-typed signature: 8596fa08aad183914896cd8a23186134\n// flow-typed version: <<STUB>>/serialize-javascript_v^1.4.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'serialize-javascript'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'serialize-javascript' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'serialize-javascript/index' {\n  declare module.exports: $Exports<'serialize-javascript'>;\n}\ndeclare module 'serialize-javascript/index.js' {\n  declare module.exports: $Exports<'serialize-javascript'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/session-rethinkdb_vx.x.x.js",
    "content": "// flow-typed signature: 508b832f69a2878b99856fe42fa098ee\n// flow-typed version: <<STUB>>/session-rethinkdb_v^2.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'session-rethinkdb'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'session-rethinkdb' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\n\n\n// Filename aliases\ndeclare module 'session-rethinkdb/index' {\n  declare module.exports: $Exports<'session-rethinkdb'>;\n}\ndeclare module 'session-rethinkdb/index.js' {\n  declare module.exports: $Exports<'session-rethinkdb'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/sha1_vx.x.x.js",
    "content": "// flow-typed signature: 25c9e66214b761887c569c0570c603df\n// flow-typed version: <<STUB>>/sha1_v1.1.1/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'sha1'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'sha1' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'sha1/sha1' {\n  declare module.exports: any;\n}\n\ndeclare module 'sha1/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'sha1/sha1.js' {\n  declare module.exports: $Exports<'sha1/sha1'>;\n}\ndeclare module 'sha1/test.js' {\n  declare module.exports: $Exports<'sha1/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/shortid_vx.x.x.js",
    "content": "// flow-typed signature: 7b3061d921714787fed00295ae4e0433\n// flow-typed version: <<STUB>>/shortid_v2.2.8/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'shortid'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'shortid' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'shortid/lib/alphabet' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/build' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/decode' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/encode' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/is-valid' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/random/random-byte-browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/random/random-byte' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/random/random-from-seed' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/util/cluster-worker-id-browser' {\n  declare module.exports: any;\n}\n\ndeclare module 'shortid/lib/util/cluster-worker-id' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'shortid/index' {\n  declare module.exports: $Exports<'shortid'>;\n}\ndeclare module 'shortid/index.js' {\n  declare module.exports: $Exports<'shortid'>;\n}\ndeclare module 'shortid/lib/alphabet.js' {\n  declare module.exports: $Exports<'shortid/lib/alphabet'>;\n}\ndeclare module 'shortid/lib/build.js' {\n  declare module.exports: $Exports<'shortid/lib/build'>;\n}\ndeclare module 'shortid/lib/decode.js' {\n  declare module.exports: $Exports<'shortid/lib/decode'>;\n}\ndeclare module 'shortid/lib/encode.js' {\n  declare module.exports: $Exports<'shortid/lib/encode'>;\n}\ndeclare module 'shortid/lib/index.js' {\n  declare module.exports: $Exports<'shortid/lib/index'>;\n}\ndeclare module 'shortid/lib/is-valid.js' {\n  declare module.exports: $Exports<'shortid/lib/is-valid'>;\n}\ndeclare module 'shortid/lib/random/random-byte-browser.js' {\n  declare module.exports: $Exports<'shortid/lib/random/random-byte-browser'>;\n}\ndeclare module 'shortid/lib/random/random-byte.js' {\n  declare module.exports: $Exports<'shortid/lib/random/random-byte'>;\n}\ndeclare module 'shortid/lib/random/random-from-seed.js' {\n  declare module.exports: $Exports<'shortid/lib/random/random-from-seed'>;\n}\ndeclare module 'shortid/lib/util/cluster-worker-id-browser.js' {\n  declare module.exports: $Exports<'shortid/lib/util/cluster-worker-id-browser'>;\n}\ndeclare module 'shortid/lib/util/cluster-worker-id.js' {\n  declare module.exports: $Exports<'shortid/lib/util/cluster-worker-id'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/slate-markdown_vx.x.x.js",
    "content": "// flow-typed signature: 3e0ed268997f2517d804a88a75bb20bd\n// flow-typed version: <<STUB>>/slate-markdown_v0.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'slate-markdown'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'slate-markdown' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'slate-markdown/dist/components' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/dist/decorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/example/src/App' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/example/src/global-styles' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/example/src/Heading' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/example/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-polyfill_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-env_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-es2015_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-react_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-stage-2_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/eslint-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/husky_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/prettier_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/flow-typed/npm/rimraf_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/src/components' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/src/decorator' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate-markdown/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'slate-markdown/dist/components.js' {\n  declare module.exports: $Exports<'slate-markdown/dist/components'>;\n}\ndeclare module 'slate-markdown/dist/decorator.js' {\n  declare module.exports: $Exports<'slate-markdown/dist/decorator'>;\n}\ndeclare module 'slate-markdown/dist/index.js' {\n  declare module.exports: $Exports<'slate-markdown/dist/index'>;\n}\ndeclare module 'slate-markdown/example/src/App.js' {\n  declare module.exports: $Exports<'slate-markdown/example/src/App'>;\n}\ndeclare module 'slate-markdown/example/src/global-styles.js' {\n  declare module.exports: $Exports<'slate-markdown/example/src/global-styles'>;\n}\ndeclare module 'slate-markdown/example/src/Heading.js' {\n  declare module.exports: $Exports<'slate-markdown/example/src/Heading'>;\n}\ndeclare module 'slate-markdown/example/src/index.js' {\n  declare module.exports: $Exports<'slate-markdown/example/src/index'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-plugin-transform-runtime_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-polyfill_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-polyfill_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-env_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-preset-env_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-es2015_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-preset-es2015_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-preset-flow_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-react_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-preset-react_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/babel-preset-stage-2_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/babel-preset-stage-2_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/eslint-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/eslint-plugin-babel_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/husky_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/husky_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/prettier_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/prettier_vx.x.x'>;\n}\ndeclare module 'slate-markdown/flow-typed/npm/rimraf_vx.x.x.js' {\n  declare module.exports: $Exports<'slate-markdown/flow-typed/npm/rimraf_vx.x.x'>;\n}\ndeclare module 'slate-markdown/src/components.js' {\n  declare module.exports: $Exports<'slate-markdown/src/components'>;\n}\ndeclare module 'slate-markdown/src/decorator.js' {\n  declare module.exports: $Exports<'slate-markdown/src/decorator'>;\n}\ndeclare module 'slate-markdown/src/index.js' {\n  declare module.exports: $Exports<'slate-markdown/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/slate_vx.x.x.js",
    "content": "// flow-typed signature: 8cbd83e893b77470f332f6d4678a0ee3\n// flow-typed version: <<STUB>>/slate_v^0.20.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'slate'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'slate' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'slate/dist/slate' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/dist/slate.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/content' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/editor' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/leaf' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/placeholder' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/components/void' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/constants/environment' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/constants/is-dev' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/constants/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/block' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/character' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/data' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/document' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/history' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/inline' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/mark' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/range' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/schema' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/stack' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/state' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/text' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/models/transform' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/ot/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/ot/transform' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/plugins/core' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/schemas/core' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/serializers/base-64' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/serializers/html' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/serializers/plain' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/serializers/raw' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/apply-operation' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/at-current-range' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/at-range' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/by-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/call' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/is-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/normalize' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/on-history' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/on-selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/transforms/operations' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/apply-operation' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/extend-selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/find-closest-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/find-deepest-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/find-dom-node' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/generate-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/get-point' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/get-transfer-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/is-in-range' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/is-react-component' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/memoize' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/noop' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/normalize-node-and-offset' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/normalize' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/offset-key' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/scroll-to-selection' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/set-transfer-data' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/string' {\n  declare module.exports: any;\n}\n\ndeclare module 'slate/lib/utils/warn' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'slate/dist/slate.js' {\n  declare module.exports: $Exports<'slate/dist/slate'>;\n}\ndeclare module 'slate/dist/slate.min.js' {\n  declare module.exports: $Exports<'slate/dist/slate.min'>;\n}\ndeclare module 'slate/lib/components/content.js' {\n  declare module.exports: $Exports<'slate/lib/components/content'>;\n}\ndeclare module 'slate/lib/components/editor.js' {\n  declare module.exports: $Exports<'slate/lib/components/editor'>;\n}\ndeclare module 'slate/lib/components/leaf.js' {\n  declare module.exports: $Exports<'slate/lib/components/leaf'>;\n}\ndeclare module 'slate/lib/components/node.js' {\n  declare module.exports: $Exports<'slate/lib/components/node'>;\n}\ndeclare module 'slate/lib/components/placeholder.js' {\n  declare module.exports: $Exports<'slate/lib/components/placeholder'>;\n}\ndeclare module 'slate/lib/components/void.js' {\n  declare module.exports: $Exports<'slate/lib/components/void'>;\n}\ndeclare module 'slate/lib/constants/environment.js' {\n  declare module.exports: $Exports<'slate/lib/constants/environment'>;\n}\ndeclare module 'slate/lib/constants/is-dev.js' {\n  declare module.exports: $Exports<'slate/lib/constants/is-dev'>;\n}\ndeclare module 'slate/lib/constants/types.js' {\n  declare module.exports: $Exports<'slate/lib/constants/types'>;\n}\ndeclare module 'slate/lib/index.js' {\n  declare module.exports: $Exports<'slate/lib/index'>;\n}\ndeclare module 'slate/lib/models/block.js' {\n  declare module.exports: $Exports<'slate/lib/models/block'>;\n}\ndeclare module 'slate/lib/models/character.js' {\n  declare module.exports: $Exports<'slate/lib/models/character'>;\n}\ndeclare module 'slate/lib/models/data.js' {\n  declare module.exports: $Exports<'slate/lib/models/data'>;\n}\ndeclare module 'slate/lib/models/document.js' {\n  declare module.exports: $Exports<'slate/lib/models/document'>;\n}\ndeclare module 'slate/lib/models/history.js' {\n  declare module.exports: $Exports<'slate/lib/models/history'>;\n}\ndeclare module 'slate/lib/models/inline.js' {\n  declare module.exports: $Exports<'slate/lib/models/inline'>;\n}\ndeclare module 'slate/lib/models/mark.js' {\n  declare module.exports: $Exports<'slate/lib/models/mark'>;\n}\ndeclare module 'slate/lib/models/node.js' {\n  declare module.exports: $Exports<'slate/lib/models/node'>;\n}\ndeclare module 'slate/lib/models/range.js' {\n  declare module.exports: $Exports<'slate/lib/models/range'>;\n}\ndeclare module 'slate/lib/models/schema.js' {\n  declare module.exports: $Exports<'slate/lib/models/schema'>;\n}\ndeclare module 'slate/lib/models/selection.js' {\n  declare module.exports: $Exports<'slate/lib/models/selection'>;\n}\ndeclare module 'slate/lib/models/stack.js' {\n  declare module.exports: $Exports<'slate/lib/models/stack'>;\n}\ndeclare module 'slate/lib/models/state.js' {\n  declare module.exports: $Exports<'slate/lib/models/state'>;\n}\ndeclare module 'slate/lib/models/text.js' {\n  declare module.exports: $Exports<'slate/lib/models/text'>;\n}\ndeclare module 'slate/lib/models/transform.js' {\n  declare module.exports: $Exports<'slate/lib/models/transform'>;\n}\ndeclare module 'slate/lib/ot/index.js' {\n  declare module.exports: $Exports<'slate/lib/ot/index'>;\n}\ndeclare module 'slate/lib/ot/transform.js' {\n  declare module.exports: $Exports<'slate/lib/ot/transform'>;\n}\ndeclare module 'slate/lib/plugins/core.js' {\n  declare module.exports: $Exports<'slate/lib/plugins/core'>;\n}\ndeclare module 'slate/lib/schemas/core.js' {\n  declare module.exports: $Exports<'slate/lib/schemas/core'>;\n}\ndeclare module 'slate/lib/serializers/base-64.js' {\n  declare module.exports: $Exports<'slate/lib/serializers/base-64'>;\n}\ndeclare module 'slate/lib/serializers/html.js' {\n  declare module.exports: $Exports<'slate/lib/serializers/html'>;\n}\ndeclare module 'slate/lib/serializers/plain.js' {\n  declare module.exports: $Exports<'slate/lib/serializers/plain'>;\n}\ndeclare module 'slate/lib/serializers/raw.js' {\n  declare module.exports: $Exports<'slate/lib/serializers/raw'>;\n}\ndeclare module 'slate/lib/transforms/apply-operation.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/apply-operation'>;\n}\ndeclare module 'slate/lib/transforms/at-current-range.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/at-current-range'>;\n}\ndeclare module 'slate/lib/transforms/at-range.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/at-range'>;\n}\ndeclare module 'slate/lib/transforms/by-key.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/by-key'>;\n}\ndeclare module 'slate/lib/transforms/call.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/call'>;\n}\ndeclare module 'slate/lib/transforms/index.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/index'>;\n}\ndeclare module 'slate/lib/transforms/is-native.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/is-native'>;\n}\ndeclare module 'slate/lib/transforms/normalize.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/normalize'>;\n}\ndeclare module 'slate/lib/transforms/on-history.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/on-history'>;\n}\ndeclare module 'slate/lib/transforms/on-selection.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/on-selection'>;\n}\ndeclare module 'slate/lib/transforms/operations.js' {\n  declare module.exports: $Exports<'slate/lib/transforms/operations'>;\n}\ndeclare module 'slate/lib/utils/apply-operation.js' {\n  declare module.exports: $Exports<'slate/lib/utils/apply-operation'>;\n}\ndeclare module 'slate/lib/utils/extend-selection.js' {\n  declare module.exports: $Exports<'slate/lib/utils/extend-selection'>;\n}\ndeclare module 'slate/lib/utils/find-closest-node.js' {\n  declare module.exports: $Exports<'slate/lib/utils/find-closest-node'>;\n}\ndeclare module 'slate/lib/utils/find-deepest-node.js' {\n  declare module.exports: $Exports<'slate/lib/utils/find-deepest-node'>;\n}\ndeclare module 'slate/lib/utils/find-dom-node.js' {\n  declare module.exports: $Exports<'slate/lib/utils/find-dom-node'>;\n}\ndeclare module 'slate/lib/utils/generate-key.js' {\n  declare module.exports: $Exports<'slate/lib/utils/generate-key'>;\n}\ndeclare module 'slate/lib/utils/get-point.js' {\n  declare module.exports: $Exports<'slate/lib/utils/get-point'>;\n}\ndeclare module 'slate/lib/utils/get-transfer-data.js' {\n  declare module.exports: $Exports<'slate/lib/utils/get-transfer-data'>;\n}\ndeclare module 'slate/lib/utils/is-in-range.js' {\n  declare module.exports: $Exports<'slate/lib/utils/is-in-range'>;\n}\ndeclare module 'slate/lib/utils/is-react-component.js' {\n  declare module.exports: $Exports<'slate/lib/utils/is-react-component'>;\n}\ndeclare module 'slate/lib/utils/memoize.js' {\n  declare module.exports: $Exports<'slate/lib/utils/memoize'>;\n}\ndeclare module 'slate/lib/utils/noop.js' {\n  declare module.exports: $Exports<'slate/lib/utils/noop'>;\n}\ndeclare module 'slate/lib/utils/normalize-node-and-offset.js' {\n  declare module.exports: $Exports<'slate/lib/utils/normalize-node-and-offset'>;\n}\ndeclare module 'slate/lib/utils/normalize.js' {\n  declare module.exports: $Exports<'slate/lib/utils/normalize'>;\n}\ndeclare module 'slate/lib/utils/offset-key.js' {\n  declare module.exports: $Exports<'slate/lib/utils/offset-key'>;\n}\ndeclare module 'slate/lib/utils/scroll-to-selection.js' {\n  declare module.exports: $Exports<'slate/lib/utils/scroll-to-selection'>;\n}\ndeclare module 'slate/lib/utils/set-transfer-data.js' {\n  declare module.exports: $Exports<'slate/lib/utils/set-transfer-data'>;\n}\ndeclare module 'slate/lib/utils/string.js' {\n  declare module.exports: $Exports<'slate/lib/utils/string'>;\n}\ndeclare module 'slate/lib/utils/warn.js' {\n  declare module.exports: $Exports<'slate/lib/utils/warn'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/slugg_vx.x.x.js",
    "content": "// flow-typed signature: 8660b67d17e423e24e0530c755914a76\n// flow-typed version: <<STUB>>/slugg_v^1.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'slugg'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'slugg' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'slugg/slugg' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'slugg/slugg.js' {\n  declare module.exports: $Exports<'slugg/slugg'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/snarkdown_vx.x.x.js",
    "content": "// flow-typed signature: 8f063755e65f032485439ac4cefffded\n// flow-typed version: <<STUB>>/snarkdown_vx.x.x/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'snarkdown'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'snarkdown' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'snarkdown/dist/snarkdown.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'snarkdown/dist/snarkdown' {\n  declare module.exports: any;\n}\n\ndeclare module 'snarkdown/dist/snarkdown.umd' {\n  declare module.exports: any;\n}\n\ndeclare module 'snarkdown/src/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'snarkdown/dist/snarkdown.es.js' {\n  declare module.exports: $Exports<'snarkdown/dist/snarkdown.es'>;\n}\ndeclare module 'snarkdown/dist/snarkdown.js' {\n  declare module.exports: $Exports<'snarkdown/dist/snarkdown'>;\n}\ndeclare module 'snarkdown/dist/snarkdown.umd.js' {\n  declare module.exports: $Exports<'snarkdown/dist/snarkdown.umd'>;\n}\ndeclare module 'snarkdown/src/index.js' {\n  declare module.exports: $Exports<'snarkdown/src/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/stopword_vx.x.x.js",
    "content": "// flow-typed signature: 5cd3cc2371118d61441b7ce1ddbc3b85\n// flow-typed version: <<STUB>>/stopword_v^0.1.9/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'stopword'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'stopword' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'stopword/lib/stopword' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_ar' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_bn' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_br' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_da' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_de' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_en' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_es' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_fa' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_fr' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_hi' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_it' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_ja' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_nl' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_no' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_pl' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_pt' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_ru' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_sv' {\n  declare module.exports: any;\n}\n\ndeclare module 'stopword/lib/stopwords_zh' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'stopword/lib/stopword.js' {\n  declare module.exports: $Exports<'stopword/lib/stopword'>;\n}\ndeclare module 'stopword/lib/stopwords_ar.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_ar'>;\n}\ndeclare module 'stopword/lib/stopwords_bn.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_bn'>;\n}\ndeclare module 'stopword/lib/stopwords_br.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_br'>;\n}\ndeclare module 'stopword/lib/stopwords_da.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_da'>;\n}\ndeclare module 'stopword/lib/stopwords_de.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_de'>;\n}\ndeclare module 'stopword/lib/stopwords_en.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_en'>;\n}\ndeclare module 'stopword/lib/stopwords_es.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_es'>;\n}\ndeclare module 'stopword/lib/stopwords_fa.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_fa'>;\n}\ndeclare module 'stopword/lib/stopwords_fr.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_fr'>;\n}\ndeclare module 'stopword/lib/stopwords_hi.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_hi'>;\n}\ndeclare module 'stopword/lib/stopwords_it.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_it'>;\n}\ndeclare module 'stopword/lib/stopwords_ja.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_ja'>;\n}\ndeclare module 'stopword/lib/stopwords_nl.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_nl'>;\n}\ndeclare module 'stopword/lib/stopwords_no.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_no'>;\n}\ndeclare module 'stopword/lib/stopwords_pl.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_pl'>;\n}\ndeclare module 'stopword/lib/stopwords_pt.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_pt'>;\n}\ndeclare module 'stopword/lib/stopwords_ru.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_ru'>;\n}\ndeclare module 'stopword/lib/stopwords_sv.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_sv'>;\n}\ndeclare module 'stopword/lib/stopwords_zh.js' {\n  declare module.exports: $Exports<'stopword/lib/stopwords_zh'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/string-replace-to-array_vx.x.x.js",
    "content": "// flow-typed signature: cb2476c834aadba963f8d00a8aca9dc9\n// flow-typed version: <<STUB>>/string-replace-to-array_v^1.0.3/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'string-replace-to-array'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'string-replace-to-array' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'string-replace-to-array/string-replace-to-array' {\n  declare module.exports: any;\n}\n\ndeclare module 'string-replace-to-array/test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'string-replace-to-array/string-replace-to-array.js' {\n  declare module.exports: $Exports<'string-replace-to-array/string-replace-to-array'>;\n}\ndeclare module 'string-replace-to-array/test.js' {\n  declare module.exports: $Exports<'string-replace-to-array/test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/string-similarity_vx.x.x.js",
    "content": "// flow-typed signature: 68358bc2bb6add3943d67e0592a63d74\n// flow-typed version: <<STUB>>/string-similarity_v1.2.0/flow_v0.66.0\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'string-similarity'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'string-similarity' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'string-similarity/compare-strings' {\n  declare module.exports: any;\n}\n\ndeclare module 'string-similarity/compare-strings.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'string-similarity/gulpfile' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'string-similarity/compare-strings.js' {\n  declare module.exports: $Exports<'string-similarity/compare-strings'>;\n}\ndeclare module 'string-similarity/compare-strings.spec.js' {\n  declare module.exports: $Exports<'string-similarity/compare-strings.spec'>;\n}\ndeclare module 'string-similarity/gulpfile.js' {\n  declare module.exports: $Exports<'string-similarity/gulpfile'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/stripe_vx.x.x.js",
    "content": "// flow-typed signature: 1af86b7488831c23890ae26878a08080\n// flow-typed version: <<STUB>>/stripe_v^4.15.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'stripe'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'stripe' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'stripe/examples/webhook-signing/express' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/Error' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/MultipartDataGenerator' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Accounts' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/ApplePayDomains' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/ApplicationFeeRefunds' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/ApplicationFees' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Balance' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/BitcoinReceivers' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/ChargeRefunds' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Charges' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/CountrySpecs' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Coupons' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/CustomerCards' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Customers' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/CustomerSubscriptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Disputes' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/EphemeralKeys' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Events' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/FileUploads' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/InvoiceItems' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Invoices' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/LoginLinks' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/OrderReturns' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Orders' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Payouts' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Plans' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Products' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/RecipientCards' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Recipients' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Refunds' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/SKUs' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Sources' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/SubscriptionItems' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Subscriptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/ThreeDSecure' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Tokens' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/TransferReversals' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/resources/Transfers' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/stripe' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/StripeMethod.basic' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/StripeMethod' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/StripeResource' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/lib/Webhooks' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/Error.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/flows.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Account.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/ApplePayDomains.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/ApplicationFeeRefunds.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/ApplicationFees.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Balance.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/BitcoinReceivers.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/ChargeRefunds.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Charges.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/CountrySpecs.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Coupons.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/CustomerCards.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Customers.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/CustomerSubscriptions.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Disputes.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/EphemeralKeys.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Events.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/FileUploads.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/InvoiceItems.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Invoices.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/LoginLinks.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/OrderReturns.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Orders.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Payouts.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Plans.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Products.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/RecipientCards.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Recipients.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Refunds.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/SKUs.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Sources.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/SubscriptionItems.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Subscriptions.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/ThreeDSecure.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Tokens.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/TransferReversals.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/resources/Transfers.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/stripe.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/StripeResource.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/testUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/utils.spec' {\n  declare module.exports: any;\n}\n\ndeclare module 'stripe/test/Webhook.spec' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'stripe/examples/webhook-signing/express.js' {\n  declare module.exports: $Exports<'stripe/examples/webhook-signing/express'>;\n}\ndeclare module 'stripe/lib/Error.js' {\n  declare module.exports: $Exports<'stripe/lib/Error'>;\n}\ndeclare module 'stripe/lib/MultipartDataGenerator.js' {\n  declare module.exports: $Exports<'stripe/lib/MultipartDataGenerator'>;\n}\ndeclare module 'stripe/lib/resources/Accounts.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Accounts'>;\n}\ndeclare module 'stripe/lib/resources/ApplePayDomains.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/ApplePayDomains'>;\n}\ndeclare module 'stripe/lib/resources/ApplicationFeeRefunds.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/ApplicationFeeRefunds'>;\n}\ndeclare module 'stripe/lib/resources/ApplicationFees.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/ApplicationFees'>;\n}\ndeclare module 'stripe/lib/resources/Balance.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Balance'>;\n}\ndeclare module 'stripe/lib/resources/BitcoinReceivers.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/BitcoinReceivers'>;\n}\ndeclare module 'stripe/lib/resources/ChargeRefunds.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/ChargeRefunds'>;\n}\ndeclare module 'stripe/lib/resources/Charges.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Charges'>;\n}\ndeclare module 'stripe/lib/resources/CountrySpecs.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/CountrySpecs'>;\n}\ndeclare module 'stripe/lib/resources/Coupons.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Coupons'>;\n}\ndeclare module 'stripe/lib/resources/CustomerCards.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/CustomerCards'>;\n}\ndeclare module 'stripe/lib/resources/Customers.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Customers'>;\n}\ndeclare module 'stripe/lib/resources/CustomerSubscriptions.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/CustomerSubscriptions'>;\n}\ndeclare module 'stripe/lib/resources/Disputes.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Disputes'>;\n}\ndeclare module 'stripe/lib/resources/EphemeralKeys.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/EphemeralKeys'>;\n}\ndeclare module 'stripe/lib/resources/Events.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Events'>;\n}\ndeclare module 'stripe/lib/resources/FileUploads.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/FileUploads'>;\n}\ndeclare module 'stripe/lib/resources/InvoiceItems.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/InvoiceItems'>;\n}\ndeclare module 'stripe/lib/resources/Invoices.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Invoices'>;\n}\ndeclare module 'stripe/lib/resources/LoginLinks.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/LoginLinks'>;\n}\ndeclare module 'stripe/lib/resources/OrderReturns.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/OrderReturns'>;\n}\ndeclare module 'stripe/lib/resources/Orders.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Orders'>;\n}\ndeclare module 'stripe/lib/resources/Payouts.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Payouts'>;\n}\ndeclare module 'stripe/lib/resources/Plans.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Plans'>;\n}\ndeclare module 'stripe/lib/resources/Products.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Products'>;\n}\ndeclare module 'stripe/lib/resources/RecipientCards.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/RecipientCards'>;\n}\ndeclare module 'stripe/lib/resources/Recipients.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Recipients'>;\n}\ndeclare module 'stripe/lib/resources/Refunds.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Refunds'>;\n}\ndeclare module 'stripe/lib/resources/SKUs.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/SKUs'>;\n}\ndeclare module 'stripe/lib/resources/Sources.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Sources'>;\n}\ndeclare module 'stripe/lib/resources/SubscriptionItems.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/SubscriptionItems'>;\n}\ndeclare module 'stripe/lib/resources/Subscriptions.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Subscriptions'>;\n}\ndeclare module 'stripe/lib/resources/ThreeDSecure.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/ThreeDSecure'>;\n}\ndeclare module 'stripe/lib/resources/Tokens.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Tokens'>;\n}\ndeclare module 'stripe/lib/resources/TransferReversals.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/TransferReversals'>;\n}\ndeclare module 'stripe/lib/resources/Transfers.js' {\n  declare module.exports: $Exports<'stripe/lib/resources/Transfers'>;\n}\ndeclare module 'stripe/lib/stripe.js' {\n  declare module.exports: $Exports<'stripe/lib/stripe'>;\n}\ndeclare module 'stripe/lib/StripeMethod.basic.js' {\n  declare module.exports: $Exports<'stripe/lib/StripeMethod.basic'>;\n}\ndeclare module 'stripe/lib/StripeMethod.js' {\n  declare module.exports: $Exports<'stripe/lib/StripeMethod'>;\n}\ndeclare module 'stripe/lib/StripeResource.js' {\n  declare module.exports: $Exports<'stripe/lib/StripeResource'>;\n}\ndeclare module 'stripe/lib/utils.js' {\n  declare module.exports: $Exports<'stripe/lib/utils'>;\n}\ndeclare module 'stripe/lib/Webhooks.js' {\n  declare module.exports: $Exports<'stripe/lib/Webhooks'>;\n}\ndeclare module 'stripe/test.js' {\n  declare module.exports: $Exports<'stripe/test'>;\n}\ndeclare module 'stripe/test/Error.spec.js' {\n  declare module.exports: $Exports<'stripe/test/Error.spec'>;\n}\ndeclare module 'stripe/test/flows.spec.js' {\n  declare module.exports: $Exports<'stripe/test/flows.spec'>;\n}\ndeclare module 'stripe/test/resources/Account.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Account.spec'>;\n}\ndeclare module 'stripe/test/resources/ApplePayDomains.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/ApplePayDomains.spec'>;\n}\ndeclare module 'stripe/test/resources/ApplicationFeeRefunds.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/ApplicationFeeRefunds.spec'>;\n}\ndeclare module 'stripe/test/resources/ApplicationFees.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/ApplicationFees.spec'>;\n}\ndeclare module 'stripe/test/resources/Balance.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Balance.spec'>;\n}\ndeclare module 'stripe/test/resources/BitcoinReceivers.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/BitcoinReceivers.spec'>;\n}\ndeclare module 'stripe/test/resources/ChargeRefunds.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/ChargeRefunds.spec'>;\n}\ndeclare module 'stripe/test/resources/Charges.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Charges.spec'>;\n}\ndeclare module 'stripe/test/resources/CountrySpecs.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/CountrySpecs.spec'>;\n}\ndeclare module 'stripe/test/resources/Coupons.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Coupons.spec'>;\n}\ndeclare module 'stripe/test/resources/CustomerCards.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/CustomerCards.spec'>;\n}\ndeclare module 'stripe/test/resources/Customers.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Customers.spec'>;\n}\ndeclare module 'stripe/test/resources/CustomerSubscriptions.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/CustomerSubscriptions.spec'>;\n}\ndeclare module 'stripe/test/resources/Disputes.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Disputes.spec'>;\n}\ndeclare module 'stripe/test/resources/EphemeralKeys.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/EphemeralKeys.spec'>;\n}\ndeclare module 'stripe/test/resources/Events.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Events.spec'>;\n}\ndeclare module 'stripe/test/resources/FileUploads.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/FileUploads.spec'>;\n}\ndeclare module 'stripe/test/resources/InvoiceItems.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/InvoiceItems.spec'>;\n}\ndeclare module 'stripe/test/resources/Invoices.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Invoices.spec'>;\n}\ndeclare module 'stripe/test/resources/LoginLinks.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/LoginLinks.spec'>;\n}\ndeclare module 'stripe/test/resources/OrderReturns.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/OrderReturns.spec'>;\n}\ndeclare module 'stripe/test/resources/Orders.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Orders.spec'>;\n}\ndeclare module 'stripe/test/resources/Payouts.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Payouts.spec'>;\n}\ndeclare module 'stripe/test/resources/Plans.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Plans.spec'>;\n}\ndeclare module 'stripe/test/resources/Products.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Products.spec'>;\n}\ndeclare module 'stripe/test/resources/RecipientCards.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/RecipientCards.spec'>;\n}\ndeclare module 'stripe/test/resources/Recipients.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Recipients.spec'>;\n}\ndeclare module 'stripe/test/resources/Refunds.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Refunds.spec'>;\n}\ndeclare module 'stripe/test/resources/SKUs.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/SKUs.spec'>;\n}\ndeclare module 'stripe/test/resources/Sources.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Sources.spec'>;\n}\ndeclare module 'stripe/test/resources/SubscriptionItems.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/SubscriptionItems.spec'>;\n}\ndeclare module 'stripe/test/resources/Subscriptions.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Subscriptions.spec'>;\n}\ndeclare module 'stripe/test/resources/ThreeDSecure.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/ThreeDSecure.spec'>;\n}\ndeclare module 'stripe/test/resources/Tokens.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Tokens.spec'>;\n}\ndeclare module 'stripe/test/resources/TransferReversals.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/TransferReversals.spec'>;\n}\ndeclare module 'stripe/test/resources/Transfers.spec.js' {\n  declare module.exports: $Exports<'stripe/test/resources/Transfers.spec'>;\n}\ndeclare module 'stripe/test/stripe.spec.js' {\n  declare module.exports: $Exports<'stripe/test/stripe.spec'>;\n}\ndeclare module 'stripe/test/StripeResource.spec.js' {\n  declare module.exports: $Exports<'stripe/test/StripeResource.spec'>;\n}\ndeclare module 'stripe/test/testUtils.js' {\n  declare module.exports: $Exports<'stripe/test/testUtils'>;\n}\ndeclare module 'stripe/test/utils.spec.js' {\n  declare module.exports: $Exports<'stripe/test/utils.spec'>;\n}\ndeclare module 'stripe/test/Webhook.spec.js' {\n  declare module.exports: $Exports<'stripe/test/Webhook.spec'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/striptags_vx.x.x.js",
    "content": "// flow-typed signature: d3ccc8ebc3686acc4929e365d4a25a8f\n// flow-typed version: <<STUB>>/striptags_v2.x/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'striptags'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'striptags' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'striptags/striptags' {\n  declare module.exports: any;\n}\n\ndeclare module 'striptags/test/striptags-test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'striptags/striptags.js' {\n  declare module.exports: $Exports<'striptags/striptags'>;\n}\ndeclare module 'striptags/test/striptags-test.js' {\n  declare module.exports: $Exports<'striptags/test/striptags-test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/styled-components_v2.x.x.js",
    "content": "// flow-typed signature: 2d5d2167b399d10e16ddc719ea6fc62e\n// flow-typed version: 1be5dad600/styled-components_v2.x.x/flow_>=v0.53.x\n\n// @flow\n\ntype $npm$styledComponents$Interpolation =\n  | (<C: {}>(executionContext: C) => string)\n  | string\n  | number;\ntype $npm$styledComponents$NameGenerator = (hash: number) => string;\n\ntype $npm$styledComponents$TaggedTemplateLiteral<R> = {|\n  (Array<string>, $npm$styledComponents$Interpolation): R,\n|};\n\n// ---- FUNCTIONAL COMPONENT DEFINITIONS ----\ntype $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps = *> = {\n  defaultProps: DefaultProps,\n} & $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<Props>;\n\ntype $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n  Props\n> = React$StatelessFunctionalComponent<Props>;\n\n// ---- CLASS COMPONENT DEFINITIONS ----\nclass $npm$styledComponents$ReactComponent<\n  Props,\n  DefaultProps\n> extends React$Component<Props> {\n  static defaultProps: DefaultProps;\n}\ntype $npm$styledComponents$ReactComponentClass<Props, DefaultProps = *> = Class<\n  $npm$styledComponents$ReactComponent<Props, DefaultProps>\n>;\ntype $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<\n  Props\n> = Class<React$Component<Props, *>>;\n\n// ---- COMPONENT FUNCTIONS INPUT (UNION) & OUTPUT (INTERSECTION) ----\ntype $npm$styledComponents$ReactComponentUnion<\n  Props\n> = $npm$styledComponents$ReactComponentUnionWithDefaultProps<Props, *>;\n\ntype $npm$styledComponents$ReactComponentUnionWithDefaultProps<\n  Props,\n  DefaultProps\n> =\n  | $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>\n  | $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<Props>\n  | $npm$styledComponents$ReactComponentClass<Props, DefaultProps>\n  | $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n\ntype $npm$styledComponents$ReactComponentIntersection<\n  Props,\n  DefaultProps = *\n> = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps> &\n  $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n\n// ---- WITHCOMPONENT ----\ntype $npm$styledComponents$ReactComponentStyledWithComponent<ComponentList> = <\n  Props,\n  DefaultProps,\n  Input:\n    | ComponentList\n    | $npm$styledComponents$ReactComponentStyled<Props, DefaultProps>\n    | $npm$styledComponents$ReactComponentUnionWithDefaultProps<\n        Props,\n        DefaultProps\n      >\n>(\n  Input\n) => $npm$styledComponents$ReactComponentStyled<Props, DefaultProps>;\n\n// ---- STATIC PROPERTIES ----\ntype $npm$styledComponents$ReactComponentStyledStaticProps<\n  Props,\n  ComponentList\n> = {|\n  attrs: <AdditionalProps: {}>(\n    AdditionalProps\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props & AdditionalProps,\n    ComponentList\n  >,\n  extend: $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n    ComponentList\n  >,\n|};\n\ntype $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList\n> = {|\n  withComponent: $npm$styledComponents$ReactComponentStyledWithComponent<\n    ComponentList\n  >,\n  attrs: <AdditionalProps: {}>(\n    AdditionalProps\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props & AdditionalProps,\n    ComponentList\n  >,\n  extend: $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    ComponentList\n  >,\n|};\n\n// ---- STYLED FUNCTION ----\n// Error: styled(CustomComponent).withComponent('a')\n// Ok:    styled('div').withComponent('a')\ntype $npm$styledComponents$Call<\n  ComponentListKeys\n> = (ComponentListKeys => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  ComponentListKeys\n>) &\n  (<Props>(\n    $npm$styledComponents$ReactComponentUnion<Props>\n  ) => $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n    Props,\n    ComponentListKeys\n  >);\n\n// ---- STYLED COMPONENT ----\ntype $npm$styledComponents$ReactComponentStyled<\n  Props,\n  ComponentList,\n  DefaultProps = *\n> = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList\n> &\n  $npm$styledComponents$ReactComponentIntersection<Props, DefaultProps>;\n\n// ---- TAGGED TEMPLATE LITERAL ----\ntype $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteral<\n  Props,\n  ComponentList\n> = $npm$styledComponents$ReactComponentStyledStaticProps<\n  Props,\n  ComponentList\n> &\n  $npm$styledComponents$TaggedTemplateLiteral<\n    $npm$styledComponents$ReactComponentStyled<Props, ComponentList>\n  >;\n\ntype $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  Props,\n  ComponentList\n> = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n  Props,\n  ComponentList\n> &\n  $npm$styledComponents$TaggedTemplateLiteral<\n    $npm$styledComponents$ReactComponentStyled<Props, ComponentList>\n  >;\n\n// ---- WITHTHEME ----\ntype $npm$styledComponents$WithThemeReactComponentClass = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  InputDefaultProps: {},\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n  OutputDefaultProps: InputDefaultProps & { theme: $npm$styledComponents$Theme }\n>(\n  $npm$styledComponents$ReactComponentClass<InputProps, InputDefaultProps>\n) => $npm$styledComponents$ReactComponentClass<OutputProps, OutputDefaultProps>;\n\ntype $npm$styledComponents$WithThemeReactComponentClassUndefinedDefaultProps = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>\n>(\n  $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<InputProps>\n) => $npm$styledComponents$ReactComponentClass<\n  OutputProps,\n  { theme: $npm$styledComponents$Theme }\n>;\n\ntype $npm$styledComponents$WithThemeReactComponentFunctional = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  InputDefaultProps: {},\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>,\n  OutputDefaultProps: InputDefaultProps & { theme: $npm$styledComponents$Theme }\n>(\n  $npm$styledComponents$ReactComponentFunctional<InputProps, InputDefaultProps>\n) => $npm$styledComponents$ReactComponentFunctional<\n  OutputProps,\n  OutputDefaultProps\n>;\n\ntype $npm$styledComponents$WithThemeReactComponentFunctionalUndefinedDefaultProps = <\n  InputProps: { theme: $npm$styledComponents$Theme },\n  OutputProps: $Diff<InputProps, { theme: $npm$styledComponents$Theme }>\n>(\n  $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    InputProps\n  >\n) => $npm$styledComponents$ReactComponentFunctional<\n  OutputProps,\n  { theme: $npm$styledComponents$Theme }\n>;\n\ntype $npm$styledComponents$WithTheme = $npm$styledComponents$WithThemeReactComponentClass &\n  $npm$styledComponents$WithThemeReactComponentClassUndefinedDefaultProps &\n  $npm$styledComponents$WithThemeReactComponentFunctional &\n  $npm$styledComponents$WithThemeReactComponentFunctionalUndefinedDefaultProps;\n\n// ---- MISC ----\ntype $npm$styledComponents$Theme = { [key: string]: mixed };\ntype $npm$styledComponents$ThemeProviderProps = {\n  theme:\n    | $npm$styledComponents$Theme\n    | ((outerTheme: $npm$styledComponents$Theme) => void),\n};\n\nclass Npm$StyledComponents$ThemeProvider extends React$Component<\n  $npm$styledComponents$ThemeProviderProps\n> {}\n\nclass Npm$StyledComponents$StyleSheetManager extends React$Component<{\n  sheet: mixed,\n}> {}\n\nclass Npm$StyledComponents$ServerStyleSheet {\n  instance: StyleSheet;\n  collectStyles: (children: any) => React$Node;\n  getStyleTags: () => string;\n  getStyleElement: () => React$Node;\n}\n\ntype $npm$styledComponents$StyledComponentsComponentListKeys = $Subtype<\n  $Keys<$npm$styledComponents$StyledComponentsComponentList>\n>;\n\ntype $npm$styledComponents$StyledComponentsComponentListValue = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  $npm$styledComponents$StyledComponentsComponentListKeys\n>;\n\n// ---- COMPONENT LIST ----\ntype $npm$styledComponents$StyledComponentsComponentList = {|\n  a: $npm$styledComponents$StyledComponentsComponentListValue,\n  abbr: $npm$styledComponents$StyledComponentsComponentListValue,\n  address: $npm$styledComponents$StyledComponentsComponentListValue,\n  area: $npm$styledComponents$StyledComponentsComponentListValue,\n  article: $npm$styledComponents$StyledComponentsComponentListValue,\n  aside: $npm$styledComponents$StyledComponentsComponentListValue,\n  audio: $npm$styledComponents$StyledComponentsComponentListValue,\n  b: $npm$styledComponents$StyledComponentsComponentListValue,\n  base: $npm$styledComponents$StyledComponentsComponentListValue,\n  bdi: $npm$styledComponents$StyledComponentsComponentListValue,\n  bdo: $npm$styledComponents$StyledComponentsComponentListValue,\n  big: $npm$styledComponents$StyledComponentsComponentListValue,\n  blockquote: $npm$styledComponents$StyledComponentsComponentListValue,\n  body: $npm$styledComponents$StyledComponentsComponentListValue,\n  br: $npm$styledComponents$StyledComponentsComponentListValue,\n  button: $npm$styledComponents$StyledComponentsComponentListValue,\n  canvas: $npm$styledComponents$StyledComponentsComponentListValue,\n  caption: $npm$styledComponents$StyledComponentsComponentListValue,\n  cite: $npm$styledComponents$StyledComponentsComponentListValue,\n  code: $npm$styledComponents$StyledComponentsComponentListValue,\n  col: $npm$styledComponents$StyledComponentsComponentListValue,\n  colgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  data: $npm$styledComponents$StyledComponentsComponentListValue,\n  datalist: $npm$styledComponents$StyledComponentsComponentListValue,\n  dd: $npm$styledComponents$StyledComponentsComponentListValue,\n  del: $npm$styledComponents$StyledComponentsComponentListValue,\n  details: $npm$styledComponents$StyledComponentsComponentListValue,\n  dfn: $npm$styledComponents$StyledComponentsComponentListValue,\n  dialog: $npm$styledComponents$StyledComponentsComponentListValue,\n  div: $npm$styledComponents$StyledComponentsComponentListValue,\n  dl: $npm$styledComponents$StyledComponentsComponentListValue,\n  dt: $npm$styledComponents$StyledComponentsComponentListValue,\n  em: $npm$styledComponents$StyledComponentsComponentListValue,\n  embed: $npm$styledComponents$StyledComponentsComponentListValue,\n  fieldset: $npm$styledComponents$StyledComponentsComponentListValue,\n  figcaption: $npm$styledComponents$StyledComponentsComponentListValue,\n  figure: $npm$styledComponents$StyledComponentsComponentListValue,\n  footer: $npm$styledComponents$StyledComponentsComponentListValue,\n  form: $npm$styledComponents$StyledComponentsComponentListValue,\n  h1: $npm$styledComponents$StyledComponentsComponentListValue,\n  h2: $npm$styledComponents$StyledComponentsComponentListValue,\n  h3: $npm$styledComponents$StyledComponentsComponentListValue,\n  h4: $npm$styledComponents$StyledComponentsComponentListValue,\n  h5: $npm$styledComponents$StyledComponentsComponentListValue,\n  h6: $npm$styledComponents$StyledComponentsComponentListValue,\n  head: $npm$styledComponents$StyledComponentsComponentListValue,\n  header: $npm$styledComponents$StyledComponentsComponentListValue,\n  hgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  hr: $npm$styledComponents$StyledComponentsComponentListValue,\n  html: $npm$styledComponents$StyledComponentsComponentListValue,\n  i: $npm$styledComponents$StyledComponentsComponentListValue,\n  iframe: $npm$styledComponents$StyledComponentsComponentListValue,\n  img: $npm$styledComponents$StyledComponentsComponentListValue,\n  input: $npm$styledComponents$StyledComponentsComponentListValue,\n  ins: $npm$styledComponents$StyledComponentsComponentListValue,\n  kbd: $npm$styledComponents$StyledComponentsComponentListValue,\n  keygen: $npm$styledComponents$StyledComponentsComponentListValue,\n  label: $npm$styledComponents$StyledComponentsComponentListValue,\n  legend: $npm$styledComponents$StyledComponentsComponentListValue,\n  li: $npm$styledComponents$StyledComponentsComponentListValue,\n  link: $npm$styledComponents$StyledComponentsComponentListValue,\n  main: $npm$styledComponents$StyledComponentsComponentListValue,\n  map: $npm$styledComponents$StyledComponentsComponentListValue,\n  mark: $npm$styledComponents$StyledComponentsComponentListValue,\n  menu: $npm$styledComponents$StyledComponentsComponentListValue,\n  menuitem: $npm$styledComponents$StyledComponentsComponentListValue,\n  meta: $npm$styledComponents$StyledComponentsComponentListValue,\n  meter: $npm$styledComponents$StyledComponentsComponentListValue,\n  nav: $npm$styledComponents$StyledComponentsComponentListValue,\n  noscript: $npm$styledComponents$StyledComponentsComponentListValue,\n  object: $npm$styledComponents$StyledComponentsComponentListValue,\n  ol: $npm$styledComponents$StyledComponentsComponentListValue,\n  optgroup: $npm$styledComponents$StyledComponentsComponentListValue,\n  option: $npm$styledComponents$StyledComponentsComponentListValue,\n  output: $npm$styledComponents$StyledComponentsComponentListValue,\n  p: $npm$styledComponents$StyledComponentsComponentListValue,\n  param: $npm$styledComponents$StyledComponentsComponentListValue,\n  picture: $npm$styledComponents$StyledComponentsComponentListValue,\n  pre: $npm$styledComponents$StyledComponentsComponentListValue,\n  progress: $npm$styledComponents$StyledComponentsComponentListValue,\n  q: $npm$styledComponents$StyledComponentsComponentListValue,\n  rp: $npm$styledComponents$StyledComponentsComponentListValue,\n  rt: $npm$styledComponents$StyledComponentsComponentListValue,\n  ruby: $npm$styledComponents$StyledComponentsComponentListValue,\n  s: $npm$styledComponents$StyledComponentsComponentListValue,\n  samp: $npm$styledComponents$StyledComponentsComponentListValue,\n  script: $npm$styledComponents$StyledComponentsComponentListValue,\n  section: $npm$styledComponents$StyledComponentsComponentListValue,\n  select: $npm$styledComponents$StyledComponentsComponentListValue,\n  small: $npm$styledComponents$StyledComponentsComponentListValue,\n  source: $npm$styledComponents$StyledComponentsComponentListValue,\n  span: $npm$styledComponents$StyledComponentsComponentListValue,\n  strong: $npm$styledComponents$StyledComponentsComponentListValue,\n  style: $npm$styledComponents$StyledComponentsComponentListValue,\n  sub: $npm$styledComponents$StyledComponentsComponentListValue,\n  summary: $npm$styledComponents$StyledComponentsComponentListValue,\n  sup: $npm$styledComponents$StyledComponentsComponentListValue,\n  table: $npm$styledComponents$StyledComponentsComponentListValue,\n  tbody: $npm$styledComponents$StyledComponentsComponentListValue,\n  td: $npm$styledComponents$StyledComponentsComponentListValue,\n  textarea: $npm$styledComponents$StyledComponentsComponentListValue,\n  tfoot: $npm$styledComponents$StyledComponentsComponentListValue,\n  th: $npm$styledComponents$StyledComponentsComponentListValue,\n  thead: $npm$styledComponents$StyledComponentsComponentListValue,\n  time: $npm$styledComponents$StyledComponentsComponentListValue,\n  title: $npm$styledComponents$StyledComponentsComponentListValue,\n  tr: $npm$styledComponents$StyledComponentsComponentListValue,\n  track: $npm$styledComponents$StyledComponentsComponentListValue,\n  u: $npm$styledComponents$StyledComponentsComponentListValue,\n  ul: $npm$styledComponents$StyledComponentsComponentListValue,\n  var: $npm$styledComponents$StyledComponentsComponentListValue,\n  video: $npm$styledComponents$StyledComponentsComponentListValue,\n  wbr: $npm$styledComponents$StyledComponentsComponentListValue,\n\n  // SVG\n  circle: $npm$styledComponents$StyledComponentsComponentListValue,\n  clipPath: $npm$styledComponents$StyledComponentsComponentListValue,\n  defs: $npm$styledComponents$StyledComponentsComponentListValue,\n  ellipse: $npm$styledComponents$StyledComponentsComponentListValue,\n  g: $npm$styledComponents$StyledComponentsComponentListValue,\n  image: $npm$styledComponents$StyledComponentsComponentListValue,\n  line: $npm$styledComponents$StyledComponentsComponentListValue,\n  linearGradient: $npm$styledComponents$StyledComponentsComponentListValue,\n  mask: $npm$styledComponents$StyledComponentsComponentListValue,\n  path: $npm$styledComponents$StyledComponentsComponentListValue,\n  pattern: $npm$styledComponents$StyledComponentsComponentListValue,\n  polygon: $npm$styledComponents$StyledComponentsComponentListValue,\n  polyline: $npm$styledComponents$StyledComponentsComponentListValue,\n  radialGradient: $npm$styledComponents$StyledComponentsComponentListValue,\n  rect: $npm$styledComponents$StyledComponentsComponentListValue,\n  stop: $npm$styledComponents$StyledComponentsComponentListValue,\n  svg: $npm$styledComponents$StyledComponentsComponentListValue,\n  text: $npm$styledComponents$StyledComponentsComponentListValue,\n  tspan: $npm$styledComponents$StyledComponentsComponentListValue,\n|};\n\ndeclare module 'styled-components' {\n  declare type Interpolation = $npm$styledComponents$Interpolation;\n  declare type NameGenerator = $npm$styledComponents$NameGenerator;\n  declare type Theme = $npm$styledComponents$Theme;\n  declare type ThemeProviderProps = $npm$styledComponents$ThemeProviderProps;\n  declare type TaggedTemplateLiteral<\n    R\n  > = $npm$styledComponents$TaggedTemplateLiteral<R>;\n  declare type ComponentListKeys = $npm$styledComponents$StyledComponentsComponentListKeys;\n\n  declare type ReactComponentFunctional<\n    Props: {},\n    DefaultProps: ?{} = *\n  > = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>;\n  declare type ReactComponentFunctionalUndefinedDefaultProps<\n    Props: {}\n  > = $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    Props\n  >;\n  declare type ReactComponentClass<\n    Props: {},\n    DefaultProps: ?{} = *\n  > = $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n  declare type ReactComponentClassUndefinedDefaultProps<\n    Props: {}\n  > = $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n  declare type ReactComponentUnion<\n    Props\n  > = $npm$styledComponents$ReactComponentUnion<Props>;\n  declare type ReactComponentIntersection<\n    Props\n  > = $npm$styledComponents$ReactComponentIntersection<Props>;\n  declare type ReactComponentStyledStaticProps<\n    Props\n  > = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n    Props,\n    ComponentListKeys\n  >;\n  declare type ReactComponentStyled<\n    Props\n  > = $npm$styledComponents$ReactComponentStyled<Props, ComponentListKeys>;\n  declare type ReactComponentStyledTaggedTemplateLiteral<\n    Props\n  > = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    ComponentListKeys\n  >;\n\n  declare module.exports: {\n    $call: $npm$styledComponents$Call<ComponentListKeys>,\n\n    injectGlobal: TaggedTemplateLiteral<void>,\n    css: TaggedTemplateLiteral<Array<Interpolation>>,\n    keyframes: TaggedTemplateLiteral<string>,\n    withTheme: $npm$styledComponents$WithTheme,\n    ServerStyleSheet: typeof Npm$StyledComponents$ServerStyleSheet,\n    StyleSheetManager: typeof Npm$StyledComponents$StyleSheetManager,\n    ThemeProvider: typeof Npm$StyledComponents$ThemeProvider,\n\n    ...$npm$styledComponents$StyledComponentsComponentList,\n  };\n}\n\ntype $npm$styledComponents$StyledComponentsNativeComponentListKeys = $Subtype<\n  $Keys<$npm$styledComponents$StyledComponentsNativeComponentList>\n>;\n\ntype $npm$styledComponents$StyledComponentsNativeComponentListValue = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n  {},\n  $npm$styledComponents$StyledComponentsNativeComponentListKeys\n>;\n\ntype $npm$styledComponents$StyledComponentsNativeComponentList = {|\n  ActivityIndicator: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ActivityIndicatorIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ART: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Button: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  DatePickerIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  DrawerLayoutAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  FlatList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Image: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ImageEditor: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ImageStore: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  KeyboardAvoidingView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ListView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  MapView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Modal: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Navigator: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  NavigatorIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Picker: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  PickerIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ProgressBarAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ProgressViewIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  RecyclerViewBackedScrollView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  RefreshControl: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ScrollView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SectionList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SegmentedControlIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Slider: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SliderIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SnapshotViewIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  StatusBar: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwipeableListView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Switch: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwitchAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  SwitchIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TabBarIOS: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Text: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TextInput: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ToastAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ToolbarAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  Touchable: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableHighlight: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableNativeFeedback: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableOpacity: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  TouchableWithoutFeedback: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  View: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  ViewPagerAndroid: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  VirtualizedList: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n  WebView: $npm$styledComponents$StyledComponentsNativeComponentListValue,\n|};\n\ndeclare module 'styled-components/native' {\n  declare type Interpolation = $npm$styledComponents$Interpolation;\n  declare type NameGenerator = $npm$styledComponents$NameGenerator;\n  declare type Theme = $npm$styledComponents$Theme;\n  declare type ThemeProviderProps = $npm$styledComponents$ThemeProviderProps;\n  declare type TaggedTemplateLiteral<\n    R\n  > = $npm$styledComponents$TaggedTemplateLiteral<R>;\n  declare type NativeComponentListKeys = $npm$styledComponents$StyledComponentsNativeComponentListKeys;\n\n  declare type ReactComponentFunctional<\n    Props: {},\n    DefaultProps: ?{} = *\n  > = $npm$styledComponents$ReactComponentFunctional<Props, DefaultProps>;\n  declare type ReactComponentFunctionalUndefinedDefaultProps<\n    Props: {}\n  > = $npm$styledComponents$ReactComponentFunctionalUndefinedDefaultProps<\n    Props\n  >;\n  declare type ReactComponentClass<\n    Props: {},\n    DefaultProps: ?{} = *\n  > = $npm$styledComponents$ReactComponentClass<Props, DefaultProps>;\n  declare type ReactComponentClassUndefinedDefaultProps<\n    Props: {}\n  > = $npm$styledComponents$ReactComponentClassUndefinedDefaultProps<Props>;\n  declare type ReactComponentUnion<\n    Props\n  > = $npm$styledComponents$ReactComponentUnion<Props>;\n  declare type ReactComponentIntersection<\n    Props\n  > = $npm$styledComponents$ReactComponentIntersection<Props>;\n  declare type ReactComponentStyledStaticProps<\n    Props\n  > = $npm$styledComponents$ReactComponentStyledStaticPropsWithComponent<\n    Props,\n    NativeComponentListKeys\n  >;\n  declare type ReactComponentStyled<\n    Props\n  > = $npm$styledComponents$ReactComponentStyled<\n    Props,\n    NativeComponentListKeys\n  >;\n  declare type ReactComponentStyledTaggedTemplateLiteral<\n    Props\n  > = $npm$styledComponents$ReactComponentStyledTaggedTemplateLiteralWithComponent<\n    Props,\n    NativeComponentListKeys\n  >;\n\n  declare module.exports: {\n    $call: $npm$styledComponents$Call<NativeComponentListKeys>,\n\n    css: TaggedTemplateLiteral<Array<Interpolation>>,\n    keyframes: TaggedTemplateLiteral<string>,\n    withTheme: $npm$styledComponents$WithTheme,\n    ThemeProvider: typeof Npm$StyledComponents$ThemeProvider,\n\n    ...$npm$styledComponents$StyledComponentsNativeComponentList,\n  };\n}\n"
  },
  {
    "path": "flow-typed/npm/styled-components_vx.x.x.js",
    "content": "// flow-typed signature: a80ed47d31614ad7002695fe50825783\n// flow-typed version: <<STUB>>/styled-components_v^3.1.6-1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'styled-components'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'styled-components' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'styled-components/dist/styled-components-no-parser.browser.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components-no-parser.browser.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components-no-parser.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components-no-parser.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components-primitives.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components-primitives.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.browser.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.browser.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.es' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.min' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/dist/styled-components.native.cjs' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/danger-plugin-jest_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/enzyme_v3.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/fbjs_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/lodash_v4.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-cli_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-core_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-loader_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-external-helpers_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-flow-react-proptypes_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-class-properties_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-preset-latest_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/babel-preset-react_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/buffer_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/chokidar_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/css-to-react-native_v1.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/css-to-react-native_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-config-airbnb_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-flowtype_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-flowtype-errors_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-import_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-react_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/expect_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/express_v4.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/flow-bin_v0.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/flow-copy-source_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/inline-style-prefixer_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/is-function_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/is-plain-object_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/jest_v19.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/jsdom_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/lint-staged_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/mocha_v2.4.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/mocha_v3.1.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/mocha-jsdom_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/node-watch_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/pre-commit_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/react-addons-test-utils_v15.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-babel_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-commonjs_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-flow_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-inject_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-json_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-replace_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-uglify_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-visualizer_vx.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/npm/supports-color_v3.x.x' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/flow-typed/react-native' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/native/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/constructWithOptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/css' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/injectGlobal' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/keyframes' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/styled' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/test/injectGlobal.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/test/keyframes.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/constructors/test/styled.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/hoc/withTheme' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/BrowserStyleSheet' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/ComponentStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/InlineStyle' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/ServerStyleSheet' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/StyledComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/StyledNativeComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/StyleSheet' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/StyleSheetManager' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/test/ThemeProvider.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/models/ThemeProvider' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/native/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/native/test/native.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/native/test/theme.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/css' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/flatten' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/stringifyRules' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/test/basic.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/test/flatten.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/no-parser/test/keyframes.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/primitives/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/primitives/test/primitives.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/secretInternals' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/attrs.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/basic.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/css.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/enzymeSetup' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/expanded-api.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/extending.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/globals' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/overriding.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/props.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/rehydration.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/ssr.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/staticCaching.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/styles.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/theme.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/utils' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/test/warnTooManyClasses.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/types' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/consolidateStreamedStyles' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/create-broadcast' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/createWarnTooManyClasses' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/determineTheme' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/domElements' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/escape' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/extractCompsFromCSS' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/flatten' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/generateAlphabeticName' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/getComponentName' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/interleave' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/isStyledComponent' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/isTag' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/nonce' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/once' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/stringifyRules' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/consolidateStreamedStyles.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/determineTheme.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/escape.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/extractCompsFromCSS.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/flatten.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/generateAlphabeticName.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/getComponentName.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/interleave.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/test/validAttr.test' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/utils/validAttr' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/glamor/hash' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss-nested/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss-safe-parser/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss-safe-parser/safe-parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/at-rule' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/comment' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/container' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/css-syntax-error' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/declaration' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/input' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/lazy-result' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/list' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/node' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/parse' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/parser' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/postcss' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/processor' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/result' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/root' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/rule' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/stringifier' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/stringify' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/terminal-highlight' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/tokenize' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/vendor' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/warn-once' {\n  declare module.exports: any;\n}\n\ndeclare module 'styled-components/src/vendor/postcss/warning' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'styled-components/dist/styled-components-no-parser.browser.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-no-parser.browser.cjs'>;\n}\ndeclare module 'styled-components/dist/styled-components-no-parser.browser.es.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-no-parser.browser.es'>;\n}\ndeclare module 'styled-components/dist/styled-components-no-parser.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-no-parser.cjs'>;\n}\ndeclare module 'styled-components/dist/styled-components-no-parser.es.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-no-parser.es'>;\n}\ndeclare module 'styled-components/dist/styled-components-primitives.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-primitives.cjs'>;\n}\ndeclare module 'styled-components/dist/styled-components-primitives.es.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components-primitives.es'>;\n}\ndeclare module 'styled-components/dist/styled-components.browser.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.browser.cjs'>;\n}\ndeclare module 'styled-components/dist/styled-components.browser.es.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.browser.es'>;\n}\ndeclare module 'styled-components/dist/styled-components.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.cjs'>;\n}\ndeclare module 'styled-components/dist/styled-components.es.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.es'>;\n}\ndeclare module 'styled-components/dist/styled-components.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components'>;\n}\ndeclare module 'styled-components/dist/styled-components.min.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.min'>;\n}\ndeclare module 'styled-components/dist/styled-components.native.cjs.js' {\n  declare module.exports: $Exports<'styled-components/dist/styled-components.native.cjs'>;\n}\ndeclare module 'styled-components/flow-typed/danger-plugin-jest_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/danger-plugin-jest_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/enzyme_v3.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/enzyme_v3.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/fbjs_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/fbjs_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/lodash_v4.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/lodash_v4.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-cli_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-cli_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-core_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-core_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-eslint_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-loader_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-loader_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-external-helpers_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-external-helpers_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-flow-react-proptypes_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-flow-react-proptypes_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-class-properties_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-transform-class-properties_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-transform-flow-strip-types_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-plugin-transform-object-rest-spread_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-preset-latest_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-preset-latest_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/babel-preset-react_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/babel-preset-react_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/buffer_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/buffer_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/chokidar_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/chokidar_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/css-to-react-native_v1.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/css-to-react-native_v1.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/css-to-react-native_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/css-to-react-native_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-config-airbnb_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-config-airbnb_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-flowtype_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-plugin-flowtype_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-flowtype-errors_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-plugin-flowtype-errors_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-import_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-plugin-import_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-plugin-jsx-a11y_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/eslint-plugin-react_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/eslint-plugin-react_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/expect_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/expect_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/express_v4.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/express_v4.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/flow-bin_v0.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/flow-bin_v0.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/flow-copy-source_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/flow-copy-source_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/inline-style-prefixer_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/inline-style-prefixer_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/is-function_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/is-function_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/is-plain-object_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/is-plain-object_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/jest_v19.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/jest_v19.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/jsdom_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/jsdom_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/lint-staged_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/lint-staged_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/mocha_v2.4.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/mocha_v2.4.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/mocha_v3.1.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/mocha_v3.1.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/mocha-jsdom_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/mocha-jsdom_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/node-watch_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/node-watch_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/pre-commit_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/pre-commit_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/react-addons-test-utils_v15.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/react-addons-test-utils_v15.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-babel_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-babel_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-commonjs_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-commonjs_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-flow_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-flow_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-inject_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-inject_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-json_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-json_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-node-resolve_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-replace_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-replace_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-uglify_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-uglify_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/rollup-plugin-visualizer_vx.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/rollup-plugin-visualizer_vx.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/npm/supports-color_v3.x.x.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/npm/supports-color_v3.x.x'>;\n}\ndeclare module 'styled-components/flow-typed/react-native.js' {\n  declare module.exports: $Exports<'styled-components/flow-typed/react-native'>;\n}\ndeclare module 'styled-components/native/index.js' {\n  declare module.exports: $Exports<'styled-components/native/index'>;\n}\ndeclare module 'styled-components/src/constructors/constructWithOptions.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/constructWithOptions'>;\n}\ndeclare module 'styled-components/src/constructors/css.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/css'>;\n}\ndeclare module 'styled-components/src/constructors/injectGlobal.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/injectGlobal'>;\n}\ndeclare module 'styled-components/src/constructors/keyframes.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/keyframes'>;\n}\ndeclare module 'styled-components/src/constructors/styled.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/styled'>;\n}\ndeclare module 'styled-components/src/constructors/test/injectGlobal.test.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/test/injectGlobal.test'>;\n}\ndeclare module 'styled-components/src/constructors/test/keyframes.test.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/test/keyframes.test'>;\n}\ndeclare module 'styled-components/src/constructors/test/styled.test.js' {\n  declare module.exports: $Exports<'styled-components/src/constructors/test/styled.test'>;\n}\ndeclare module 'styled-components/src/hoc/withTheme.js' {\n  declare module.exports: $Exports<'styled-components/src/hoc/withTheme'>;\n}\ndeclare module 'styled-components/src/index.js' {\n  declare module.exports: $Exports<'styled-components/src/index'>;\n}\ndeclare module 'styled-components/src/models/BrowserStyleSheet.js' {\n  declare module.exports: $Exports<'styled-components/src/models/BrowserStyleSheet'>;\n}\ndeclare module 'styled-components/src/models/ComponentStyle.js' {\n  declare module.exports: $Exports<'styled-components/src/models/ComponentStyle'>;\n}\ndeclare module 'styled-components/src/models/InlineStyle.js' {\n  declare module.exports: $Exports<'styled-components/src/models/InlineStyle'>;\n}\ndeclare module 'styled-components/src/models/ServerStyleSheet.js' {\n  declare module.exports: $Exports<'styled-components/src/models/ServerStyleSheet'>;\n}\ndeclare module 'styled-components/src/models/StyledComponent.js' {\n  declare module.exports: $Exports<'styled-components/src/models/StyledComponent'>;\n}\ndeclare module 'styled-components/src/models/StyledNativeComponent.js' {\n  declare module.exports: $Exports<'styled-components/src/models/StyledNativeComponent'>;\n}\ndeclare module 'styled-components/src/models/StyleSheet.js' {\n  declare module.exports: $Exports<'styled-components/src/models/StyleSheet'>;\n}\ndeclare module 'styled-components/src/models/StyleSheetManager.js' {\n  declare module.exports: $Exports<'styled-components/src/models/StyleSheetManager'>;\n}\ndeclare module 'styled-components/src/models/test/ThemeProvider.test.js' {\n  declare module.exports: $Exports<'styled-components/src/models/test/ThemeProvider.test'>;\n}\ndeclare module 'styled-components/src/models/ThemeProvider.js' {\n  declare module.exports: $Exports<'styled-components/src/models/ThemeProvider'>;\n}\ndeclare module 'styled-components/src/native/index.js' {\n  declare module.exports: $Exports<'styled-components/src/native/index'>;\n}\ndeclare module 'styled-components/src/native/test/native.test.js' {\n  declare module.exports: $Exports<'styled-components/src/native/test/native.test'>;\n}\ndeclare module 'styled-components/src/native/test/theme.test.js' {\n  declare module.exports: $Exports<'styled-components/src/native/test/theme.test'>;\n}\ndeclare module 'styled-components/src/no-parser/css.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/css'>;\n}\ndeclare module 'styled-components/src/no-parser/flatten.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/flatten'>;\n}\ndeclare module 'styled-components/src/no-parser/index.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/index'>;\n}\ndeclare module 'styled-components/src/no-parser/stringifyRules.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/stringifyRules'>;\n}\ndeclare module 'styled-components/src/no-parser/test/basic.test.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/test/basic.test'>;\n}\ndeclare module 'styled-components/src/no-parser/test/flatten.test.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/test/flatten.test'>;\n}\ndeclare module 'styled-components/src/no-parser/test/keyframes.test.js' {\n  declare module.exports: $Exports<'styled-components/src/no-parser/test/keyframes.test'>;\n}\ndeclare module 'styled-components/src/primitives/index.js' {\n  declare module.exports: $Exports<'styled-components/src/primitives/index'>;\n}\ndeclare module 'styled-components/src/primitives/test/primitives.test.js' {\n  declare module.exports: $Exports<'styled-components/src/primitives/test/primitives.test'>;\n}\ndeclare module 'styled-components/src/secretInternals.js' {\n  declare module.exports: $Exports<'styled-components/src/secretInternals'>;\n}\ndeclare module 'styled-components/src/test/attrs.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/attrs.test'>;\n}\ndeclare module 'styled-components/src/test/basic.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/basic.test'>;\n}\ndeclare module 'styled-components/src/test/css.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/css.test'>;\n}\ndeclare module 'styled-components/src/test/enzymeSetup.js' {\n  declare module.exports: $Exports<'styled-components/src/test/enzymeSetup'>;\n}\ndeclare module 'styled-components/src/test/expanded-api.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/expanded-api.test'>;\n}\ndeclare module 'styled-components/src/test/extending.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/extending.test'>;\n}\ndeclare module 'styled-components/src/test/globals.js' {\n  declare module.exports: $Exports<'styled-components/src/test/globals'>;\n}\ndeclare module 'styled-components/src/test/overriding.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/overriding.test'>;\n}\ndeclare module 'styled-components/src/test/props.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/props.test'>;\n}\ndeclare module 'styled-components/src/test/rehydration.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/rehydration.test'>;\n}\ndeclare module 'styled-components/src/test/ssr.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/ssr.test'>;\n}\ndeclare module 'styled-components/src/test/staticCaching.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/staticCaching.test'>;\n}\ndeclare module 'styled-components/src/test/styles.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/styles.test'>;\n}\ndeclare module 'styled-components/src/test/theme.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/theme.test'>;\n}\ndeclare module 'styled-components/src/test/utils.js' {\n  declare module.exports: $Exports<'styled-components/src/test/utils'>;\n}\ndeclare module 'styled-components/src/test/warnTooManyClasses.test.js' {\n  declare module.exports: $Exports<'styled-components/src/test/warnTooManyClasses.test'>;\n}\ndeclare module 'styled-components/src/types.js' {\n  declare module.exports: $Exports<'styled-components/src/types'>;\n}\ndeclare module 'styled-components/src/utils/consolidateStreamedStyles.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/consolidateStreamedStyles'>;\n}\ndeclare module 'styled-components/src/utils/create-broadcast.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/create-broadcast'>;\n}\ndeclare module 'styled-components/src/utils/createWarnTooManyClasses.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/createWarnTooManyClasses'>;\n}\ndeclare module 'styled-components/src/utils/determineTheme.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/determineTheme'>;\n}\ndeclare module 'styled-components/src/utils/domElements.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/domElements'>;\n}\ndeclare module 'styled-components/src/utils/escape.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/escape'>;\n}\ndeclare module 'styled-components/src/utils/extractCompsFromCSS.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/extractCompsFromCSS'>;\n}\ndeclare module 'styled-components/src/utils/flatten.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/flatten'>;\n}\ndeclare module 'styled-components/src/utils/generateAlphabeticName.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/generateAlphabeticName'>;\n}\ndeclare module 'styled-components/src/utils/getComponentName.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/getComponentName'>;\n}\ndeclare module 'styled-components/src/utils/interleave.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/interleave'>;\n}\ndeclare module 'styled-components/src/utils/isStyledComponent.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/isStyledComponent'>;\n}\ndeclare module 'styled-components/src/utils/isTag.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/isTag'>;\n}\ndeclare module 'styled-components/src/utils/nonce.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/nonce'>;\n}\ndeclare module 'styled-components/src/utils/once.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/once'>;\n}\ndeclare module 'styled-components/src/utils/stringifyRules.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/stringifyRules'>;\n}\ndeclare module 'styled-components/src/utils/test/consolidateStreamedStyles.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/consolidateStreamedStyles.test'>;\n}\ndeclare module 'styled-components/src/utils/test/determineTheme.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/determineTheme.test'>;\n}\ndeclare module 'styled-components/src/utils/test/escape.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/escape.test'>;\n}\ndeclare module 'styled-components/src/utils/test/extractCompsFromCSS.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/extractCompsFromCSS.test'>;\n}\ndeclare module 'styled-components/src/utils/test/flatten.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/flatten.test'>;\n}\ndeclare module 'styled-components/src/utils/test/generateAlphabeticName.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/generateAlphabeticName.test'>;\n}\ndeclare module 'styled-components/src/utils/test/getComponentName.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/getComponentName.test'>;\n}\ndeclare module 'styled-components/src/utils/test/interleave.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/interleave.test'>;\n}\ndeclare module 'styled-components/src/utils/test/validAttr.test.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/test/validAttr.test'>;\n}\ndeclare module 'styled-components/src/utils/validAttr.js' {\n  declare module.exports: $Exports<'styled-components/src/utils/validAttr'>;\n}\ndeclare module 'styled-components/src/vendor/glamor/hash.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/glamor/hash'>;\n}\ndeclare module 'styled-components/src/vendor/postcss-nested/index.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss-nested/index'>;\n}\ndeclare module 'styled-components/src/vendor/postcss-safe-parser/parse.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss-safe-parser/parse'>;\n}\ndeclare module 'styled-components/src/vendor/postcss-safe-parser/safe-parser.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss-safe-parser/safe-parser'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/at-rule.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/at-rule'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/comment.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/comment'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/container.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/container'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/css-syntax-error.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/css-syntax-error'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/declaration.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/declaration'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/input.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/input'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/lazy-result.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/lazy-result'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/list.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/list'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/node.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/node'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/parse.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/parse'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/parser.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/parser'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/postcss.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/postcss'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/processor.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/processor'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/result.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/result'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/root.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/root'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/rule.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/rule'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/stringifier.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/stringifier'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/stringify.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/stringify'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/terminal-highlight.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/terminal-highlight'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/tokenize.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/tokenize'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/vendor.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/vendor'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/warn-once.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/warn-once'>;\n}\ndeclare module 'styled-components/src/vendor/postcss/warning.js' {\n  declare module.exports: $Exports<'styled-components/src/vendor/postcss/warning'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/subscriptions-transport-ws_vx.x.x.js",
    "content": "// flow-typed signature: 6d4e0fecfdc0fcc811023d1d902bb68c\n// flow-typed version: <<STUB>>/subscriptions-transport-ws_v0.9.x/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'subscriptions-transport-ws'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'subscriptions-transport-ws' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'subscriptions-transport-ws/browser/client' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/client' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/defaults' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/legacy/parse-legacy-protocol' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/message-types' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/protocol' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/server' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/utils/empty-iterable' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/utils/is-subscriptions' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/utils/promise-to-iterable' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/dist/utils/rejection-iterable' {\n  declare module.exports: any;\n}\n\ndeclare module 'subscriptions-transport-ws/unpkg-webpack.config' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'subscriptions-transport-ws/browser/client.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/browser/client'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/client.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/client'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/defaults.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/defaults'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/index.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/index'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/legacy/parse-legacy-protocol.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/legacy/parse-legacy-protocol'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/message-types.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/message-types'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/protocol.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/protocol'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/server.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/server'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/utils/empty-iterable.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/utils/empty-iterable'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/utils/is-subscriptions.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/utils/is-subscriptions'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/utils/promise-to-iterable.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/utils/promise-to-iterable'>;\n}\ndeclare module 'subscriptions-transport-ws/dist/utils/rejection-iterable.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/dist/utils/rejection-iterable'>;\n}\ndeclare module 'subscriptions-transport-ws/unpkg-webpack.config.js' {\n  declare module.exports: $Exports<'subscriptions-transport-ws/unpkg-webpack.config'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/sw-precache-webpack-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 5de34cdf694395010ffe4d43e77d6d43\n// flow-typed version: <<STUB>>/sw-precache-webpack-plugin_v^0.11.4/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'sw-precache-webpack-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'sw-precache-webpack-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'sw-precache-webpack-plugin/lib/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'sw-precache-webpack-plugin/lib/index.js' {\n  declare module.exports: $Exports<'sw-precache-webpack-plugin/lib/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/then-queue_vx.x.x.js",
    "content": "// flow-typed signature: 9a4fe1f5bcbed5573fb775a1952f4894\n// flow-typed version: <<STUB>>/then-queue_v^1.3.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'then-queue'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'then-queue' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'then-queue/test/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'then-queue/index' {\n  declare module.exports: $Exports<'then-queue'>;\n}\ndeclare module 'then-queue/index.js' {\n  declare module.exports: $Exports<'then-queue'>;\n}\ndeclare module 'then-queue/test/index.js' {\n  declare module.exports: $Exports<'then-queue/test/index'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/toobusy-js_vx.x.x.js",
    "content": "// flow-typed signature: 6c570301390b131491fa1131d71fcf16\n// flow-typed version: <<STUB>>/toobusy-js_v0.5.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'toobusy-js'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'toobusy-js' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'toobusy-js/examples/express' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/examples/http' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/examples/load' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/examples/standalone' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/foo' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/tests' {\n  declare module.exports: any;\n}\n\ndeclare module 'toobusy-js/toobusy' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'toobusy-js/examples/express.js' {\n  declare module.exports: $Exports<'toobusy-js/examples/express'>;\n}\ndeclare module 'toobusy-js/examples/http.js' {\n  declare module.exports: $Exports<'toobusy-js/examples/http'>;\n}\ndeclare module 'toobusy-js/examples/load.js' {\n  declare module.exports: $Exports<'toobusy-js/examples/load'>;\n}\ndeclare module 'toobusy-js/examples/standalone.js' {\n  declare module.exports: $Exports<'toobusy-js/examples/standalone'>;\n}\ndeclare module 'toobusy-js/foo.js' {\n  declare module.exports: $Exports<'toobusy-js/foo'>;\n}\ndeclare module 'toobusy-js/index' {\n  declare module.exports: $Exports<'toobusy-js'>;\n}\ndeclare module 'toobusy-js/index.js' {\n  declare module.exports: $Exports<'toobusy-js'>;\n}\ndeclare module 'toobusy-js/tests.js' {\n  declare module.exports: $Exports<'toobusy-js/tests'>;\n}\ndeclare module 'toobusy-js/toobusy.js' {\n  declare module.exports: $Exports<'toobusy-js/toobusy'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/uuid_v3.x.x.js",
    "content": "// flow-typed signature: 615e568e95029d58f116dd157e320137\n// flow-typed version: 2b95c0dfc1/uuid_v3.x.x/flow_>=v0.32.x\n\ndeclare module 'uuid' {\n  declare class uuid {\n    static (\n      options?: {|\n        random?: number[],\n        rng?: () => number[] | Buffer,\n      |},\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n\n    static v1(\n      options?: {|\n        node?: number[],\n        clockseq?: number,\n        msecs?: number | Date,\n        nsecs?: number,\n      |},\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n\n    static v4(\n      options?: {|\n        random?: number[],\n        rng?: () => number[] | Buffer,\n      |},\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n  }\n  declare module.exports: Class<uuid>;\n}\n\ndeclare module 'uuid/v1' {\n  declare class v1 {\n    static (\n      options?: {|\n        node?: number[],\n        clockseq?: number,\n        msecs?: number | Date,\n        nsecs?: number,\n      |},\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n  }\n\n  declare module.exports: Class<v1>;\n}\n\ndeclare module 'uuid/v4' {\n  declare class v4 {\n    static (\n      options?: {|\n        random?: number[],\n        rng?: () => number[] | Buffer,\n      |},\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n  }\n\n  declare module.exports: Class<v4>;\n}\n\ndeclare module 'uuid/v5' {\n  declare class v5 {\n    static (\n      name?: string | number[],\n      namespace?: string | number[],\n      buffer?: number[] | Buffer,\n      offset?: number\n    ): string,\n  }\n\n  declare module.exports: Class<v5>;\n}\n"
  },
  {
    "path": "flow-typed/npm/validator_vx.x.x.js",
    "content": "// flow-typed signature: 2543968ea7a2e981f4fb402676366238\n// flow-typed version: <<STUB>>/validator_v^9.0.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'validator'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'validator' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'validator/lib/alpha' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/blacklist' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/contains' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/equals' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/escape' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isAfter' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isAlpha' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isAlphanumeric' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isAscii' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isBase64' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isBefore' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isBoolean' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isByteLength' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isCreditCard' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isCurrency' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isDataURI' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isDate' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isDecimal' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isDivisibleBy' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isEmail' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isEmpty' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isFloat' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isFQDN' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isFullWidth' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isHalfWidth' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isHash' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isHexadecimal' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isHexColor' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isIn' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isInt' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isIP' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISBN' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISIN' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISO31661Alpha2' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISO8601' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISRC' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isISSN' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isJSON' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isLatLong' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isLength' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isLowercase' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMACAddress' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMD5' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMimeType' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMobilePhone' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMongoId' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isMultibyte' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isNumeric' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isPort' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isPostalCode' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isSurrogatePair' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isUppercase' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isURL' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isUUID' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isVariableWidth' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/isWhitelisted' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/ltrim' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/matches' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/normalizeEmail' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/rtrim' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/stripLow' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/toBoolean' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/toDate' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/toFloat' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/toInt' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/trim' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/unescape' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/util/assertString' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/util/merge' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/util/toString' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/lib/whitelist' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/validator' {\n  declare module.exports: any;\n}\n\ndeclare module 'validator/validator.min' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'validator/index' {\n  declare module.exports: $Exports<'validator'>;\n}\ndeclare module 'validator/index.js' {\n  declare module.exports: $Exports<'validator'>;\n}\ndeclare module 'validator/lib/alpha.js' {\n  declare module.exports: $Exports<'validator/lib/alpha'>;\n}\ndeclare module 'validator/lib/blacklist.js' {\n  declare module.exports: $Exports<'validator/lib/blacklist'>;\n}\ndeclare module 'validator/lib/contains.js' {\n  declare module.exports: $Exports<'validator/lib/contains'>;\n}\ndeclare module 'validator/lib/equals.js' {\n  declare module.exports: $Exports<'validator/lib/equals'>;\n}\ndeclare module 'validator/lib/escape.js' {\n  declare module.exports: $Exports<'validator/lib/escape'>;\n}\ndeclare module 'validator/lib/isAfter.js' {\n  declare module.exports: $Exports<'validator/lib/isAfter'>;\n}\ndeclare module 'validator/lib/isAlpha.js' {\n  declare module.exports: $Exports<'validator/lib/isAlpha'>;\n}\ndeclare module 'validator/lib/isAlphanumeric.js' {\n  declare module.exports: $Exports<'validator/lib/isAlphanumeric'>;\n}\ndeclare module 'validator/lib/isAscii.js' {\n  declare module.exports: $Exports<'validator/lib/isAscii'>;\n}\ndeclare module 'validator/lib/isBase64.js' {\n  declare module.exports: $Exports<'validator/lib/isBase64'>;\n}\ndeclare module 'validator/lib/isBefore.js' {\n  declare module.exports: $Exports<'validator/lib/isBefore'>;\n}\ndeclare module 'validator/lib/isBoolean.js' {\n  declare module.exports: $Exports<'validator/lib/isBoolean'>;\n}\ndeclare module 'validator/lib/isByteLength.js' {\n  declare module.exports: $Exports<'validator/lib/isByteLength'>;\n}\ndeclare module 'validator/lib/isCreditCard.js' {\n  declare module.exports: $Exports<'validator/lib/isCreditCard'>;\n}\ndeclare module 'validator/lib/isCurrency.js' {\n  declare module.exports: $Exports<'validator/lib/isCurrency'>;\n}\ndeclare module 'validator/lib/isDataURI.js' {\n  declare module.exports: $Exports<'validator/lib/isDataURI'>;\n}\ndeclare module 'validator/lib/isDate.js' {\n  declare module.exports: $Exports<'validator/lib/isDate'>;\n}\ndeclare module 'validator/lib/isDecimal.js' {\n  declare module.exports: $Exports<'validator/lib/isDecimal'>;\n}\ndeclare module 'validator/lib/isDivisibleBy.js' {\n  declare module.exports: $Exports<'validator/lib/isDivisibleBy'>;\n}\ndeclare module 'validator/lib/isEmail.js' {\n  declare module.exports: $Exports<'validator/lib/isEmail'>;\n}\ndeclare module 'validator/lib/isEmpty.js' {\n  declare module.exports: $Exports<'validator/lib/isEmpty'>;\n}\ndeclare module 'validator/lib/isFloat.js' {\n  declare module.exports: $Exports<'validator/lib/isFloat'>;\n}\ndeclare module 'validator/lib/isFQDN.js' {\n  declare module.exports: $Exports<'validator/lib/isFQDN'>;\n}\ndeclare module 'validator/lib/isFullWidth.js' {\n  declare module.exports: $Exports<'validator/lib/isFullWidth'>;\n}\ndeclare module 'validator/lib/isHalfWidth.js' {\n  declare module.exports: $Exports<'validator/lib/isHalfWidth'>;\n}\ndeclare module 'validator/lib/isHash.js' {\n  declare module.exports: $Exports<'validator/lib/isHash'>;\n}\ndeclare module 'validator/lib/isHexadecimal.js' {\n  declare module.exports: $Exports<'validator/lib/isHexadecimal'>;\n}\ndeclare module 'validator/lib/isHexColor.js' {\n  declare module.exports: $Exports<'validator/lib/isHexColor'>;\n}\ndeclare module 'validator/lib/isIn.js' {\n  declare module.exports: $Exports<'validator/lib/isIn'>;\n}\ndeclare module 'validator/lib/isInt.js' {\n  declare module.exports: $Exports<'validator/lib/isInt'>;\n}\ndeclare module 'validator/lib/isIP.js' {\n  declare module.exports: $Exports<'validator/lib/isIP'>;\n}\ndeclare module 'validator/lib/isISBN.js' {\n  declare module.exports: $Exports<'validator/lib/isISBN'>;\n}\ndeclare module 'validator/lib/isISIN.js' {\n  declare module.exports: $Exports<'validator/lib/isISIN'>;\n}\ndeclare module 'validator/lib/isISO31661Alpha2.js' {\n  declare module.exports: $Exports<'validator/lib/isISO31661Alpha2'>;\n}\ndeclare module 'validator/lib/isISO8601.js' {\n  declare module.exports: $Exports<'validator/lib/isISO8601'>;\n}\ndeclare module 'validator/lib/isISRC.js' {\n  declare module.exports: $Exports<'validator/lib/isISRC'>;\n}\ndeclare module 'validator/lib/isISSN.js' {\n  declare module.exports: $Exports<'validator/lib/isISSN'>;\n}\ndeclare module 'validator/lib/isJSON.js' {\n  declare module.exports: $Exports<'validator/lib/isJSON'>;\n}\ndeclare module 'validator/lib/isLatLong.js' {\n  declare module.exports: $Exports<'validator/lib/isLatLong'>;\n}\ndeclare module 'validator/lib/isLength.js' {\n  declare module.exports: $Exports<'validator/lib/isLength'>;\n}\ndeclare module 'validator/lib/isLowercase.js' {\n  declare module.exports: $Exports<'validator/lib/isLowercase'>;\n}\ndeclare module 'validator/lib/isMACAddress.js' {\n  declare module.exports: $Exports<'validator/lib/isMACAddress'>;\n}\ndeclare module 'validator/lib/isMD5.js' {\n  declare module.exports: $Exports<'validator/lib/isMD5'>;\n}\ndeclare module 'validator/lib/isMimeType.js' {\n  declare module.exports: $Exports<'validator/lib/isMimeType'>;\n}\ndeclare module 'validator/lib/isMobilePhone.js' {\n  declare module.exports: $Exports<'validator/lib/isMobilePhone'>;\n}\ndeclare module 'validator/lib/isMongoId.js' {\n  declare module.exports: $Exports<'validator/lib/isMongoId'>;\n}\ndeclare module 'validator/lib/isMultibyte.js' {\n  declare module.exports: $Exports<'validator/lib/isMultibyte'>;\n}\ndeclare module 'validator/lib/isNumeric.js' {\n  declare module.exports: $Exports<'validator/lib/isNumeric'>;\n}\ndeclare module 'validator/lib/isPort.js' {\n  declare module.exports: $Exports<'validator/lib/isPort'>;\n}\ndeclare module 'validator/lib/isPostalCode.js' {\n  declare module.exports: $Exports<'validator/lib/isPostalCode'>;\n}\ndeclare module 'validator/lib/isSurrogatePair.js' {\n  declare module.exports: $Exports<'validator/lib/isSurrogatePair'>;\n}\ndeclare module 'validator/lib/isUppercase.js' {\n  declare module.exports: $Exports<'validator/lib/isUppercase'>;\n}\ndeclare module 'validator/lib/isURL.js' {\n  declare module.exports: $Exports<'validator/lib/isURL'>;\n}\ndeclare module 'validator/lib/isUUID.js' {\n  declare module.exports: $Exports<'validator/lib/isUUID'>;\n}\ndeclare module 'validator/lib/isVariableWidth.js' {\n  declare module.exports: $Exports<'validator/lib/isVariableWidth'>;\n}\ndeclare module 'validator/lib/isWhitelisted.js' {\n  declare module.exports: $Exports<'validator/lib/isWhitelisted'>;\n}\ndeclare module 'validator/lib/ltrim.js' {\n  declare module.exports: $Exports<'validator/lib/ltrim'>;\n}\ndeclare module 'validator/lib/matches.js' {\n  declare module.exports: $Exports<'validator/lib/matches'>;\n}\ndeclare module 'validator/lib/normalizeEmail.js' {\n  declare module.exports: $Exports<'validator/lib/normalizeEmail'>;\n}\ndeclare module 'validator/lib/rtrim.js' {\n  declare module.exports: $Exports<'validator/lib/rtrim'>;\n}\ndeclare module 'validator/lib/stripLow.js' {\n  declare module.exports: $Exports<'validator/lib/stripLow'>;\n}\ndeclare module 'validator/lib/toBoolean.js' {\n  declare module.exports: $Exports<'validator/lib/toBoolean'>;\n}\ndeclare module 'validator/lib/toDate.js' {\n  declare module.exports: $Exports<'validator/lib/toDate'>;\n}\ndeclare module 'validator/lib/toFloat.js' {\n  declare module.exports: $Exports<'validator/lib/toFloat'>;\n}\ndeclare module 'validator/lib/toInt.js' {\n  declare module.exports: $Exports<'validator/lib/toInt'>;\n}\ndeclare module 'validator/lib/trim.js' {\n  declare module.exports: $Exports<'validator/lib/trim'>;\n}\ndeclare module 'validator/lib/unescape.js' {\n  declare module.exports: $Exports<'validator/lib/unescape'>;\n}\ndeclare module 'validator/lib/util/assertString.js' {\n  declare module.exports: $Exports<'validator/lib/util/assertString'>;\n}\ndeclare module 'validator/lib/util/merge.js' {\n  declare module.exports: $Exports<'validator/lib/util/merge'>;\n}\ndeclare module 'validator/lib/util/toString.js' {\n  declare module.exports: $Exports<'validator/lib/util/toString'>;\n}\ndeclare module 'validator/lib/whitelist.js' {\n  declare module.exports: $Exports<'validator/lib/whitelist'>;\n}\ndeclare module 'validator/validator.js' {\n  declare module.exports: $Exports<'validator/validator'>;\n}\ndeclare module 'validator/validator.min.js' {\n  declare module.exports: $Exports<'validator/validator.min'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/web-push_vx.x.x.js",
    "content": "// flow-typed signature: 005da1297e0ad6a94b3d535bb51f87a7\n// flow-typed version: <<STUB>>/web-push_v^3.2.2/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'web-push'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'web-push' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'web-push/src/cli' {\n  declare module.exports: any;\n}\n\ndeclare module 'web-push/src/encryption-helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'web-push/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'web-push/src/vapid-helper' {\n  declare module.exports: any;\n}\n\ndeclare module 'web-push/src/web-push-error' {\n  declare module.exports: any;\n}\n\ndeclare module 'web-push/src/web-push-lib' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'web-push/src/cli.js' {\n  declare module.exports: $Exports<'web-push/src/cli'>;\n}\ndeclare module 'web-push/src/encryption-helper.js' {\n  declare module.exports: $Exports<'web-push/src/encryption-helper'>;\n}\ndeclare module 'web-push/src/index.js' {\n  declare module.exports: $Exports<'web-push/src/index'>;\n}\ndeclare module 'web-push/src/vapid-helper.js' {\n  declare module.exports: $Exports<'web-push/src/vapid-helper'>;\n}\ndeclare module 'web-push/src/web-push-error.js' {\n  declare module.exports: $Exports<'web-push/src/web-push-error'>;\n}\ndeclare module 'web-push/src/web-push-lib.js' {\n  declare module.exports: $Exports<'web-push/src/web-push-lib'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/webpack-bundle-analyzer_vx.x.x.js",
    "content": "// flow-typed signature: bce16c540c3b04b9407a623f6286fff5\n// flow-typed version: <<STUB>>/webpack-bundle-analyzer_v^2.9.1/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'webpack-bundle-analyzer'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'webpack-bundle-analyzer' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'webpack-bundle-analyzer/lib/analyzer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/bin/analyzer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/BundleAnalyzerPlugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/Logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/parseUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/tree' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/lib/viewer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/public/viewer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/analyzer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/bin/analyzer' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/BundleAnalyzerPlugin' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/Logger' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/parseUtils' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/tree' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-bundle-analyzer/src/viewer' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'webpack-bundle-analyzer/lib/analyzer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/analyzer'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/bin/analyzer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/bin/analyzer'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/BundleAnalyzerPlugin.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/BundleAnalyzerPlugin'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/index.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/index'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/Logger.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/Logger'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/parseUtils.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/parseUtils'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/tree.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/tree'>;\n}\ndeclare module 'webpack-bundle-analyzer/lib/viewer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/lib/viewer'>;\n}\ndeclare module 'webpack-bundle-analyzer/public/viewer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/public/viewer'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/analyzer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/analyzer'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/bin/analyzer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/bin/analyzer'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/BundleAnalyzerPlugin.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/BundleAnalyzerPlugin'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/index.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/index'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/Logger.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/Logger'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/parseUtils.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/parseUtils'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/tree.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/tree'>;\n}\ndeclare module 'webpack-bundle-analyzer/src/viewer.js' {\n  declare module.exports: $Exports<'webpack-bundle-analyzer/src/viewer'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/webpack-module-manifest-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 75ad28471a8b109519e597cfe8a7e0c9\n// flow-typed version: <<STUB>>/webpack-module-manifest-plugin_v^0.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'webpack-module-manifest-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'webpack-module-manifest-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'webpack-module-manifest-plugin/lib/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-module-manifest-plugin/src/index' {\n  declare module.exports: any;\n}\n\ndeclare module 'webpack-module-manifest-plugin/src/index.test' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'webpack-module-manifest-plugin/lib/index.js' {\n  declare module.exports: $Exports<'webpack-module-manifest-plugin/lib/index'>;\n}\ndeclare module 'webpack-module-manifest-plugin/src/index.js' {\n  declare module.exports: $Exports<'webpack-module-manifest-plugin/src/index'>;\n}\ndeclare module 'webpack-module-manifest-plugin/src/index.test.js' {\n  declare module.exports: $Exports<'webpack-module-manifest-plugin/src/index.test'>;\n}\n"
  },
  {
    "path": "flow-typed/npm/write-file-webpack-plugin_vx.x.x.js",
    "content": "// flow-typed signature: 9391c160c01f89bdc69f32cd64e077c0\n// flow-typed version: <<STUB>>/write-file-webpack-plugin_v^4.1.0/flow_v0.63.1\n\n/**\n * This is an autogenerated libdef stub for:\n *\n *   'write-file-webpack-plugin'\n *\n * Fill this stub out by replacing all the `any` types.\n *\n * Once filled out, we encourage you to share your work with the\n * community by sending a pull request to:\n * https://github.com/flowtype/flow-typed\n */\n\ndeclare module 'write-file-webpack-plugin' {\n  declare module.exports: any;\n}\n\n/**\n * We include stubs for each file inside this npm package in case you need to\n * require those files directly. Feel free to delete any files that aren't\n * needed.\n */\ndeclare module 'write-file-webpack-plugin/dist/index' {\n  declare module.exports: any;\n}\n\n// Filename aliases\ndeclare module 'write-file-webpack-plugin/dist/index.js' {\n  declare module.exports: $Exports<'write-file-webpack-plugin/dist/index'>;\n}\n"
  },
  {
    "path": "flow-typed/react-native.js",
    "content": "declare module 'react-native' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "hyperion/index.js",
    "content": "// @flow\nconst debug = require('debug')('hyperion');\nimport 'raf/polyfill';\ndebug('Hyperion starting...');\ndebug('logging with debug enabled');\nrequire('isomorphic-fetch'); // prevent https://github.com/withspectrum/spectrum/issues/3032\nimport fs from 'fs';\nimport statsd from 'shared/middlewares/statsd';\nimport express from 'express';\nimport Loadable from 'react-loadable';\nimport path from 'path';\n// TODO: This is the only thing that connects hyperion to the db\n// we should get rid of this if at all possible\nimport { getUserById } from 'shared/db/queries/user';\nimport Raven from 'shared/raven';\nimport toobusy from 'shared/middlewares/toobusy';\nimport addSecurityMiddleware from 'shared/middlewares/security';\nimport { createProxyMiddleware } from 'http-proxy-middleware';\n\nconst PORT = process.env.PORT || 3006;\nconst ONE_HOUR = 3600;\n\nconst app = express();\n\n// Instantiate the statsd middleware as soon as possible to get accurate time tracking\napp.use(statsd);\n\n// Trust the now proxy\napp.set('trust proxy', true);\n\napp.use(toobusy);\n\n// Security middleware.\naddSecurityMiddleware(app, { enableNonce: true, enableCSP: true });\n\napp.use(\n  ['/api', '/api/**'],\n  createProxyMiddleware({\n    target: 'https://api.spectrum.chat',\n    changeOrigin: true,\n  })\n);\n\napp.use(\n  ['/auth', '/auth/**'],\n  createProxyMiddleware({\n    target: 'https://api.spectrum.chat',\n    changeOrigin: true,\n  })\n);\n\napp.use(\n  ['/websocket', '/websocket/**'],\n  createProxyMiddleware({\n    target: 'https://api.spectrum.chat',\n    changeOrigin: true,\n    ws: true,\n  })\n);\n\n// Serve static files from the build folder\napp.use(\n  express.static(\n    process.env.NODE_ENV === 'production'\n      ? './build'\n      : path.join(__dirname, '../build/'),\n    {\n      index: false,\n      setHeaders: (res, path) => {\n        // Don't cache the serviceworker in the browser\n        if (path.indexOf('sw.js') > -1) {\n          res.setHeader('Cache-Control', 'no-store, no-cache');\n          return;\n        }\n\n        if (path.endsWith('.js')) {\n          // Cache static files in now CDN for seven days\n          // (the filename changes if the file content changes, so we can cache these forever)\n          res.setHeader('Cache-Control', `s-maxage=${ONE_HOUR}`);\n        }\n      },\n    }\n  )\n);\n\n// In dev the static files from the root public folder aren't moved to the build folder by create-react-app\n// so we just tell Express to serve those too\nif (process.env.NODE_ENV === 'development') {\n  app.use(\n    express.static(path.resolve(__dirname, '..', 'public'), { index: false })\n  );\n}\n\nimport bodyParser from 'body-parser';\napp.use(bodyParser.json());\n\nif (process.env.NODE_ENV === 'development') {\n  const logging = require('shared/middlewares/logging');\n  app.use(logging);\n}\n\nif (process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV) {\n  // Raven (Sentry client) needs to come before everything else\n  const raven = require('shared/middlewares/raven').default;\n  app.use(raven);\n}\n\n// Cross origin request support\nimport cors from 'shared/middlewares/cors';\napp.use(cors);\n\n// In development the Webpack HMR server requests /sockjs-node constantly,\n// so let's patch that through to it!\nif (process.env.NODE_ENV === 'development') {\n  app.use('/sockjs-node', (req: express$Request, res: express$Response) => {\n    res.redirect(301, `http://localhost:3000${req.path}`);\n  });\n}\n\nimport cookieParser from 'cookie-parser';\napp.use(cookieParser());\n\nimport session from 'shared/middlewares/session';\napp.use(session);\n\nimport passport from 'passport';\n// Setup use serialization\npassport.serializeUser((user, done) => {\n  done(null, typeof user === 'string' ? user : JSON.stringify(user));\n});\n\n// NOTE(@mxstbr): `data` used to be just the userID, but is now the full user data\n// to avoid having to go to the db on every single request. We have to handle both\n// cases here, as more and more users use Spectrum again we go to the db less and less\npassport.deserializeUser((data, done) => {\n  // Fast path: try to JSON.parse the data if it works, we got the user data, yay!\n  try {\n    const user = JSON.parse(data);\n    // Make sure more than the user ID is in the data by checking any other required\n    // field for existence\n    if (user.id && user.createdAt) {\n      return done(null, user);\n    }\n    // Ignore JSON parsing errors\n  } catch (err) {}\n\n  // Slow path: data is just the userID (legacy), so we have to go to the db to get the full data\n  getUserById(data)\n    .then(user => {\n      done(null, user);\n    })\n    .catch(err => {\n      done(err);\n    });\n});\napp.use(passport.initialize());\napp.use(passport.session());\n\n// This needs to come after passport otherwise we'll always redirect logged-in users\nimport threadParamRedirect from 'shared/middlewares/thread-param';\napp.use(threadParamRedirect);\n\napp.get('*', (req: express$Request, res, next) => {\n  // Electron requests should only be client-side rendered\n  if (\n    req.headers['user-agent'] &&\n    req.headers['user-agent'].indexOf('Electron') > -1\n  ) {\n    return res.sendFile(path.resolve(__dirname, '../build/index.html'));\n  }\n  next();\n});\n\nimport renderer from './renderer';\napp.get('*', renderer);\n\nprocess.on('unhandledRejection', async err => {\n  console.error('Unhandled rejection', err);\n  try {\n    await new Promise(res => Raven.captureException(err, res));\n  } catch (err) {\n    console.error('Raven error', err);\n  } finally {\n    process.exit(1);\n  }\n});\n\nprocess.on('uncaughtException', async err => {\n  console.error('Uncaught exception', err);\n  try {\n    await new Promise(res => Raven.captureException(err, res));\n  } catch (err) {\n    console.error('Raven error', err);\n  } finally {\n    process.exit(1);\n  }\n});\n\nLoadable.preloadAll().then(() => {\n  app.listen(PORT);\n  debug(\n    `Hyperion, the server-side renderer, running at http://localhost:${PORT}`\n  );\n});\n"
  },
  {
    "path": "hyperion/renderer/browser-shim.js",
    "content": "// @flow\n// Shim some browser stuff we use in the client for server-side rendering\n// NOTE(@mxstbr): We should be getting rid of this over time\nglobal.window = {\n  location: {\n    protocol: 'https:',\n    host: 'spectrum.chat',\n    hash: '',\n  },\n  addEventListener: () => {},\n};\nglobal.localStorage = {\n  getItem: () => null,\n  setItem: () => {},\n  removeItem: () => {},\n};\nglobal.navigator = {\n  userAgent: '',\n};\nglobal.CSS = {\n  escape: require('css.escape'),\n};\n"
  },
  {
    "path": "hyperion/renderer/html-template.js",
    "content": "// @flow\nimport fs from 'fs';\nimport path from 'path';\nimport { html } from 'common-tags';\nimport serialize from 'serialize-javascript';\n\n// Match main.asdf123.js in production mode or bundle.js in dev mode\nconst mainBundleRegex = /(main|bundle)\\.(?:.*\\.)?js$/;\nconst bootstrapBundleRegex = /(bootstrap)\\.(?:.*\\.)?js$/;\n\nlet bundles;\ntry {\n  bundles = fs.readdirSync(\n    process.env.NODE_ENV === 'production'\n      ? './build/static/js'\n      : path.join(__dirname, '../../build/static/js')\n  );\n} catch (err) {\n  console.error(err);\n  throw new Error(\n    'It looks like you didn\\'t run \"yarn run dev:web\" or \"yarn run build:web\" before starting hyperion. Please wait until either of them completes before starting hyperion.'\n  );\n}\n\n// Get the main bundle filename\nconst mainBundle = bundles.find(bundle => mainBundleRegex.test(bundle));\nconst bootstrapBundle = bundles.find(bundle =>\n  bootstrapBundleRegex.test(bundle)\n);\nif (!mainBundle || !bootstrapBundle) {\n  throw new Error(\n    'It looks like you didn\\'t run \"yarn run dev:web\" or \"yarn run build:web\" before starting hyperion. Please wait until either of them completes before starting hyperion.'\n  );\n}\n\nexport const createScriptTag = ({ src }: { src: string }) =>\n  `<script defer=\"defer\" src=\"${src}\"></script>`;\n\nexport const getHeader = ({\n  metaTags,\n  nonce,\n}: {\n  metaTags: string,\n  nonce: string,\n}) => {\n  // prettier-ignore\n  return html`\n    <!DOCTYPE html>\n    <html lang=\"en\">\n      <head>\n        <meta charset=\"utf-8\">\n        <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n        <link rel=\"mask-icon\" href=\"/img/pinned-tab.svg\" color=\"#171A21\">\n        <meta name=\"theme-color\" content=\"#171A21\">\n        <link rel=\"manifest\" href=\"/manifest.json\">\n        <meta property=\"og:site_name\" content=\"Spectrum\">\n        <meta name=\"twitter:card\" content=\"summary\">\n        <meta name=\"twitter:site\" content=\"@withspectrum\">\n        <meta name=\"twitter:image:alt\" content=\"Where communities are built\">\n        <link rel=\"apple-touch-icon-precomposed\" sizes=\"57x57\" href=\"/img/apple-icon-57x57-precomposed.png\" />\n        <link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"/img/apple-icon-72x72-precomposed.png\" />\n        <link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"/img/apple-icon-114x114-precomposed.png\" />\n        <link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"/img/apple-icon-144x144-precomposed.png\" />\n        ${metaTags}\n      </head>\n      <body>\n        <div id=\"root\">`;\n};\n\nexport const getFooter = ({\n  state,\n  data,\n  bundles,\n  nonce,\n}: {\n  state: Object,\n  data: Object,\n  bundles: Array<string>,\n  nonce: string,\n}) => {\n  return html`</div>\n      <script defer=\"defer\" src=\"https://cdn.ravenjs.com/3.14.0/raven.min.js\" crossorigin=\"anonymous\"></script>\n      <script defer=\"defer\" src=\"/install-raven.js\"></script>\n      <script nonce=\"${nonce}\">window.__SERVER_STATE__=${serialize(\n    state\n  )}</script>\n      <script nonce=\"${nonce}\">window.__DATA__=${serialize(data)}</script>\n      <script defer=\"defer\" type=\"text/javascript\" src=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.find,Symbol.iterator\"></script>\n      ${createScriptTag({ src: `/static/js/${bootstrapBundle}` })}\n      ${bundles.map(src => createScriptTag({ src }))}\n      ${createScriptTag({ src: `/static/js/${mainBundle}` })}\n    </body>\n    </html>\n  `;\n};\n"
  },
  {
    "path": "hyperion/renderer/index.js",
    "content": "// @flow\n// Server-side renderer for our React code\nconst debug = require('debug')('hyperion:renderer');\nimport React from 'react';\n// $FlowIssue\nimport { renderToNodeStream } from 'react-dom/server';\nimport { ServerStyleSheet } from 'styled-components';\nimport { ApolloProvider, getDataFromTree } from 'react-apollo';\nimport { ApolloClient } from 'apollo-client';\nimport { SchemaLink } from 'apollo-link-schema';\nimport schema from 'api/schema';\nimport createLoaders from 'api/loaders';\nimport { createHttpLink } from 'apollo-link-http';\nimport {\n  InMemoryCache,\n  IntrospectionFragmentMatcher,\n} from 'apollo-cache-inmemory';\nimport { StaticRouter } from 'react-router';\nimport { Provider } from 'react-redux';\nimport { HelmetProvider } from 'react-helmet-async';\nimport Loadable from 'react-loadable';\nimport { getBundles } from 'react-loadable/webpack';\nimport Raven from 'shared/raven';\nimport introspectionQueryResultData from 'shared/graphql/schema.json';\n// $FlowIssue\nimport stats from '../../build/react-loadable.json';\n\nimport getSharedApolloClientOptions from 'shared/graphql/apollo-client-options';\nimport { getFooter, getHeader } from './html-template';\n\n// Browser shim has to come before any client imports\nimport './browser-shim';\nconst Routes = require('../../src/routes').default;\nimport { initStore } from '../../src/store';\n\nconst IN_MAINTENANCE_MODE =\n  process.env.REACT_APP_MAINTENANCE_MODE === 'enabled';\nconst IS_PROD = process.env.NODE_ENV === 'production';\nconst FORCE_DEV = process.env.FORCE_DEV;\nconst FIVE_MINUTES = 300;\nconst ONE_HOUR = 3600;\n\nif (!IS_PROD || FORCE_DEV) debug('Querying API at localhost:3001/api');\n\nconst renderer = (req: express$Request, res: express$Response) => {\n  res.setHeader('Content-Type', 'text/html; charset=utf-8');\n\n  if (IN_MAINTENANCE_MODE) {\n    res.status(500);\n    res.send(\n      `<!DOCTYPE html><html><head><title>Spectrum</title> <style>body{margin: 0;}html{-webkit-font-smoothing: antialiased; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';}h1, p{line-height: 1.5;}.container{background: rgb(56,24,229);background: linear-gradient(90deg, rgba(56,24,229,1) 0%, rgba(56,24,229,0.8029586834733894) 52%, rgba(56,24,229,1) 100%); width: 100%; display: flex; height: 100vh; justify-content: center;}.item{color: white; font-weight: bold; align-self: center; text-align: center;}a{color: white;}span{font-size: 40px; padding: 0; margin: 0;}</style></head><body> <div class=\"container\"> <div class=\"item\"> <span>🛠</span> <h1>We are currently undergoing maintenance.</h1> <p>We'll be back shortly. Follow <a href=\"https://twitter.com/withspectrum\">@withspectrum on Twitter</a> to stay up to date. </p></div></div></body></html>`\n    );\n    return;\n  }\n\n  debug(`server-side render ${req.url}`);\n  debug(`querying API at https://${req.hostname}/api`);\n  const schemaLink = new SchemaLink({\n    schema,\n    context: {\n      user: req.user || null,\n      loaders: createLoaders(),\n    },\n  });\n\n  const cache = new InMemoryCache({\n    fragmentMatcher: new IntrospectionFragmentMatcher({\n      introspectionQueryResultData,\n    }),\n    ...getSharedApolloClientOptions(),\n  });\n\n  // Get the nonce attached to every request\n  // This nonce is generated by our security middleware\n  const nonce =\n    typeof res.locals.nonce === 'string' ? res.locals.nonce : undefined;\n\n  if (!nonce) throw new Error('Security nonce not set.');\n\n  // Create an Apollo Client with a local network interface\n  const client = new ApolloClient({\n    ssrMode: true,\n    link: schemaLink,\n    cache,\n  });\n  // Define the initial redux state\n  const { t } = req.query;\n\n  const initialReduxState = {};\n  // Create the Redux store\n  const store = initStore(initialReduxState);\n  let modules = [];\n  const report = moduleName => {\n    modules.push(moduleName);\n  };\n  let routerContext = {};\n  let helmetContext = {};\n  // Initialise the styled-components stylesheet and wrap the app with it\n  const sheet = new ServerStyleSheet();\n  const frontend = sheet.collectStyles(\n    <Loadable.Capture report={report}>\n      <ApolloProvider client={client}>\n        <HelmetProvider context={helmetContext}>\n          <Provider store={store}>\n            <StaticRouter location={req.url} context={routerContext}>\n              <Routes maintenanceMode={IN_MAINTENANCE_MODE} />\n            </StaticRouter>\n          </Provider>\n        </HelmetProvider>\n      </ApolloProvider>\n    </Loadable.Capture>\n  );\n\n  debug('get data from tree');\n  getDataFromTree(frontend)\n    .then(() => {\n      debug('got data from tree');\n      if (routerContext.url) {\n        debug('found redirect on frontend, redirecting');\n        // Somewhere a `<Redirect>` was rendered, so let's redirect server-side\n        res.redirect(301, routerContext.url);\n        return;\n      }\n      // maintenance mode\n      if (IN_MAINTENANCE_MODE) {\n        debug('maintenance mode enabled, sending 503');\n        res.status(503);\n        res.set('Retry-After', '3600');\n      } else {\n        res.status(200);\n      }\n      const state = store.getState();\n      const data = client.extract();\n      const { helmet } = helmetContext;\n      debug('write header');\n      // Use now's CDN to cache the rendered pages in CloudFlare for half an hour\n      // Ref https://vercel.co/docs/features/cdn\n      if (!req.user) {\n        res.setHeader(\n          'Cache-Control',\n          `s-maxage=${ONE_HOUR}, stale-while-revalidate=${FIVE_MINUTES}, must-revalidate`\n        );\n      } else {\n        res.setHeader('Cache-Control', 's-maxage=0, private');\n      }\n\n      res.write(\n        getHeader({\n          metaTags:\n            helmet.title.toString() +\n            helmet.meta.toString() +\n            helmet.link.toString(),\n          nonce: nonce,\n        })\n      );\n\n      const stream = sheet.interleaveWithNodeStream(\n        renderToNodeStream(frontend)\n      );\n\n      stream.pipe(\n        res,\n        { end: false }\n      );\n\n      const bundles = getBundles(stats, modules)\n        // Create <script defer> tags from bundle objects\n        .map(bundle => `/${bundle.file.replace(/\\.map$/, '')}`)\n        // Make sure only unique bundles are included\n        .filter((value, index, self) => self.indexOf(value) === index);\n      debug('bundles used:', bundles.join(','));\n      stream.on('end', () =>\n        res.end(\n          getFooter({\n            state,\n            data,\n            bundles,\n            nonce: nonce,\n          })\n        )\n      );\n    })\n    .catch(err => {\n      // Avoid memory leaks, see https://github.com/styled-components/styled-components/issues/1624#issuecomment-425382979\n      sheet.seal();\n      console.error(err);\n      const sentryId =\n        process.env.NODE_ENV === 'production'\n          ? Raven.captureException(err)\n          : 'Only output in production.';\n      res.status(500);\n      res.send(\n        `<!DOCTYPE html><html><head><title>Spectrum</title> <style>body{margin: 0;}html{-webkit-font-smoothing: antialiased; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';}h1, p{line-height: 1.5;}.container{background: rgb(56,24,229);background: linear-gradient(90deg, rgba(56,24,229,1) 0%, rgba(56,24,229,0.8029586834733894) 52%, rgba(56,24,229,1) 100%); width: 100%; display: flex; height: 100vh; justify-content: center;}.item{color: white; font-weight: bold; align-self: center; text-align: center;}a{color: white;}span{font-size: 40px; padding: 0; margin: 0;}</style></head><body> <div class=\"container\"> <div class=\"item\"> <span>😢</span> <h1>Oops, something went wrong. Sorry!</h1> <p>Please refresh the page.</p></div></div></body></html>`\n      );\n    });\n};\n\nexport default renderer;\n"
  },
  {
    "path": "jest.config.js",
    "content": "// @flow\n// The Jest configuration\nconst path = require('path');\n\nmodule.exports = {\n  setupTestFrameworkScriptFile: path.resolve(\n    __dirname,\n    './shared/testing/setup-test-framework'\n  ),\n  globalSetup: path.resolve(__dirname, './shared/testing/setup'),\n  globalTeardown: path.resolve(__dirname, './shared/testing/teardown'),\n  testPathIgnorePatterns: ['/node_modules/', '/mutations/'],\n  testURL: 'http://localhost/',\n};\n"
  },
  {
    "path": "now-secrets.example.json",
    "content": "{\n  \"@twitter-oauth-client-secret-development\": \"uwjAMUwcX8ZhhYq0Vlnq2fLNwV3CfONB8Tjzo2LW42JlVc2uKJ\",\n  \"@facebook-oauth-client-id-development\": \"231715924020859\",\n  \"@facebook-oauth-client-secret-development\": \"0c3a5b3521fe79636b568f3f4db67f2b\",\n  \"@google-oauth-client-secret-development\": \"i7H7ZLfntkIEp7kyyNsvyH3O\",\n  \"@github-oauth-client-secret-development\": \"789f3a4b5772e978acd135fe7c86886e62f688c7\",\n  \"@session-cookie-secret\": \"this-is-an-example-secret\",\n  \"@api-token-secret\": \"this-is-another-example-secret-string\"\n}\n"
  },
  {
    "path": "now.json",
    "content": "{\n  \"version\": 1,\n  \"scale\": {\n    \"sfo1\": {\n      \"min\": 1,\n      \"max\": \"auto\"\n    }\n  },\n  \"env\": {\n    \"DEBUG\": \"shared:rethinkdb:db-query-cache\",\n    \"S3_TOKEN\": \"@s3-token\",\n    \"S3_SECRET\": \"@s3-secret\",\n    \"COMPOSE_RETHINKDB_PASSWORD\": \"@new-compose-rethinkdb-password\",\n    \"COMPOSE_RETHINKDB_URL\": \"@new-compose-rethinkdb-url\",\n    \"COMPOSE_RETHINKDB_PORT\": \"@new-compose-rethinkdb-port\",\n    \"BACKUP_RETHINKDB_URL\": \"@new-backup-compose-rethinkdb-url\",\n    \"BACKUP_RETHINKDB_PORT\": \"@new-backup-compose-rethinkdb-port\",\n    \"AWS_RETHINKDB_PASSWORD\": \"@aws-rethinkdb-password\",\n    \"AWS_RETHINKDB_URL\": \"@aws-rethinkdb-url\",\n    \"AWS_RETHINKDB_PORT\": \"@aws-rethinkdb-port\",\n    \"COMPOSE_REDIS_PASSWORD\": \"@compose-redis-password\",\n    \"COMPOSE_REDIS_URL\": \"@compose-redis-url\",\n    \"COMPOSE_REDIS_PORT\": \"@compose-redis-port\",\n    \"COMPOSE_API_TOKEN\": \"@compose-api-token\",\n    \"REDIS_LABS_JOB_QUEUE_PASSWORD\": \"@redis-labs-job-queue-password\",\n    \"REDIS_LABS_JOB_QUEUE_URL\": \"@redis-labs-job-queue-url\",\n    \"REDIS_LABS_JOB_QUEUE_PORT\": \"@redis-labs-job-queue-port\",\n    \"REDIS_CACHE_PORT\": \"@redis-labs-port\",\n    \"REDIS_CACHE_URL\": \"@redis-labs-url\",\n    \"REDIS_CACHE_PASSWORD\": \"@redis-labs-password\",\n    \"VAPID_PUBLIC_KEY\": \"@vapid-public-key\",\n    \"VAPID_PRIVATE_KEY\": \"@vapid-private-key\",\n    \"OPTICS_API_KEY\": \"@optics-api-key\",\n    \"TWITTER_OAUTH_CLIENT_SECRET\": \"@twitter-oauth-client-secret\",\n    \"FACEBOOK_OAUTH_CLIENT_ID\": \"@facebook-oauth-client-id\",\n    \"FACEBOOK_OAUTH_CLIENT_SECRET\": \"@facebook-oauth-client-secret\",\n    \"GOOGLE_OAUTH_CLIENT_SECRET\": \"@google-oauth-client-secret\",\n    \"GITHUB_OAUTH_CLIENT_SECRET\": \"@github-oauth-client-secret\",\n    \"GITHUB_OAUTH_CLIENT_ID\": \"@github-oauth-client-id\",\n    \"TWITTER_OAUTH_CLIENT_SECRET_DEVELOPMENT\": \"@twitter-oauth-client-secret-development\",\n    \"FACEBOOK_OAUTH_CLIENT_ID_DEVELOPMENT\": \"@facebook-oauth-client-id-development\",\n    \"FACEBOOK_OAUTH_CLIENT_SECRET_DEVELOPMENT\": \"@facebook-oauth-client-secret-development\",\n    \"GOOGLE_OAUTH_CLIENT_SECRET_DEVELOPMENT\": \"@google-oauth-client-secret-development\",\n    \"GITHUB_OAUTH_CLIENT_SECRET_DEVELOPMENT\": \"@github-oauth-client-secret-development\",\n    \"SLACK_SECRET\": \"@slack-secret\",\n    \"SLACK_SECRET_DEVELOPMENT\": \"@slack-secret-development\",\n    \"SENDGRID_API_KEY\": \"@sendgrid-api-key\",\n    \"EMAIL_JWT_SIGNATURE\": \"@email-jwt-signature\",\n    \"PERSPECTIVE_API_KEY\": \"@perspective-api-key\",\n    \"SESSION_COOKIE_SECRET\": \"@session-cookie-secret\",\n    \"API_TOKEN_SECRET\": \"@api-token-secret\",\n    \"SENTRY_DSN_CLIENT\": \"@sentry-dsn-client\",\n    \"SENTRY_DSN_SERVER\": \"@sentry-dsn-server\",\n    \"ENCRYPTION_KEY\": \"@encryption-key\",\n    \"IMGIX_PROXY_SECURITY_KEY\": \"@imgix-proxy-security-key\",\n    \"IMGIX_SECURITY_KEY\": \"@imgix-security-key\",\n    \"DATADOG_API_KEY\": \"@datadog-api-key\"\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"Spectrum\",\n  \"version\": \"3.1.15\",\n  \"license\": \"BSD-3-Clause\",\n  \"devDependencies\": {\n    \"@babel/preset-flow\": \"^7.0.0\",\n    \"babel-cli\": \"^6.24.1\",\n    \"babel-eslint\": \"^8.2.6\",\n    \"babel-jest\": \"^22.4.4\",\n    \"babel-plugin-import-inspector\": \"^2.0.0\",\n    \"babel-plugin-inline-import-graphql-ast\": \"^2.0.4\",\n    \"babel-plugin-react-remove-properties\": \"^0.3.0\",\n    \"babel-plugin-styled-components\": \"^1.8.0\",\n    \"babel-plugin-syntax-async-generators\": \"^6.13.0\",\n    \"babel-plugin-syntax-dynamic-import\": \"^6.18.0\",\n    \"babel-plugin-transform-async-generator-functions\": \"^6.24.1\",\n    \"babel-plugin-transform-class-properties\": \"^6.24.1\",\n    \"babel-plugin-transform-flow-strip-types\": \"^6.22.0\",\n    \"babel-plugin-transform-object-rest-spread\": \"^6.23.0\",\n    \"babel-preset-env\": \"^1.7.0\",\n    \"backpack-core\": \"^0.4.1\",\n    \"bundle-buddy-webpack-plugin\": \"^0.3.0\",\n    \"cheerio\": \"^1.0.0-rc.2\",\n    \"circular-dependency-plugin\": \"4.x\",\n    \"cpy-cli\": \"^2.0.0\",\n    \"cross-env\": \"^5.2.0\",\n    \"cypress-plugin-retries\": \"^1.2.0\",\n    \"eslint\": \"^4.1.1\",\n    \"eslint-config-react-app\": \"^2.1.0\",\n    \"eslint-plugin-flowtype\": \"^2.50.3\",\n    \"eslint-plugin-import\": \"^2.14.0\",\n    \"eslint-plugin-jest\": \"^21.25.1\",\n    \"eslint-plugin-jsx-a11y\": \"^5.1.1\",\n    \"eslint-plugin-promise\": \"^3.8.0\",\n    \"eslint-plugin-react\": \"^7.12.4\",\n    \"flow-bin\": \"0.66\",\n    \"forever\": \"^0.15.3\",\n    \"is-html\": \"^1.1.0\",\n    \"lint-staged\": \"^3.3.0\",\n    \"micromatch\": \"^3.0.4\",\n    \"prettier\": \"^1.14.3\",\n    \"raw-loader\": \"^0.5.1\",\n    \"react-app-rewire-hot-loader\": \"^1.0.3\",\n    \"react-hot-loader\": \"^4.12.13\",\n    \"react-scripts\": \"^1.1.5\",\n    \"rimraf\": \"^2.6.1\",\n    \"sw-precache-webpack-plugin\": \"^0.11.4\",\n    \"uuid\": \"^3.0.1\",\n    \"wait-on\": \"^2.1.0\",\n    \"webpack-bundle-analyzer\": \"^3.3.2\",\n    \"write-file-webpack-plugin\": \"^4.5.1\"\n  },\n  \"dependencies\": {\n    \"@cypress/browserify-preprocessor\": \"^1.1.2\",\n    \"@sendgrid/mail\": \"^6.3.1\",\n    \"@tippy.js/react\": \"^2.1.1\",\n    \"apollo-cache-inmemory\": \"^1.6.3\",\n    \"apollo-client\": \"^2.6.4\",\n    \"apollo-link\": \"^1.2.13\",\n    \"apollo-link-http\": \"^1.5.16\",\n    \"apollo-link-retry\": \"^2.2.15\",\n    \"apollo-link-schema\": \"^1.2.4\",\n    \"apollo-link-ws\": \"^1.0.19\",\n    \"apollo-server-cache-redis\": \"^1.1.4\",\n    \"apollo-server-express\": \"^2.9.12\",\n    \"apollo-server-plugin-response-cache\": \"^0.3.8\",\n    \"apollo-upload-client\": \"^11.0.0\",\n    \"apollo-upload-server\": \"^7.1.0\",\n    \"apollo-utilities\": \"^1.3.2\",\n    \"aws-sdk\": \"2.336.0\",\n    \"axios\": \"^0.19.0\",\n    \"b2a\": \"^1.0.10\",\n    \"bad-words\": \"^1.6.4\",\n    \"body-parser\": \"^1.18.3\",\n    \"casual\": \"^1.5.19\",\n    \"common-tags\": \"^1.8.0\",\n    \"cookie-parser\": \"^1.4.3\",\n    \"cookie-session\": \"^2.0.0-beta.3\",\n    \"cors\": \"^2.8.3\",\n    \"cryptr\": \"^3.0.0\",\n    \"css.escape\": \"^1.5.1\",\n    \"cypress\": \"^3.6.1\",\n    \"datadog-metrics\": \"^0.8.1\",\n    \"dataloader\": \"^1.4.0\",\n    \"debounce\": \"^1.2.0\",\n    \"debug\": \"^4.1.0\",\n    \"decode-uri-component\": \"^0.2.0\",\n    \"draft-js\": \"npm:draft-js-fork-mxstbr\",\n    \"draft-js-code-editor-plugin\": \"0.2.1\",\n    \"draft-js-drag-n-drop-plugin\": \"^2.0.3\",\n    \"draft-js-embed-plugin\": \"^1.2.0\",\n    \"draft-js-export-markdown\": \"^1.4.0\",\n    \"draft-js-focus-plugin\": \"^2.2.0\",\n    \"draft-js-image-plugin\": \"^2.0.6\",\n    \"draft-js-import-markdown\": \"^1.3.1\",\n    \"draft-js-linkify-plugin\": \"^2.0.2\",\n    \"draft-js-markdown-plugin\": \"^3.0.5\",\n    \"draft-js-plugins-editor\": \"^2.1.1\",\n    \"draft-js-prism-plugin\": \"0.1.3\",\n    \"draftjs-to-markdown\": \"^0.5.1\",\n    \"emoji-regex\": \"^6.1.1\",\n    \"escape-html\": \"^1.0.3\",\n    \"eslint-plugin-node\": \"^6.0.1\",\n    \"eslint-plugin-standard\": \"^3.1.0\",\n    \"express\": \"^4.16.4\",\n    \"express-enforces-ssl\": \"^1.1.0\",\n    \"express-hot-shots\": \"^1.0.2\",\n    \"express-session\": \"^1.15.2\",\n    \"faker\": \"^4.1.0\",\n    \"find-with-regex\": \"^1.0.2\",\n    \"flow-typed\": \"^2.6.2\",\n    \"graphql\": \"0.13.x\",\n    \"graphql-cost-analysis\": \"^1.0.2\",\n    \"graphql-date\": \"^1.0.3\",\n    \"graphql-depth-limit\": \"^1.1.0\",\n    \"graphql-log\": \"0.1.3\",\n    \"graphql-tag\": \"^2.10.0\",\n    \"graphql-tools\": \"^4.0.3\",\n    \"helmet\": \"^3.14.0\",\n    \"highlight.js\": \"^9.13.1\",\n    \"history\": \"^4.6.1\",\n    \"hoist-non-react-statics\": \"^2.3.1\",\n    \"host-validation\": \"^1.1.0\",\n    \"hot-shots\": \"^5.9.2\",\n    \"hpp\": \"^0.2.2\",\n    \"hsts\": \"^2.1.0\",\n    \"http-proxy-middleware\": \"^1.0.4\",\n    \"idx\": \"^2.4.0\",\n    \"imgix-core-js\": \"^1.0.6\",\n    \"ioredis\": \"3.2.2\",\n    \"isomorphic-fetch\": \"^2.2.1\",\n    \"jest\": \"22.4.3\",\n    \"json-stringify-pretty-compact\": \"^1.2.0\",\n    \"jsonwebtoken\": \"^8.3.0\",\n    \"keygrip\": \"^1.0.3\",\n    \"linkify-it\": \"^2.2.0\",\n    \"lodash\": \"^4.17.15\",\n    \"lodash.intersection\": \"^4.4.0\",\n    \"moment\": \"^2.22.2\",\n    \"ms\": \"^2.1.1\",\n    \"node-env-file\": \"^0.1.8\",\n    \"now-env\": \"^3.1.0\",\n    \"offline-plugin\": \"^5.0.5\",\n    \"passport\": \"^0.4.0\",\n    \"passport-facebook\": \"^2.1.1\",\n    \"passport-github2\": \"^0.1.10\",\n    \"passport-google-oauth2\": \"^0.1.6\",\n    \"passport-twitter\": \"^1.0.4\",\n    \"pre-commit\": \"^1.2.2\",\n    \"prism-react-renderer\": \"^0.1.7\",\n    \"prismjs\": \"^1.15.0\",\n    \"query-string\": \"5.1.1\",\n    \"raf\": \"^3.4.0\",\n    \"raven\": \"^2.6.4\",\n    \"react\": \"^16.8.4\",\n    \"react-apollo\": \"^2.5.1\",\n    \"react-app-rewire-styled-components\": \"^3.0.0\",\n    \"react-app-rewired\": \"1.6.2\",\n    \"react-async-hook\": \"^1.0.0\",\n    \"react-clipboard.js\": \"^2.0.1\",\n    \"react-dom\": \"npm:@hot-loader/react-dom\",\n    \"react-dropzone\": \"^8.0.3\",\n    \"react-flip-move\": \"^3.0.2\",\n    \"react-helmet-async\": \"^0.2.0\",\n    \"react-image\": \"^1.5.1\",\n    \"react-infinite-scroller\": \"^1.2.4\",\n    \"react-infinite-scroller-fork-mxstbr\": \"^1.2.7\",\n    \"react-infinite-scroller-with-scroll-element\": \"2.0.2\",\n    \"react-loadable\": \"^5.5.0\",\n    \"react-mentions\": \"^4.0.1\",\n    \"react-modal\": \"^3.7.1\",\n    \"react-popper\": \"^1.3.3\",\n    \"react-redux\": \"^5.0.2\",\n    \"react-router\": \"4.x\",\n    \"react-router-dom\": \"4.x\",\n    \"react-textarea-autosize\": \"^6.1.0\",\n    \"react-transition-group\": \"^2.5.0\",\n    \"react-trend\": \"^1.2.4\",\n    \"react-visibility-sensor\": \"^5.0.1\",\n    \"recompose\": \"^0.27.1\",\n    \"redis-tag-cache\": \"^1.2.1\",\n    \"redraft\": \"0.10.2\",\n    \"redux\": \"^3.6.0\",\n    \"redux-thunk\": \"^2.3.0\",\n    \"request\": \"^2.88.0\",\n    \"request-ip\": \"^2.1.3\",\n    \"rethinkdb-changefeed-reconnect\": \"^0.3.2\",\n    \"rethinkdb-inspector\": \"^0.3.3\",\n    \"rethinkdb-migrate\": \"^1.4.0\",\n    \"rethinkhaberdashery\": \"^2.3.32\",\n    \"sanitize-filename\": \"^1.6.3\",\n    \"serialize-javascript\": \"^1.5.0\",\n    \"session-rethinkdb\": \"^2.0.0\",\n    \"sha1\": \"^1.1.1\",\n    \"slate\": \"^0.20.1\",\n    \"slate-markdown\": \"0.1.1\",\n    \"slugg\": \"^1.1.0\",\n    \"snarkdown\": \"^1.2.2\",\n    \"stopword\": \"^0.1.13\",\n    \"string-replace-to-array\": \"^1.0.3\",\n    \"string-similarity\": \"^2.0.0\",\n    \"striptags\": \"2.x\",\n    \"styled-components\": \"^4.1.3\",\n    \"subscriptions-transport-ws\": \"^0.9.15\",\n    \"textversionjs\": \"^1.1.3\",\n    \"then-queue\": \"^1.3.0\",\n    \"toobusy-js\": \"^0.5.1\",\n    \"validator\": \"^9.0.0\",\n    \"web-push\": \"^3.3.3\"\n  },\n  \"resolutions\": {\n    \"immutable\": \"3.7.4\",\n    \"draft-js\": \"npm:draft-js-fork-mxstbr\",\n    \"jest-environment-node\": \"22.4.3\",\n    \"jest\": \"22.4.3\",\n    \"fbjs\": \"0.8.16\",\n    \"event-stream\": \"3.3.4\"\n  },\n  \"scripts\": {\n    \"start\": \"NODE_ENV=production node main.js\",\n    \"start:api\": \"cross-env NODE_ENV=production node build-api/main.js\",\n    \"dev:web\": \"cross-env NODE_PATH=./ react-app-rewired start\",\n    \"dev:api\": \"cross-env FILE_STORAGE=local cross-env NODE_PATH=./ cross-env NODE_ENV=development cross-env DEBUG=build*,api*,shared:rethinkdb:db-query-cache,-api:resolvers cross-env DIR=api backpack\",\n    \"dev:api:s3\": \"cross-env FILE_STORAGE=s3 cross-env NODE_PATH=./ cross-env NODE_ENV=development cross-env DEBUG=build*,api*,shared:rethinkdb:db-query-cache,-api:resolvers cross-env DIR=api backpack\",\n    \"dev:hyperion\": \"cross-env NODE_PATH=./ cross-env NODE_ENV=development cross-env DEBUG=build*,hyperion*,-hyperion:resolvers cross-env DIR=hyperion backpack\",\n    \"prebuild:api\": \"rimraf build-api\",\n    \"build:api\": \"cross-env NODE_PATH=./ cross-env DIR=api backpack build\",\n    \"postbuild:api\": \"cp api/package.json build-api/package.json && cp now.json build-api/now.json && cpy cacert build-api\",\n    \"prebuild:hyperion\": \"rimraf build && yarn run build:web && rimraf build-hyperion\",\n    \"build:hyperion\": \"cross-env NODE_PATH=./ cross-env DIR=hyperion backpack build\",\n    \"postbuild:hyperion\": \"cp -r build build-hyperion && cp now.json build-hyperion && cp yarn.lock build-hyperion && cp package.json build-hyperion && cp cacert build-hyperion\",\n    \"build:web\": \"cross-env NODE_PATH=./ react-app-rewired build\",\n    \"jest\": \"cross-env NODE_PATH=./ jest\",\n    \"test\": \"npm run jest -- --runInBand --watch\",\n    \"test:ci\": \"npm run jest -- --forceExit --outputFile test-results.json --json --maxWorkers=2\",\n    \"test:e2e\": \"CYPRESS_RETRIES=2 cypress run\",\n    \"prestart:api:test\": \"node -e \\\"require('./shared/testing/setup.js')().then(() => process.exit())\\\"\",\n    \"start:api:test\": \"TEST_DB=true FORCE_DEV=true DEBUG=api*,shared* forever build-api/main.js\",\n    \"cypress:open\": \"cypress open\",\n    \"cypress:install\": \"cypress install\",\n    \"lint\": \"eslint .\",\n    \"flow\": \"flow\",\n    \"db:migrate\": \"npm run rethinkdb:migrate -- up\",\n    \"db:drop\": \"npm run rethinkdb:migrate -- down\",\n    \"db:seed\": \"cross-env NODE_PATH=./ node api/migrations/seed/index.js\",\n    \"db:reset\": \"yarn run db:drop && yarn run db:migrate && yarn run db:seed\",\n    \"rethinkdb:migrate\": \"rethinkdb-migrate -f ./api/migrations/config.js\",\n    \"eject\": \"react-scripts eject\",\n    \"lint:staged\": \"lint-staged\",\n    \"webpack-defaults\": \"webpack-defaults\",\n    \"deploy\": \"node scripts/deploy\",\n    \"heroku\": \"node scripts/heroku-deploy\"\n  },\n  \"lint-staged\": {\n    \"*.js\": [\n      \"prettier --write\",\n      \"eslint --fix\",\n      \"git add\"\n    ]\n  },\n  \"pre-commit\": \"lint:staged\"\n}\n"
  },
  {
    "path": "public/index.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel='mask-icon' href='%PUBLIC_URL%/img/pinned-tab.svg' color='#171A21'>\n  <meta name=\"theme-color\" content=\"#171A21\">\n  <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\">\n  <!-- Open Graph -->\n  <meta property=\"og:site_name\" content=\"Spectrum\">\n  <!-- Twitter -->\n  <meta name=\"twitter:card\" content=\"summary\">\n  <meta name=\"twitter:site\" content=\"@withspectrum\">\n  <meta name=\"twitter:image:alt\" content=\"Where communities are built\">\n  <!-- Favicon -->\n  <link rel=\"apple-touch-icon-precomposed\" sizes=\"57x57\" href=\"%PUBLIC_URL%/img/apple-icon-57x57-precomposed.png\" />\n  <link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"%PUBLIC_URL%/img/apple-icon-72x72-precomposed.png\" />\n  <link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"%PUBLIC_URL%/img/apple-icon-114x114-precomposed.png\" />\n  <link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"%PUBLIC_URL%/img/apple-icon-144x144-precomposed.png\" />\n</head>\n\n<body>\n  <div id=\"root\"></div>\n  <script defer=\"defer\" src=\"https://cdn.ravenjs.com/3.14.0/raven.min.js\" crossorigin=\"anonymous\"></script>\n  <script defer=\"defer\" src=\"/install-raven.js\"></script>\n  <script defer=\"defer\" type=\"text/javascript\"\n    src=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=default,Array.prototype.find,Symbol.iterator\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "public/install-raven.js",
    "content": "Raven.config('https://3bd8523edd5d43d7998f9b85562d6924@sentry.io/154812', {\n  whitelistUrls: [/spectrum.chat/, /www.spectrum.chat/],\n}).install();\n"
  },
  {
    "path": "public/manifest.json",
    "content": "{\n  \"short_name\": \"Spectrum\",\n  \"name\": \"Spectrum\",\n  \"icons\": [\n    {\n      \"src\": \"/img/homescreen-icon-57x57.png\",\n      \"sizes\": \"57x57\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/homescreen-icon-72x72.png\",\n      \"sizes\": \"72x72\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/homescreen-icon-114x114.png\",\n      \"sizes\": \"114x114\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/homescreen-icon-144x144.png\",\n      \"sizes\": \"144x144\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/homescreen-icon-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/homescreen-icon-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\"\n    },\n    {\n      \"src\": \"/img/apple-icon-57x57-precomposed.png\",\n      \"sizes\": \"57x57\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/img/apple-icon-72x72-precomposed.png\",\n      \"sizes\": \"72x72\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/img/apple-icon-114x114-precomposed.png\",\n      \"sizes\": \"114x114\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/img/apple-icon-144x144-precomposed.png\",\n      \"sizes\": \"144x144\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/img/apple-icon-192x192-precomposed.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/img/apple-icon-512x512-precomposed.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    }\n  ],\n  \"start_url\": \"/?utm_source=homescreen\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#171A21\",\n  \"background_color\": \"#171A21\"\n}\n"
  },
  {
    "path": "public/push-sw.js",
    "content": "/*\n * Push notificiations ServiceWorker\n *\n * NOTE(@mxstbr): This only gets updated if you change the filename, not if you\n * update the contents. Make sure to change the version number in the filename\n * after updating the code!\n */\n\n// A new notification is coming in, yay!\n// eslint-disable-next-line\nself.addEventListener('push', function(event) {\n  var notificationData = {};\n\n  try {\n    notificationData = event.data.json();\n  } catch (e) {\n    console.log('event.data.json() failed', e);\n    // 🚨 We either got no data or it's malformatted, ABORT ABORT ABORT\n    return;\n  }\n\n  // Check if the user is looking at Spectrum right now and don't show a notification\n  event.waitUntil(\n    clients\n      .matchAll({\n        type: 'window',\n        includeUncontrolled: true,\n      })\n      .then(windowClients => {\n        for (let i = 0; i < windowClients.length; i++) {\n          const windowClient = windowClients[i];\n          // The user is looking at Spectrum right now abort showing the notification!\n          // (except for if we're on localhost, i.e. in development)\n          if (\n            windowClient.focused &&\n            // eslint-disable-next-line\n            !(self.registration.scope.indexOf('http://localhost:3000') === 0)\n          ) {\n            return;\n          }\n        }\n        // eslint-disable-next-line\n        return self.registration.showNotification(notificationData.title, {\n          vibrate: [200],\n          icon: '/img/apple-icon-144x144-precomposed.png',\n          badge: '/img/badge.png',\n          body: notificationData.body,\n          title: notificationData.title,\n          timestamp: notificationData.timestamp,\n          image: notificationData.image,\n          tag: notificationData.tag,\n          data: notificationData.data,\n          // If we don't set a tag and set renotify to true this'll throw an error\n          // renotify: notificationData.renotify || !!notificationData.tag,\n        });\n      })\n  );\n});\n\n// On notification click\n// eslint-disable-next-line\nself.addEventListener('notificationclick', function(event) {\n  event.notification.close();\n\n  const urlToOpen =\n    event.notification.data && event.notification.data.href\n      ? // eslint-disable-next-line\n        new URL(event.notification.data.href, self.location.origin).href\n      : '/';\n\n  // see if the current is open and if it is focus it\n  event.waitUntil(\n    // eslint-disable-next-line\n    self.clients\n      .matchAll({\n        type: 'window',\n        includeUncontrolled: true,\n      })\n      .then(function(clientList) {\n        // If there is an open Spectrum.chat window navigate to the notification href\n        if (clientList.length > 0) {\n          return clientList[0]\n            .focus()\n            .then(client => client.navigate(urlToOpen));\n        }\n        // If there's no open Spectrum.chat window open a new one\n        // eslint-disable-next-line\n        return self.clients.openWindow(urlToOpen);\n      })\n  );\n});\n"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:"
  },
  {
    "path": "public/service-worker.js",
    "content": "/* eslint-disable */\n// A simple, no-op service worker that takes immediate control.\n// from: https://stackoverflow.com/a/38980776\n\nself.addEventListener('install', () => {\n  // Skip over the \"waiting\" lifecycle state, to ensure that our\n  // new service worker is activated immediately, even if there's\n  // another tab open controlled by our older service worker code.\n  self.skipWaiting();\n});\n\nself.addEventListener('activate', () => {\n  // Get a list of all the current open windows/tabs under\n  // our service worker's control, and force them to reload.\n  // This can \"unbreak\" any open windows/tabs as soon as the new\n  // service worker activates, rather than users having to manually reload.\n  self.clients.matchAll({ type: 'window' }).then(windowClients => {\n    windowClients.forEach(windowClient => {\n      windowClient.navigate(windowClient.url);\n    });\n  });\n});\n"
  },
  {
    "path": "robots.txt",
    "content": "# This robots.txt file is used to disallow robots to crawl our staging environment alpha.spectrum.chat, which has the same content as the main site\nUser-agent: *\nDisallow: /\n"
  },
  {
    "path": "rules-alpha.json",
    "content": "{\n  \"rules\": [\n    { \"pathname\": \"/robots.txt\", \"dest\": \"robots.alpha.spectrum.chat\" },\n    { \"pathname\": \"/api\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"pathname\": \"/api/**\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"pathname\": \"/auth\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"pathname\": \"/auth/**\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"pathname\": \"/websocket\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"pathname\": \"/websocket/**\", \"dest\": \"api.alpha.spectrum.chat\" },\n    { \"dest\": \"hyperion.alpha.spectrum.chat\" }\n  ]\n}\n"
  },
  {
    "path": "rules.json",
    "content": "{\n  \"rules\": [\n    { \"pathname\": \"/api\", \"dest\": \"api.spectrum.chat\" },\n    { \"pathname\": \"/api/**\", \"dest\": \"api.spectrum.chat\" },\n    { \"pathname\": \"/auth\", \"dest\": \"api.spectrum.chat\" },\n    { \"pathname\": \"/auth/**\", \"dest\": \"api.spectrum.chat\" },\n    { \"pathname\": \"/websocket\", \"dest\": \"api.spectrum.chat\" },\n    { \"pathname\": \"/websocket/**\", \"dest\": \"api.spectrum.chat\" },\n    { \"dest\": \"hyperion.workers.spectrum.chat\" }\n  ]\n}\n"
  },
  {
    "path": "scripts/deploy.js",
    "content": "const { execSync } = require('child_process');\nconst path = require('path');\nconst parse = require('./utils/parse-argv');\nconst error = require('./utils/error');\n\n// Debug util\nconst exec = process.env.DEBUG\n  ? cmd => {\n      console.log(`[DEBUG] ${cmd}`);\n      return 'fake-url-asdf123.now.sh';\n    }\n  : execSync;\n// Append --scope space-program to all now commands\nconst now = (cmd = '') => `now ${cmd} --scope space-program`;\n\nconst VALID_SERVERS = ['all', 'api', 'hyperion'];\nconst VALID_ALPHA_SERVERS = ['api', 'hyperion'];\nconst { args, flags } = parse(process.argv);\n\nlet servers = args;\n\nif (servers.length === 0)\n  error(\n    'Server name missing',\n    `Please provide one of the following server names: ${VALID_SERVERS.map(\n      w => `\"${w}\"`\n    ).join(', ')}`\n  );\n\nservers.forEach(server => {\n  if (VALID_SERVERS.indexOf(server) === -1)\n    error(\n      `Cannot deploy unknown server \"${args[0]}\"`,\n      `Please provide one of the following server names: ${VALID_SERVERS.map(\n        w => `\"${w}\"`\n      ).join(', ')}`\n    );\n});\n\nif (flags.prod && servers.indexOf('all') > -1) {\n  servers = VALID_SERVERS.filter(w => w !== 'all');\n} else if (servers.indexOf('all') > -1) {\n  servers = VALID_ALPHA_SERVERS;\n}\n\nif (!flags.prod) {\n  servers.forEach(server => {\n    if (VALID_ALPHA_SERVERS.indexOf(server) === -1) {\n      error(\n        `Cannot deploy ${server} to alpha`,\n        'Did you mean to use the \"--prod\" flag?'\n      );\n    }\n  });\n  servers = servers.filter(server => VALID_ALPHA_SERVERS.indexOf(server) > -1);\n}\n\nconsole.log(`\\nDeploying to ${flags.prod ? 'production' : 'alpha'}!\\n`);\n\nif (servers.length > 0) {\n  console.log('Installing fresh dependencies...');\n  exec('yarn');\n  servers.forEach(server => {\n    const buildDir = path.join(__dirname, `../build-${server}`);\n    console.log(`\\n---${server}---`);\n    console.log(`Installing ${server} dependencies...`);\n    exec('yarn', {\n      cwd: path.join(__dirname, `../${server}`),\n    });\n    console.log(`Building ${server}...`);\n    exec(`yarn run build:${server}`);\n\n    console.log(`Deploying ${server}...`);\n    const stdout = exec(now(`build-${server} --debug`), {\n      stdio: 'pipe',\n    });\n\n    const alias =\n      server === 'api'\n        ? `api.${!flags.prod ? 'alpha.' : ''}spectrum.chat`\n        : `${server}.${\n            flags.prod === true ? 'workers' : 'alpha'\n          }.spectrum.chat`;\n    console.log(`Aliasing ${stdout.toString()} to ${alias}...`);\n    exec(now(`alias ${stdout.toString()} ${alias}`), {\n      cwd: buildDir,\n      stdio: 'inherit',\n    });\n\n    console.log(`${server} is live!`);\n\n    if (server === 'hyperion') {\n      console.log('Clearing hyperion cache...');\n      exec(\n        now(\n          `alias -r rules${!flags.prod ? '-alpha' : ''}.json ${\n            !flags.prod ? 'alpha.' : ''\n          }spectrum.chat`\n        ),\n        {\n          stdio: 'inherit',\n        }\n      );\n      console.log('Cache cleared!');\n    }\n    console.log('Deleting old deploy(s)...');\n    if (server === 'hyperion') {\n      exec(now(`rm --safe --yes Spectrum`), {\n        stdio: 'inherit',\n      });\n    } else {\n      exec(now(`rm --safe --yes build-${server}`), {\n        stdio: 'inherit',\n      });\n    }\n    console.log('Done!\\n');\n  });\n}\n"
  },
  {
    "path": "scripts/generate-table-diagram.js",
    "content": "const r = require('rethinkdbdash')();\nconst type = require('type-detect');\n\nconst REF_TABLE_MAP = {\n  creators: 'users',\n  authors: 'users',\n  senders: 'users',\n  communitys: 'communities',\n  watercoolers: 'threads',\n  parents: 'messages',\n};\n\n(async () => {\n  const tables = await r\n    .db('rethinkdb')\n    .table('table_config')\n    .filter({\n      db: 'spectrum',\n    })\n    .map(rec => rec('name'))\n    .run();\n\n  for (const table of tables) {\n    const [record] = await r\n      .db('spectrum')\n      .table(table)\n      .limit(1)\n      .run();\n\n    if (!record) {\n      // console.warn(`could not find record in table ${table}`);\n    } else {\n      let output = `Table ${table} {`;\n      Object.keys(record).forEach(key => {\n        let keyType =\n          key === 'id' || key.endsWith('Id')\n            ? 'uuid'\n            : key.endsWith('At')\n            ? 'Date'\n            : type(record[key]);\n        output += `\\n  ${key} ${keyType}`;\n        if (key.endsWith('Id')) {\n          let refTable = key.replace(/id$/i, '').toLowerCase() + 's';\n          refTable = REF_TABLE_MAP[refTable] || refTable;\n          if (tables.includes(refTable)) {\n            output += ` [ref: < ${refTable}.id]`;\n          }\n        }\n      });\n      output += `\\n}\\n`;\n      console.log(output);\n    }\n  }\n})()\n  .then(() => {\n    process.exit();\n  })\n  .catch(err => {\n    console.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "scripts/heroku-deploy.js",
    "content": "const { execSync } = require('child_process');\nconst error = require('./utils/error');\nconst parse = require('./utils/parse-argv');\nconst path = require('path');\n\nconst exec = cmd =>\n  execSync(cmd, { cwd: path.join(__dirname, '../'), stdio: 'inherit' });\n\nconst { args } = parse(process.argv);\n\nconst VALID_SERVERS = ['all', 'api', 'hyperion'];\n\nconst serverType = s => (['api', 'hyperion'].includes(s) ? 'web' : 'worker');\n\nlet servers = args;\n\n/*\n * Must provide at least one server\n */\nif (servers.length === 0)\n  error(\n    'Server name missing',\n    `Please provide one of the following server names: ${VALID_SERVERS.map(\n      s => `\"${s}\"`\n    ).join(', ')}`\n  );\n\n/*\n * Must provide valid server names\n */\nservers.forEach(s => {\n  if (VALID_SERVERS.indexOf(s) === -1)\n    error(\n      `Cannot deploy unknown server \"${args[0]}\"`,\n      `Please provide one of the following server names: ${VALID_SERVERS.map(\n        s => `\"${s}\"`\n      ).join(', ')}`\n    );\n});\n\n/*\n * Allow targetting all deployments\n */\nif (servers.indexOf('all') > -1) {\n  servers = VALID_SERVERS.filter(s => s !== 'all');\n}\n\nconsole.log(\n  `Deploying the following servers: ${servers.map(s => `\"${s}\"`).join(', ')}`\n);\n\n/*\n * Build and push Docker images for each server\n */\nservers.forEach(s => {\n  const type = serverType(s);\n\n  exec(\n    `docker build -t spectrum_${s} -t registry.heroku.com/spectrum-chat-${s}/${type} -f docker/Dockerfile.${s} .`\n  );\n\n  exec(`docker push registry.heroku.com/spectrum-chat-${s}/${type}`);\n});\n\n/*\n * Release new images for each server\n */\nservers.forEach(s => {\n  exec(`heroku container:release ${serverType(s)} -a spectrum-chat-${s}`);\n});\n"
  },
  {
    "path": "scripts/introspection-query.js",
    "content": "const fetch = require('node-fetch');\nconst fs = require('fs');\n\nfetch(`http://localhost:3001/api`, {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    query: `\n      {\n        __schema {\n          types {\n            kind\n            name\n            possibleTypes {\n              name\n            }\n          }\n        }\n      }\n    `,\n  }),\n})\n  .then(result => result.json())\n  .then(result => {\n    fs.writeFile(\n      './fragmentTypes.json',\n      JSON.stringify(result.data, null, 2),\n      err => {\n        if (err) console.error('Error writing fragmentTypes file', err);\n        console.log('Fragment types successfully extracted!');\n      }\n    );\n  });\n"
  },
  {
    "path": "scripts/utils/error.js",
    "content": "module.exports = (...args) => {\n  console.error('\\n🚨 Error:', args[0], '🚨\\n\\n', ...args.slice(1), '\\n');\n  process.exit(1);\n  return;\n};\n"
  },
  {
    "path": "scripts/utils/parse-argv.js",
    "content": "// Cheap process.argv parser\nmodule.exports = argv => {\n  const processArgs = argv.slice(2);\n  const args = processArgs.filter(arg => arg.indexOf('--') !== 0);\n  const flags = processArgs\n    .filter(arg => arg.indexOf('--') === 0)\n    .reduce((flags, flag) => {\n      flags[flag.replace(/^--/, '')] = true;\n      return flags;\n    }, {});\n\n  return { args, flags };\n};\n"
  },
  {
    "path": "set-heroku-config",
    "content": "#!/usr/bin/env bash\n\nset -e\n\nENV_FILE=.env\nheroku config:set -a spectrum-chat-hyperion $(cat $ENV_FILE | tr '\\n' ' ')\n"
  },
  {
    "path": "shared/clients/draft-js/links-decorator/core.js",
    "content": "// @flow\nimport React from 'react';\nimport linkStrategy from 'draft-js-linkify-plugin/lib/linkStrategy';\nimport normalizeUrl from '../../../normalize-url';\nimport type { ContentBlock } from 'draft-js/lib/ContentBlock';\nimport type { ContentState } from 'draft-js/lib/ContentState';\nimport type { ComponentType, Node } from 'react';\n\ntype DecoratorComponentProps = {\n  decoratedText: string,\n  contentState: ContentState,\n  entityKey?: string,\n  children?: Node,\n};\n\nexport type LinksDecoratorComponentProps = {\n  href: string,\n  children?: Node,\n};\n\nlet i = 0;\nconst createLinksDecorator = (\n  Component: ComponentType<LinksDecoratorComponentProps>\n) => ({\n  strategy: (\n    contentBlock: ContentBlock,\n    callback: (...args?: Array<any>) => any,\n    contentState: ContentState\n  ) => {\n    if (contentBlock.type === 'code-block') return;\n\n    if (contentBlock.findEntityRanges) {\n      contentBlock.findEntityRanges(char => {\n        const entityKey = char.getEntity();\n        return (\n          entityKey !== null &&\n          contentState.getEntity(entityKey).getType() === 'LINK'\n        );\n      }, callback);\n    }\n    linkStrategy(contentBlock, (start, end) => {\n      if (\n        contentBlock.entityRanges.find(\n          range => range.offset === start && range.length === end - start\n        )\n      )\n        return;\n      callback(start, end);\n    });\n  },\n  component: ({\n    decoratedText,\n    children,\n    entityKey,\n    contentState,\n  }: DecoratorComponentProps) => (\n    <Component\n      href={\n        entityKey\n          ? contentState.getEntity(entityKey).getData().url\n          : normalizeUrl(decoratedText)\n      }\n      children={children}\n      /* NOTE(@mxstbr): This is super hacky, but I couldn't find a way to give two URLs in the same message a different key. (i.e. \"I am on https://github.com https://github.com is great\" would only show the link once) */\n      key={`link-${i++}`}\n    />\n  ),\n});\n\nexport default createLinksDecorator;\n"
  },
  {
    "path": "shared/clients/draft-js/links-decorator/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport createLinksDecorator, {\n  type LinksDecoratorComponentProps,\n} from './core';\nimport { SPECTRUM_URLS } from 'shared/regexps';\n\nexport default createLinksDecorator((props: LinksDecoratorComponentProps) => {\n  const regexp = new RegExp(SPECTRUM_URLS, 'ig');\n  const match = regexp.exec(props.href);\n\n  if (match && match[0] && match[1])\n    return <Link to={match[1]}>{props.children}</Link>;\n\n  return (\n    <a href={props.href} target={'_blank'} rel={'noopener noreferrer'}>\n      {props.children}\n    </a>\n  );\n});\n"
  },
  {
    "path": "shared/clients/draft-js/mentions-decorator/core.js",
    "content": "// @flow\nimport React from 'react';\nimport { MENTIONS } from '../../../regexps';\nimport type { ComponentType, Node } from 'react';\nimport type { ContentBlock } from 'draft-js/lib/ContentBlock';\n\nexport type MentionComponentPropsType = {\n  username: string,\n  children: Node,\n};\n\ntype MentionsPosition = {\n  startPos: string,\n  endPos: string,\n};\n\n// Get all the position of the mentions from start to finish. With that array we can call the callback function.\nexport const getMentionsPositionsFromMessage = (\n  message: string\n): Array<MentionsPosition> => {\n  const mentionCoordinates = [];\n  const newMessage = message;\n\n  newMessage.replace(MENTIONS, (match, position) => {\n    mentionCoordinates.push({\n      startPos: position,\n      endPos: position + match.length,\n    });\n\n    return match;\n  });\n\n  return mentionCoordinates;\n};\n\nlet i = 0;\nconst createMentionsDecorator = (\n  Component: ComponentType<MentionComponentPropsType>\n) => ({\n  strategy: (\n    contentBlock: ContentBlock,\n    callback: (...args?: Array<any>) => any\n  ) => {\n    // This prevents the search for mentions when we're inside of a code-block\n    if (contentBlock.type === 'code-block') return;\n\n    // -> \"@brian_lovin, what's up with @mxstbr?\"\n    const text = contentBlock.getText();\n    // -> [\"@brian_lovin\", \" @mxstbr\"];\n    let matches = text.match(MENTIONS);\n\n    if (!matches || matches.length === 0) return;\n\n    matches = matches.filter(mention => !mention.startsWith('/'));\n\n    if (!matches || matches.length === 0) return;\n\n    const mentionCoordinates = getMentionsPositionsFromMessage(text);\n\n    mentionCoordinates.forEach(({ startPos, endPos }) => {\n      callback(startPos, endPos);\n    });\n  },\n  component: (props: { decoratedText: string, children: Node }) => (\n    <Component\n      username={props.decoratedText.substr(1)}\n      /* NOTE(@mxstbr): This is super hacky, but I couldn't find a way to give two mentions in the same message a different key. (i.e. \"Yo @mxstbr, where is @brianlovin at? I can't find @brianlovin\" would only show the mention once) */\n      key={`mention-${i++}`}\n    >\n      {props.children}\n    </Component>\n  ),\n});\n\nexport default createMentionsDecorator;\n"
  },
  {
    "path": "shared/clients/draft-js/mentions-decorator/index.js",
    "content": "// @flow\nimport createMentionsDecorator from './core';\nimport { Mention } from 'src/components/rich-text-editor/style.js';\n\nexport default createMentionsDecorator(Mention);\n"
  },
  {
    "path": "shared/clients/draft-js/mentions-decorator/test/core.test.js",
    "content": "//@flow\n\nimport { getMentionsPositionsFromMessage } from '../core';\n\ndescribe('mentions-decorator core', () => {\n  it('should return the start and and positions of mentions on a string', () => {\n    const message = 'Hello @ale @ange @ale @ange bye';\n    const expectedResult = [\n      {\n        startPos: 6,\n        endPos: 10,\n      },\n      {\n        startPos: 11,\n        endPos: 16,\n      },\n      {\n        startPos: 17,\n        endPos: 21,\n      },\n      {\n        startPos: 22,\n        endPos: 27,\n      },\n    ];\n\n    expect(getMentionsPositionsFromMessage(message)).toEqual(expectedResult);\n  });\n\n  it('should return an empty array if there are no mentions', () => {\n    const message = 'Hello one two three bye';\n    const expectedResult = [];\n\n    expect(getMentionsPositionsFromMessage(message)).toEqual(expectedResult);\n  });\n});\n"
  },
  {
    "path": "shared/clients/draft-js/mentions-decorator/test/mentions-decorator.test.js",
    "content": "// @flow\nimport { genKey, ContentBlock } from 'draft-js';\nimport mentionsDecorator from '../index';\nimport type { ContentBlock as ContentBlockType } from 'draft-js/lib/ContentBlock';\n\ntype Mention = string;\n\nconst createContentBlock = (text: string): ContentBlockType =>\n  new ContentBlock({\n    depth: 0,\n    text,\n    key: genKey(),\n    type: 'unstyled',\n  });\n\n// A little helper function to get the substringed mention text back\n// rather than a list of indizes\nconst getMentions = (text: string): Array<Mention> => {\n  const block = createContentBlock(text);\n  let mentions = [];\n  mentionsDecorator.strategy(block, (start, end) => {\n    mentions.push(text.substr(start, end - start));\n  });\n  return mentions;\n};\n\ndescribe('strategy', () => {\n  it('should return the start and end indizes of a mention', () => {\n    const text = '@mxstbr';\n    const block = createContentBlock(text);\n    let mentions = [];\n    mentionsDecorator.strategy(block, (start, end) => {\n      mentions.push({ start, end });\n    });\n    expect(mentions[0].start).toEqual(0);\n    expect(mentions[0].end).toEqual(7);\n  });\n\n  it('should handle a mention in the middle of a sentence', () => {\n    const text = 'Hey @mxstbr how are you?';\n    const mentions = getMentions(text);\n    expect(mentions[0]).toEqual('@mxstbr');\n  });\n\n  it('should handle a mention at the end of a sentence', () => {\n    const text = 'Hey @mxstbr';\n    const mentions = getMentions(text);\n    expect(mentions[0]).toEqual('@mxstbr');\n  });\n\n  it('should handle multiple mentions', () => {\n    const text = 'Hey @mxstbr and @brian how are you';\n    const mentions = getMentions(text);\n    expect(mentions[0]).toEqual('@mxstbr');\n    expect(mentions[1]).toEqual('@brian');\n  });\n\n  it('should allow special characters', () => {\n    const text = \"Hey I'm @john-doe, I also go by @john_doe or @john.doe\";\n    const mentions = getMentions(text);\n    expect(mentions).toEqual(['@john-doe', '@john_doe', '@john.doe']);\n  });\n\n  describe('edge cases', () => {\n    it('should handle sentences with compound emojis (withspectrum/spectrum#2077)', () => {\n      const text =\n        \"Hey @grdp 👋🏻, I'm sure the @rauchg should be more than willing to answer that question. 😀\";\n      const mentions = getMentions(text);\n      expect(mentions[0]).toEqual('@grdp');\n      expect(mentions[1]).toEqual('@rauchg');\n    });\n    it('should not include trailing period', () => {\n      const text =\n        \"Hey guys it's @abc.123. where is @xyz? Any news from that guy?  @abc.123... over and out. cc: @some.other.person- @ceo; @hr,.\";\n\n      const mentions = getMentions(text);\n      expect(mentions[0]).toEqual('@abc.123');\n      expect(mentions[1]).toEqual('@xyz');\n      expect(mentions[2]).toEqual('@abc.123');\n      expect(mentions[3]).toEqual('@some.other.person-');\n      expect(mentions[4]).toEqual('@ceo');\n      expect(mentions[5]).toEqual('@hr');\n    });\n  });\n});\n"
  },
  {
    "path": "shared/clients/draft-js/message/renderer.js",
    "content": "// @flow\nimport { createRenderer } from '../renderer';\n\nexport const messageRenderer = createRenderer({\n  headings: false,\n});\n"
  },
  {
    "path": "shared/clients/draft-js/message/test/__snapshots__/renderer.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`messageRenderer should render certain blocks 1`] = `\nArray [\n  \"unstyled\",\n  \"code-block\",\n  \"blockquote\",\n  \"unordered-list-item\",\n  \"ordered-list-item\",\n]\n`;\n"
  },
  {
    "path": "shared/clients/draft-js/message/test/renderer.test.js",
    "content": "// @flow\nimport { messageRenderer } from '../renderer';\nimport mentionsDecorator from '../../mentions-decorator/index';\nimport linksDecorator from '../../links-decorator/index';\n\ndescribe('messageRenderer', () => {\n  it('should render certain blocks', () => {\n    expect(Object.keys(messageRenderer.blocks)).toMatchSnapshot();\n  });\n\n  it('should have decorators', () => {\n    expect(messageRenderer.decorators).toContain(mentionsDecorator);\n    expect(messageRenderer.decorators).toContain(linksDecorator);\n  });\n});\n"
  },
  {
    "path": "shared/clients/draft-js/message/types.js",
    "content": "// @flow\n\nexport type KeyObj = {\n  key: string,\n};\n\nexport type KeysObj = {\n  keys: string[],\n  data?: Object,\n};\n\nexport type DataObj = {\n  url?: string,\n  href?: string,\n};\n"
  },
  {
    "path": "shared/clients/draft-js/renderer/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport Highlight, { defaultProps } from 'prism-react-renderer';\nimport { Line, Paragraph, BlockQuote } from 'src/components/message/style';\nimport {\n  AspectRatio,\n  EmbedContainer,\n  EmbedComponent,\n} from 'src/components/rich-text-editor/style';\nimport ThreadAttachment from 'src/components/message/threadAttachment';\nimport { getStringElements } from '../utils/getStringElements';\nimport { hasStringElements } from '../utils/hasStringElements';\nimport mentionsDecorator from '../mentions-decorator';\nimport linksDecorator from '../links-decorator';\nimport type { Node } from 'react';\nimport { SPECTRUM_URLS } from 'shared/regexps';\nimport type { KeyObj, KeysObj, DataObj } from '../message/types';\nimport type {\n  EmbedData,\n  ExternalEmbedData,\n  InternalEmbedData,\n} from '../../../draft-utils/add-embeds-to-draft-js';\n\nconst ExternalEmbed = (props: { ...ExternalEmbedData, src?: string }) => {\n  let { aspectRatio, url, src, width = '100%', height = 200 } = props;\n\n  if (!src && url) src = url;\n  if (typeof src !== 'string') return null;\n\n  // if an aspect ratio is passed in, we need to use the EmbedComponent which does some trickery with padding to force an aspect ratio. Otherwise we should just use a regular iFrame\n  if (aspectRatio && aspectRatio !== undefined) {\n    return (\n      <AspectRatio style={{ height }} ratio={aspectRatio}>\n        <EmbedComponent\n          title={`iframe-${src}`}\n          width={width}\n          height={height}\n          allowFullScreen={true}\n          frameBorder=\"0\"\n          src={src}\n        />\n      </AspectRatio>\n    );\n  } else {\n    return (\n      <EmbedContainer style={{ height }}>\n        <iframe\n          title={`iframe-${src}`}\n          width={width}\n          height={height}\n          allowFullScreen={true}\n          frameBorder=\"0\"\n          src={src}\n        />\n      </EmbedContainer>\n    );\n  }\n};\n\nconst InternalEmbed = (props: InternalEmbedData) => {\n  if (props.entity !== 'thread') return null;\n\n  return <ThreadAttachment id={props.id} />;\n};\n\nconst Embed = (props: EmbedData) => {\n  if (props.type === 'internal') {\n    return <InternalEmbed {...props} />;\n  }\n\n  return <ExternalEmbed {...props} />;\n};\n\nconst EMPTY_THEME = {\n  plain: {},\n  styles: [],\n};\n\ntype Options = {\n  headings: boolean,\n};\n\nexport const createRenderer = (options: Options) => {\n  return {\n    inline: {\n      BOLD: (children: Array<Node>, { key }: KeyObj) => (\n        <span style={{ fontWeight: 700 }} key={key}>\n          {children}\n        </span>\n      ),\n      ITALIC: (children: Array<Node>, { key }: KeyObj) => (\n        <em key={key}>{children}</em>\n      ),\n      CODE: (children: Array<Node>, { key }: KeyObj) => (\n        <code key={key}>{children}</code>\n      ),\n    },\n    blocks: {\n      unstyled: (children: Array<Node>, { keys }: KeysObj) => {\n        // If the children are text, render a paragraph\n        if (hasStringElements(children)) {\n          return children.map((child, index) => (\n            <Paragraph key={keys[index]}>{child}</Paragraph>\n          ));\n        }\n\n        return children;\n      },\n      'code-block': (children: Array<any>, { keys, data }: KeysObj) => {\n        return children.map((child, index) => (\n          <Highlight\n            {...defaultProps}\n            code={getStringElements(child).join('\\n')}\n            language={Array.isArray(data) && data[0].language}\n            theme={EMPTY_THEME}\n            key={keys[index]}\n          >\n            {({ className, style, tokens, getLineProps, getTokenProps }) => (\n              <Line className={className} style={style}>\n                {tokens.map((line, i) => (\n                  <div key={i} {...getLineProps({ line, key: i })}>\n                    {line.map((token, key) => (\n                      <span key={key} {...getTokenProps({ token, key })} />\n                    ))}\n                  </div>\n                ))}\n              </Line>\n            )}\n          </Highlight>\n        ));\n      },\n      blockquote: (children: Array<Node>, { keys }: KeysObj) =>\n        children.map((child, index) => (\n          <BlockQuote key={keys[index] || index}>{child}</BlockQuote>\n        )),\n      ...(!options.headings\n        ? {}\n        : {\n            'header-one': (children: Array<Node>, { keys }: KeysObj) =>\n              children.map((child, index) => (\n                <h1 key={keys[index]}>{child}</h1>\n              )),\n            'header-two': (children: Array<Node>, { keys }: KeysObj) =>\n              children.map((child, index) => (\n                <h2 key={keys[index]}>{child}</h2>\n              )),\n            'header-three': (children: Array<Node>, { keys }: KeysObj) =>\n              children.map((child, index) => (\n                <h3 key={keys[index]}>{child}</h3>\n              )),\n          }),\n      'unordered-list-item': (children: Array<Node>, { keys }: KeysObj) => (\n        <ul key={keys.join('|')}>\n          {children.map((child, index) => (\n            <li key={keys[index]}>{child}</li>\n          ))}\n        </ul>\n      ),\n      'ordered-list-item': (children: Array<Node>, { keys }: KeysObj) => (\n        <ol key={keys.join('|')}>\n          {children.map((child, index) => (\n            <li key={keys[index]}>{child}</li>\n          ))}\n        </ol>\n      ),\n    },\n    entities: {\n      LINK: (children: Array<Node>, data: DataObj, { key }: KeyObj) => {\n        const link = data.url || data.href;\n\n        if (link) {\n          const regexp = new RegExp(SPECTRUM_URLS, 'ig');\n          const match = regexp.exec(link);\n          if (match && match[0] && match[1]) {\n            return <Link to={match[1]}>{children}</Link>;\n          }\n        }\n\n        return (\n          <a key={key} href={link} target=\"_blank\" rel=\"noopener noreferrer\">\n            {children}\n          </a>\n        );\n      },\n      IMAGE: (\n        children: Array<Node>,\n        data: { src?: string, alt?: string },\n        { key }: KeyObj\n      ) => <img key={key} src={data.src} alt={data.alt || 'Image'} />,\n      embed: (children: Array<Node>, data: Object, { key }: KeyObj) => (\n        <Embed key={key} {...data} />\n      ),\n    },\n    decorators: [mentionsDecorator, linksDecorator],\n  };\n};\n"
  },
  {
    "path": "shared/clients/draft-js/thread/renderer.js",
    "content": "// @flow\nimport { createRenderer } from '../renderer';\n\nexport default createRenderer({\n  headings: true,\n});\n"
  },
  {
    "path": "shared/clients/draft-js/utils/getSnippet.js",
    "content": "// @flow\nimport truncate from 'shared/truncate';\nimport type { RawContentState } from 'draft-js';\n\nconst nthIndexOf = (string, pattern, n) => {\n  var i = -1;\n\n  while (n-- && i++ < string.length) {\n    i = string.indexOf(pattern, i);\n    if (i < 0) break;\n  }\n\n  return i;\n};\n\nexport default (state: RawContentState): string => {\n  const textBlocks = state.blocks.filter(\n    ({ type }) =>\n      type === 'unstyled' ||\n      type.indexOf('header') === 0 ||\n      type.indexOf('list') > -1\n  );\n  const text = textBlocks\n    .map((block, index) => {\n      switch (block.type) {\n        case 'unordered-list-item':\n          return `• ${block.text}`;\n        case 'ordered-list-item': {\n          const number = textBlocks.reduce((number, b, i) => {\n            if (i >= index) return number;\n            if (b.type !== 'ordered-list-item') return number;\n            return number + 1;\n          }, 1);\n          return `${number}. ${block.text}`;\n        }\n        default:\n          return block.text;\n      }\n    })\n    .join('\\n')\n    // Replace multiple line breaks with a single one\n    .replace(/[\\r\\n]+/g, '\\n');\n  const indexOfThirdLineBreak = nthIndexOf(text, '\\n', 3);\n  const cut = text.substr(\n    0,\n    indexOfThirdLineBreak > -1 ? indexOfThirdLineBreak : text.length\n  );\n  return truncate(cut !== text ? `${cut} …` : cut, 280);\n};\n"
  },
  {
    "path": "shared/clients/draft-js/utils/getStringElements.js",
    "content": "// @flow\nexport const getStringElements = (arr: Array<mixed>): Array<string> => {\n  return arr\n    .map(elem => {\n      if (!elem) return null;\n      if (Array.isArray(elem)) return getStringElements(elem);\n      if (typeof elem === 'string') return elem;\n      // Handle React elements being passed as array elements\n      // $FlowIssue\n      if (elem.props && elem.props.children)\n        return getStringElements(elem.props.children);\n      return null;\n    })\n    .filter(Boolean)\n    .reduce((final, elem) => {\n      if (Array.isArray(elem)) return [...final, ...elem];\n      return [...final, elem];\n    }, []);\n};\n"
  },
  {
    "path": "shared/clients/draft-js/utils/hasStringElements.js",
    "content": "//@flow\nexport const hasStringElements = (arr: Array<mixed> | mixed) => {\n  if (Array.isArray(arr)) return arr.some(elem => hasStringElements(elem));\n\n  return typeof arr === 'string';\n};\n"
  },
  {
    "path": "shared/clients/draft-js/utils/isShort.js",
    "content": "// @flow\nimport { toPlainText } from './plaintext';\nimport type { MessageInfoType } from '../../../graphql/fragments/message/messageInfo';\n\nexport const isShort = (message: MessageInfoType): boolean => {\n  if (message.messageType === 'media') return false;\n  const jsonBody = JSON.parse(message.content.body);\n  return jsonBody.blocks.length <= 1 && toPlainText(jsonBody).length <= 170;\n};\n"
  },
  {
    "path": "shared/clients/draft-js/utils/plaintext.js",
    "content": "// @flow\nimport type { RawContentState } from 'draft-js';\n\nexport const toPlainText = (raw: RawContentState) => {\n  return raw.blocks\n    .filter(block => block.type === 'unstyled')\n    .map(block => block.text)\n    .join('\\n');\n};\n"
  },
  {
    "path": "shared/clients/group-messages.js",
    "content": "// @flow\nimport sortByDate from '../sort-by-date';\nimport type { MessageInfoType } from 'shared/graphql/fragments/message/messageInfo';\n\ntype Output = {\n  ...$Exact<MessageInfoType>,\n  timestamp: string,\n};\n\nexport const sortAndGroupMessages = (messages: Array<Output>) => {\n  if (messages.length === 0) return [];\n  messages = sortByDate(messages, 'timestamp', 'asc');\n  let masterArray = [];\n  let newArray = [];\n  let checkId;\n\n  for (let i = 0; i < messages.length; i++) {\n    // on the first message, get the user id and set it to be checked against\n    const robo = [\n      {\n        id: messages[i].timestamp,\n        author: {\n          user: {\n            id: 'robo',\n          },\n        },\n        timestamp: messages[i].timestamp,\n        content: {\n          body: messages[i].timestamp,\n        },\n        type: 'timestamp',\n      },\n    ];\n\n    if (i === 0) {\n      checkId = messages[i].author.user.id;\n      masterArray.push(robo);\n    }\n\n    const sameUser =\n      messages[i].author.user.id !== 'robo' &&\n      messages[i].author.user.id === checkId;\n    const oldMessage = (current: Object, previous: Object) => {\n      //=> boolean\n      /*\n        Rethink db returns string timestamps. We need to convert them\n        into a number format so that we can compare message timestamps\n        more easily. .getTime() will convert something like:\n\n        '2017-05-02T18:15:20.769Z'\n\n        into:\n\n        '1493748920.769'\n\n        We then determine if the current message being evaluated is older\n        than the previous evaulated message by a certain integer to determine\n        if we should render a timestamp in the UI and create a new bubbleGroup\n      */\n      const c = new Date(current.timestamp).getTime();\n      const p = new Date(previous.timestamp).getTime();\n      return c > p + 3600000 * 6; // six hours;\n    };\n\n    // if we are evaulating a bubble from the same user\n    if (sameUser) {\n      // if we are still on the first message\n      if (i === 0) {\n        // push the message to the array\n        newArray.push(messages[i]);\n      } else {\n        // if we're on to the second message, we need to evaulate the timestamp\n        // if the second message is older than the first message by our variance\n        if (oldMessage(messages[i], messages[i - 1])) {\n          // push the batch of messages to master array\n          masterArray.push(newArray);\n          // insert a new robotext timestamp\n          masterArray.push(robo);\n          // reset the batch of new messages\n          newArray = [];\n          // populate the new batch of messages with this next old message\n          newArray.push(messages[i]);\n        } else {\n          // if the message isn't older than our preferred variance,\n          // we keep populating the same batch of messages\n          newArray.push(messages[i]);\n        }\n      }\n      // and maintain the checkid\n      checkId = messages[i].author.user.id;\n      // if the next message is from a new user\n    } else {\n      // we push the previous user's messages to the masterarray\n      masterArray.push(newArray);\n      // if the new users message is older than our preferred variance\n      if (i > 0 && oldMessage(messages[i], messages[i - 1])) {\n        // push a robo timestamp\n        masterArray.push(robo);\n        newArray = [];\n        newArray.push(messages[i]);\n      } else {\n        // clear the messages array from the previous user\n        newArray = [];\n        // and start a new batch of messages from the currently evaluating user\n        newArray.push(messages[i]);\n      }\n\n      // set a new checkid for the next user\n      checkId = messages[i].author.user.id;\n    }\n  }\n\n  // when done, push the final batch of messages to masterArray\n  // masterArray.push(newArray);\n  // and return masterArray to the component\n  masterArray.push(newArray);\n  return masterArray;\n};\n"
  },
  {
    "path": "shared/clients/test/__snapshots__/messages.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should add a timestamp above the first message 1`] = `\nArray [\n  Array [\n    Object {\n      \"author\": Object {\n        \"user\": Object {\n          \"id\": \"robo\",\n        },\n      },\n      \"content\": Object {\n        \"body\": 2016-12-31T23:00:00.000Z,\n      },\n      \"id\": 2016-12-31T23:00:00.000Z,\n      \"timestamp\": 2016-12-31T23:00:00.000Z,\n      \"type\": \"timestamp\",\n    },\n  ],\n  Array [\n    Object {\n      \"author\": Object {\n        \"user\": Object {\n          \"id\": \"asdf123\",\n        },\n      },\n      \"content\": Object {\n        \"body\": \"Hey\",\n      },\n      \"id\": \"whatever\",\n      \"messageType\": \"text\",\n      \"timestamp\": 2016-12-31T23:00:00.000Z,\n    },\n  ],\n]\n`;\n"
  },
  {
    "path": "shared/clients/test/messages.test.js",
    "content": "// @flow\nimport { sortAndGroupMessages } from '../group-messages';\n\n// TODO: FIXME\ntype Message = Object;\n\n// 01.01.2017\nconst FIRST_JAN = 1483225200000;\n\nconst createMessage = ({\n  timestamp,\n  body,\n  authorId,\n  id,\n}: {\n  timestamp?: Date,\n  body?: string,\n  authorId?: string,\n  id?: string | number,\n}): Message => ({\n  id: id || 'whatever',\n  timestamp: timestamp || new Date(FIRST_JAN),\n  content: {\n    body: body || 'Hey',\n  },\n  author: {\n    user: {\n      id: authorId || 'asdf123',\n    },\n  },\n  messageType: 'text',\n});\n\nconst filterRobo = messageGroups =>\n  messageGroups.filter(group => group[0].author.user.id !== 'robo');\n\nit('should sort messages by timestamp', () => {\n  const one = createMessage({\n    timestamp: new Date(FIRST_JAN - 10000),\n    body: 'First',\n  });\n  const two = createMessage({\n    timestamp: new Date(FIRST_JAN),\n    body: 'Second',\n  });\n  const messages = [two, one];\n\n  expect(filterRobo(sortAndGroupMessages(messages))).toEqual([[one, two]]);\n});\n\nit('should group messages by author', () => {\n  const one = createMessage({\n    authorId: 'first',\n  });\n  const two = createMessage({\n    authorId: 'first',\n  });\n  const three = createMessage({\n    authorId: 'second',\n  });\n  const four = createMessage({\n    authorId: 'first',\n  });\n\n  const messages = [one, two, three, four];\n\n  expect(filterRobo(sortAndGroupMessages(messages))).toEqual([\n    [one, two],\n    [three],\n    [four],\n  ]);\n});\n\nit('should add a timestamp above the first message', () => {\n  const timestamp = new Date(FIRST_JAN);\n  const messages = [createMessage({ timestamp })];\n\n  expect(sortAndGroupMessages(messages)).toMatchSnapshot();\n});\n\nconst SEVEN_HOURS = 25200000;\nit(\"should add a timestamp between two messages if there's more than six hours between them\", () => {\n  const first = createMessage({\n    timestamp: new Date(FIRST_JAN),\n  });\n  const second = createMessage({\n    timestamp: new Date(FIRST_JAN + SEVEN_HOURS),\n  });\n\n  const messages = [first, second];\n\n  const result = sortAndGroupMessages(messages);\n\n  // Should have three message groups, two robo texts + two groups\n  expect(result).toHaveLength(4);\n  // Expect a robo text timestamp to be between the message groups\n  expect(result[2][0].author.user.id).toEqual('robo');\n});\n"
  },
  {
    "path": "shared/cookie-utils.js",
    "content": "// @flow\nimport Keygrip from 'keygrip';\nimport jwt from 'jsonwebtoken';\n\nexport const cookieKeygrip = new Keygrip([process.env.SESSION_COOKIE_SECRET]);\n\nexport const getCookies = ({ userId }: { userId: string }) => {\n  // The value of our \"session\" cookie\n  const session = new Buffer(\n    JSON.stringify({ passport: { user: userId } })\n  ).toString('base64');\n  // The value of our \"session.sig\" cookie\n  const sessionSig = cookieKeygrip.sign(`session=${session}`);\n\n  return { session, 'session.sig': sessionSig };\n};\n\nexport const signCookie = (cookie: string) => {\n  return jwt.sign({ cookie }, process.env.API_TOKEN_SECRET, {\n    expiresIn: '25y',\n  });\n};\n"
  },
  {
    "path": "shared/db/constants.js",
    "content": "// @flow\n\nexport const READ_RUN_ERROR = `Do not call .run() on the query passed to createReadQuery!\n\nBad: db.table('users').get(userId).run()\nGood: db.table('users').get(userId)\n\nIf you need to post-process the query data (.run().then()), use the \\`process\\` hook.\n`;\n\nexport const WRITE_RUN_ERROR = `Don't forget to call .run() on the query passed to createWriteQuery!\n\nBad: db.table('users').get(userId)\nGood: db.table('users').get(userId).run()\n\nIf you need to post-process the result, simply use .then()! \\`.run().then(result => /* ... */)!\\`\n`;\n"
  },
  {
    "path": "shared/db/create-query.js",
    "content": "/* @flow\n *\n * Create a RethinkDB query and cache it's result in a TagCache\n *\n * Usage:\n *\n * const getThreadById = createReadQuery({\n *   // NOTE: No .run() at the end of the query!!!\n *   query: (threadId: string) => db.table('threads').get(threadId),\n *   tags: (threadId: string) => (thread: ?DBThread) => thread ? [thread.id, thread.communityId, thread.channelId] : [],\n * });\n *\n * const updateUser = createWriteQuery({\n *  // NOTE: .run() at the end of the query\n *  query: (userId: string, data: Object) => db.table('users').get(userId).update(data).run(),\n *  invalidateTags: (userId: string) => () => [userId]\n * });\n */\n\nimport { READ_RUN_ERROR, WRITE_RUN_ERROR } from './constants';\n\ntype RethinkDBQuery<O> = {\n  toString: Function,\n  run: () => Promise<O>,\n};\n\ntype ProcessFn<I, O> = (data: O) => Promise<*> | *;\ntype TagsFn<I, O> = (data: O) => Array<?string>;\n\ntype CreateReadQueryInput<I, O> = $Exact<{\n  query: RethinkDBQuery<O>,\n  process?: ProcessFn<I, O>,\n  tags: TagsFn<I, O>,\n}>;\n\ntype CreateQueryCallback<I, O> = (...args: I) => O;\n\nexport const createReadQuery = (callback: any) => {\n  return async (...args: any) => {\n    const input = callback(...args);\n    if (typeof input.query.run !== 'function') throw new Error(READ_RUN_ERROR);\n\n    // const queryString = input.query.toString();\n    // const cached = await queryCache.get(queryString);\n    // if (cached) {\n    //   CACHED_RESULTS++;\n    //   return cached;\n    // }\n\n    const result = await input.query\n      .run()\n      .then(input.process ? input.process : res => res);\n\n    // const tags = input.tags(result).filter(Boolean);\n    // await queryCache.set(queryString, result, tags);\n    return result;\n  };\n};\n\ntype CreateWriteQueryInput<I, O> = $Exact<{\n  query: Promise<O>,\n  invalidateTags: TagsFn<I, O>,\n}>;\n\nexport const createWriteQuery = <I: Array<*>, O: *>(callback: any) => {\n  return async (...args: I) => {\n    const input = callback(...args);\n    const result = await input.query;\n    if (typeof result.run === 'function') throw new Error(WRITE_RUN_ERROR);\n\n    // const tags = input.invalidateTags(result).filter(Boolean);\n    // await queryCache.invalidate(...tags);\n    return result;\n  };\n};\n"
  },
  {
    "path": "shared/db/db.js",
    "content": "// @flow\n/**\n * Database setup is done here\n */\nimport fs from 'fs';\nimport path from 'path';\nimport inspect from 'rethinkdb-inspector';\nimport { statsd } from '../statsd';\n\nconst IS_PROD = !process.env.FORCE_DEV && process.env.NODE_ENV === 'production';\n\nconst CONNECTIONS = 20;\nconst DEFAULT_CONFIG = {\n  // Connect to the test database when, well, testing\n  db: !process.env.TEST_DB ? 'spectrum' : 'testing',\n  max: CONNECTIONS, // Maximum number of connections, default is 1000\n  buffer: CONNECTIONS, // Minimum number of connections open at any given moment, default is 50\n  timeoutGb: 60 * 60 * 1000, // How long should an unused connection stick around, default is an hour, this is a minute\n  timeout: 30, // The number of seconds for a connection to be opened, default 20\n};\n\nlet ca;\n\ntry {\n  ca = fs.readFileSync(path.join(process.cwd(), 'cacert'));\n} catch (err) {}\n\nif (!ca && IS_PROD)\n  throw new Error(\n    'Please provide the SSL certificate to connect to the production database in a file called `cacert` in the root directory.'\n  );\n\nconst PRODUCTION_CONFIG = {\n  servers: [\n    {\n      password: process.env.COMPOSE_RETHINKDB_PASSWORD,\n      host: process.env.COMPOSE_RETHINKDB_URL,\n      port: process.env.COMPOSE_RETHINKDB_PORT,\n      ...(ca\n        ? {\n            ssl: {\n              ca,\n            },\n          }\n        : {}),\n    },\n    {\n      password: process.env.COMPOSE_RETHINKDB_PASSWORD,\n      host: process.env.BACKUP_RETHINKDB_URL,\n      port: process.env.BACKUP_RETHINKDB_PORT,\n      ...(ca\n        ? {\n            ssl: {\n              ca,\n            },\n          }\n        : {}),\n    },\n  ],\n};\n\nconst config = IS_PROD\n  ? {\n      ...DEFAULT_CONFIG,\n      ...PRODUCTION_CONFIG,\n    }\n  : {\n      ...DEFAULT_CONFIG,\n    };\n\nlet r = require('rethinkhaberdashery')(config);\nconst poolMaster = r.getPoolMaster();\n\npoolMaster.on('queueing', size => {\n  statsd.gauge('db.query_queue.size', size);\n});\n\nsetInterval(() => {\n  statsd.gauge('db.connections.count', poolMaster.getLength());\n}, 5000);\n\n// Exit the process on unhealthy db in test env\nif (process.env.TEST_DB) {\n  poolMaster.on('healthy', healthy => {\n    if (!healthy) {\n      process.exit(1);\n    }\n  });\n}\n\nconst queries = [];\ninspect(r, {\n  onQueryComplete: (query, { size, time }) => {\n    if (query.indexOf('.changes') > -1) return;\n    statsd.increment('db.queries.count');\n    statsd.histogram('db.queries.response_time', time);\n    statsd.histogram('db.queries.response_size', size);\n    // In development write out a file of the most expensive queries\n    if (process.env.NODE_ENV === 'development' && process.env.TRACK_DB_PERF) {\n      queries.push({ query, time, size });\n      fs.writeFileSync(\n        'queries-by-time.js',\n        JSON.stringify(queries.sort((a, b) => b.time - a.time), null, 2)\n      );\n      fs.writeFileSync(\n        'queries-by-response-size.js',\n        JSON.stringify(queries.sort((a, b) => b.size - a.size), null, 2)\n      );\n    }\n  },\n});\n\nmodule.exports = { db: r };\n"
  },
  {
    "path": "shared/db/index.js",
    "content": "// @flow\nimport { db } from 'shared/db/db';\nimport { createReadQuery, createWriteQuery } from './create-query';\n\nexport { db, createReadQuery, createWriteQuery };\n"
  },
  {
    "path": "shared/db/queries/channel.js",
    "content": "// @flow\nimport { createReadQuery, db } from 'shared/db';\nimport type { DBChannel } from 'shared/types';\n\nexport const getChannelById = createReadQuery((id: string) => ({\n  query: db.table('channels').get(id),\n  tags: (channel: ?DBChannel) => (channel ? [channel.id] : []),\n}));\n\nexport const getChannelsById = createReadQuery((ids: Array<string>) => ({\n  query: db.table('channels').getAll(...ids),\n  tags: (channels: ?Array<DBChannel>) =>\n    channels ? channels.map(({ id }) => id) : [],\n}));\n"
  },
  {
    "path": "shared/db/queries/community.js",
    "content": "// @flow\nimport { createReadQuery, db } from 'shared/db';\nimport type { DBCommunity } from 'shared/types';\n\nexport const getCommunityById = createReadQuery((id: string) => ({\n  query: db.table('communities').get(id),\n  tags: (community: ?DBCommunity) => (community ? [community.id] : []),\n}));\n\nexport const getCommunitiesById = createReadQuery((ids: Array<string>) => ({\n  query: db.table('communities').getAll(...ids),\n  tags: (communities: ?Array<DBCommunity>) =>\n    communities ? communities.map(({ id }) => id) : [],\n}));\n\nexport const getTopCommunitiesByMemberCount = createReadQuery(\n  (amount: number) => ({\n    query: db\n      .table('communities')\n      .orderBy({ index: db.desc('memberCount') })\n      .filter(community => community.hasFields('deletedAt').not())\n      .limit(amount),\n    tags: (communities: Array<DBCommunity>) =>\n      communities ? communities.map(({ id }) => id) : [],\n  })\n);\n"
  },
  {
    "path": "shared/db/queries/message.js",
    "content": "// @flow\nimport { createReadQuery, db } from 'shared/db';\nimport type { DBMessage } from 'shared/types';\n\nexport const getMessageById = createReadQuery((id: string) => ({\n  query: db.table('messages').get(id),\n  tags: (message: ?DBMessage) => (message ? [message.id] : []),\n}));\n"
  },
  {
    "path": "shared/db/queries/thread.js",
    "content": "// @flow\nimport { createReadQuery, db } from 'shared/db';\nimport type { DBThread } from 'shared/types';\n\nexport const getThreadById = createReadQuery((id: string) => ({\n  query: db.table('threads').get(id),\n  tags: (thread: ?DBThread) => (thread ? [thread.id] : []),\n}));\n"
  },
  {
    "path": "shared/db/queries/user.js",
    "content": "// @flow\nimport { createReadQuery, createWriteQuery, db } from 'shared/db';\nimport { uploadImage } from 'api/utils/file-storage';\nimport { deleteThread } from 'api/models/thread';\nimport { deleteMessage } from 'api/models/message';\nimport { removeUsersCommunityMemberships } from 'api/models/usersCommunities';\nimport { removeUsersChannelMemberships } from 'api/models/usersChannels';\nimport { disableAllUsersEmailSettings } from 'api/models/usersSettings';\nimport type { PaginationOptions } from 'api/utils/paginate-arrays';\nimport type { DBUser, FileUpload } from 'shared/types';\n\nexport const getUserById = createReadQuery((userId: string) => {\n  // fallback for a bad id coming in that is a stringified user object\n  if (userId[0] === '{') {\n    let user = JSON.parse(userId);\n\n    if (user.id) {\n      return {\n        query: db.table('users').get(user.id),\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else if (user.email) {\n      return {\n        query: db.table('users').getAll(user.email, { index: 'email' }),\n        process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else if (user.username) {\n      return {\n        query: db.table('users').getAll(user.username, { index: 'username' }),\n        process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else if (user.githubProviderId) {\n      return {\n        query: db\n          .table('users')\n          .getAll(user.githubProviderId, { index: 'githubProviderId' }),\n        process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else if (user.googleProviderId) {\n      return {\n        query: db\n          .table('users')\n          .getAll(user.googleProviderId, { index: 'googleProviderId' }),\n        process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else if (user.providerId) {\n      return {\n        query: db\n          .table('users')\n          .getAll(user.providerId, { index: 'providerId' }),\n        process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n        tags: (user: ?DBUser) => (user ? [user.id] : []),\n      };\n    } else {\n      console.error(\n        `Couldn’t get meaningful user data from passport: ${userId}`\n      );\n      return null;\n    }\n  }\n\n  // userId was not a stringified object\n  return {\n    query: db.table('users').get(userId),\n    tags: () => [userId],\n  };\n});\n\nexport const getUserByEmail = createReadQuery((email: string) => ({\n  query: db.table('users').getAll(email, { index: 'email' }),\n  process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n  tags: (user: ?DBUser) => (user ? [user.id] : []),\n}));\n\nexport const getUsersByEmail = createReadQuery((email: string) => ({\n  query: db.table('users').getAll(email, { index: 'email' }),\n  process: (users: Array<?DBUser>) => users,\n  tags: (users: Array<?DBUser>) => (users ? users.map(u => u && u.id) : []),\n}));\n\nexport const getUserByUsername = createReadQuery((username: string) => ({\n  query: db.table('users').getAll(username, { index: 'username' }),\n  process: (users: ?Array<DBUser>) => (users && users[0]) || null,\n  tags: (user: ?DBUser) => (user ? [user.id] : []),\n}));\n\nexport const getUsersByUsername = createReadQuery(\n  (usernames: Array<string>) => ({\n    query: db.table('users').getAll(...usernames, { index: 'username' }),\n    tags: (users: ?Array<DBUser>) => (users ? users.map(({ id }) => id) : []),\n  })\n);\n\nexport const getUsers = createReadQuery((userIds: Array<string>) => ({\n  query: db.table('users').getAll(...userIds),\n  tags: (users: ?Array<DBUser>) => (users ? users.map(({ id }) => id) : []),\n}));\n\nexport const saveUserProvider = createWriteQuery(\n  (\n    userId: string,\n    providerMethod: string,\n    providerId: number,\n    extraFields?: Object\n  ) => ({\n    query: db\n      .table('users')\n      .get(userId)\n      .update(\n        {\n          [providerMethod]: providerId,\n          ...extraFields,\n        },\n        { returnChanges: 'always' }\n      )\n      .run()\n      .then(\n        async ({\n          changes,\n        }: {\n          changes: [{ new_val?: DBUser, old_val?: DBUser }],\n        }) => {\n          const user = changes[0].new_val || changes[0].old_val;\n          if (!user)\n            throw new Error(`Failed to update user with ID ${userId}.`);\n\n          return user;\n        }\n      ),\n    invalidateTags: (user: ?DBUser) => (user ? [user.id] : []),\n  })\n);\n\nexport const getUserByIndex = createReadQuery(\n  (indexName: string, indexValue: string) => ({\n    query: db.table('users').getAll(indexValue, { index: indexName }),\n    process: (results: ?Array<DBUser>) => (results ? results[0] : null),\n    tags: (user: ?DBUser) => (user ? [user.id] : []),\n  })\n);\n\n// prettier-ignore\nexport const createOrFindUser = (user: Object, providerMethod: string): Promise<?DBUser> => {\n  // if a user id gets passed in, we know that a user most likely exists and we just need to retrieve them from the db\n  // if not, we need to create a new user\n  let promise;\n  if (user.id) {\n    promise = getUserById(user.id);\n  } else if (user[providerMethod]) {\n    promise = getUserByIndex(providerMethod, user[providerMethod])\n      .then(storedUser => {\n          if (storedUser) {\n            return storedUser;\n          }\n\n          return Promise.resolve(null);\n        }\n      );\n  } else {\n    promise = Promise.resolve(null);\n  }\n\n  return promise\n    .then(storedUser => {\n      // if a user is found with the providerId, return the user in the db\n      if (storedUser && storedUser.id) {\n        return Promise.resolve(storedUser);\n      }\n      \n      // no new sign ups\n      return Promise.resolve(null)\n    })\n    .catch(err => {\n      if (user.id) {\n        console.error(err);\n        return null;\n      }\n      return null\n    });\n};\n\n// prettier-ignore\nexport const getEverything = (userId: string, options: PaginationOptions): Promise<Array<any>> => {\n  const { first, after } = options\n  return db\n    .table('usersChannels')\n    .getAll([userId, \"member\"], [userId, \"owner\"], [userId, \"moderator\"], { index: 'userIdAndRole' })\n    .map(userChannel => userChannel('channelId'))\n    .run()\n    .then(\n      userChannels =>\n        userChannels &&\n        userChannels.length > 0 &&\n        db\n          .table('threads')\n          .orderBy({ index: db.desc('lastActive') })\n          .filter(thread =>\n            db\n              .expr(userChannels)\n              .contains(thread('channelId'))\n              .and(db.not(thread.hasFields('deletedAt')))\n          )\n          .skip(after || 0)\n          .limit(first)\n          .run()\n    );\n};\n\ntype UserThreadCount = {\n  id: string,\n  count: number,\n};\n\n// prettier-ignore\nexport const getUsersThreadCount = (threadIds: Array<string>): Promise<Array<UserThreadCount>> => {\n  const getThreadCounts = threadIds.map(creatorId =>\n    db\n      .table('threads')\n      .getAll(creatorId, { index: 'creatorId' })\n      .count()\n      .run()\n  );\n\n  return Promise.all(getThreadCounts).then(result => {\n    return result.map((threadCount, index) => ({\n      id: threadIds[index],\n      count: threadCount,\n    }));\n  });\n};\n\nexport type EditUserInput = {\n  input: {\n    file?: FileUpload,\n    name?: string,\n    description?: string,\n    website?: string,\n    coverFile?: FileUpload,\n    username?: string,\n    timezone?: number,\n  },\n};\n\nexport const editUser = createWriteQuery(\n  (args: EditUserInput, userId: string) => {\n    const {\n      name,\n      description,\n      website,\n      file,\n      coverFile,\n      username,\n      timezone,\n    } = args.input;\n\n    return {\n      query: db\n        .table('users')\n        .get(userId)\n        .run()\n        .then(result => {\n          return Object.assign({}, result, {\n            name,\n            description,\n            website,\n            username,\n            timezone,\n            modifiedAt: new Date(),\n          });\n        })\n        .then(user => {\n          if (file || coverFile) {\n            if (file && !coverFile) {\n              return uploadImage(file, 'users', user.id)\n                .then(profilePhoto => {\n                  // update the user with the profilePhoto\n                  return (\n                    db\n                      .table('users')\n                      .get(user.id)\n                      .update(\n                        {\n                          ...user,\n                          profilePhoto,\n                        },\n                        { returnChanges: 'always' }\n                      )\n                      .run()\n                      // return the resulting user with the profilePhoto set\n                      .then(result => {\n                        // if an update happened\n                        if (result.replaced === 1) {\n                          return result.changes[0].new_val;\n                        }\n\n                        // an update was triggered from the client, but no data was changed\n                        if (result.unchanged === 1) {\n                          return result.changes[0].old_val;\n                        }\n                      })\n                  );\n                })\n                .catch(err => {\n                  console.error(err);\n                });\n            } else if (!file && coverFile) {\n              return uploadImage(coverFile, 'users', user.id)\n                .then(coverPhoto => {\n                  // update the user with the profilePhoto\n                  return (\n                    db\n                      .table('users')\n                      .get(user.id)\n                      .update(\n                        {\n                          ...user,\n                          coverPhoto,\n                        },\n                        { returnChanges: 'always' }\n                      )\n                      .run()\n                      // return the resulting user with the profilePhoto set\n                      .then(result => {\n                        // if an update happened\n                        if (result.replaced === 1) {\n                          return result.changes[0].new_val;\n                        }\n\n                        // an update was triggered from the client, but no data was changed\n                        if (result.unchanged === 1) {\n                          return result.changes[0].old_val;\n                        }\n                      })\n                  );\n                })\n                .catch(err => {\n                  console.error(err);\n                });\n            } else if (file && coverFile) {\n              const uploadFile = file => {\n                return uploadImage(file, 'users', user.id).catch(err => {\n                  console.error(err);\n                });\n              };\n\n              const uploadCoverFile = coverFile => {\n                return uploadImage(coverFile, 'users', user.id).catch(err => {\n                  console.error(err);\n                });\n              };\n\n              return Promise.all([\n                uploadFile(file),\n                uploadCoverFile(coverFile),\n              ]).then(([profilePhoto, coverPhoto]) => {\n                return (\n                  db\n                    .table('users')\n                    .get(user.id)\n                    .update(\n                      {\n                        ...user,\n                        coverPhoto,\n                        profilePhoto,\n                      },\n                      { returnChanges: 'always' }\n                    )\n                    .run()\n                    // return the resulting community with the profilePhoto set\n                    .then(result => {\n                      // if an update happened\n                      if (result.replaced === 1) {\n                        return result.changes[0].new_val;\n                      }\n\n                      // an update was triggered from the client, but no data was changed\n                      if (result.unchanged === 1) {\n                        return result.changes[0].old_val;\n                      }\n                    })\n                );\n              });\n            }\n          } else {\n            return db\n              .table('users')\n              .get(user.id)\n              .update(\n                {\n                  ...user,\n                },\n                { returnChanges: 'always' }\n              )\n              .run()\n              .then(result => {\n                // if an update happened\n                if (result.replaced === 1) {\n                  return result.changes[0].new_val;\n                }\n\n                // an update was triggered from the client, but no data was changed\n                if (result.unchanged === 1) {\n                  return result.changes[0].old_val;\n                }\n              });\n          }\n        }),\n      invalidateTags: () => [userId],\n    };\n  }\n);\n\nexport const setUserPendingEmail = createWriteQuery(\n  (userId: string, pendingEmail: string) => ({\n    query: db\n      .table('users')\n      .get(userId)\n      .update(\n        {\n          pendingEmail,\n        },\n        { returnChanges: 'always' }\n      )\n      .run()\n      .then(\n        async ({\n          changes,\n        }: {\n          changes: [{ new_val?: DBUser, old_val?: DBUser }],\n        }) => {\n          const user = changes[0].new_val || changes[0].old_val;\n          if (!user)\n            throw new Error(\n              `Failed to set user pending email to ${pendingEmail} for user ${userId}.`\n            );\n\n          return user;\n        }\n      ),\n    invalidateTags: () => [userId],\n  })\n);\n\nexport const updateUserEmail = createWriteQuery(\n  (userId: string, email: string) => ({\n    query: db\n      .table('users')\n      .get(userId)\n      .update(\n        {\n          email,\n          pendingEmail: db.literal(),\n        },\n        { returnChanges: 'always' }\n      )\n      .run()\n      .then(\n        async ({\n          changes,\n        }: {\n          changes: [{ new_val?: DBUser, old_val?: DBUser }],\n        }) => {\n          const user = changes[0].new_val || changes[0].old_val;\n          if (!user)\n            throw new Error(\n              `Failed to update user email to ${email} for user ${userId}.`\n            );\n\n          return user;\n        }\n      ),\n    invalidateTags: () => [userId],\n  })\n);\n\nexport const deleteUser = createWriteQuery((userId: string) => ({\n  query: db\n    .table('users')\n    .get(userId)\n    .update(\n      {\n        username: null,\n        email: null,\n        deletedAt: new Date(),\n        providerId: null,\n        fbProviderId: null,\n        googleProviderId: null,\n        githubProviderId: null,\n        githubUsername: null,\n        profilePhoto: null,\n        description: null,\n        website: null,\n        timezone: null,\n        lastSeen: null,\n        modifiedAt: null,\n        firstName: null,\n        lastName: null,\n        pendingEmail: null,\n        name: 'Deleted',\n      },\n      { returnChanges: 'always' }\n    )\n    .run()\n    .then(\n      async ({\n        changes,\n      }: {\n        changes: [{ new_val?: DBUser, old_val?: DBUser }],\n      }) => {\n        const user = changes[0].new_val || changes[0].old_val;\n\n        return user;\n      }\n    ),\n  invalidateTags: () => [userId],\n}));\n\n/*\n  Occasionally bad actors will show up on Spectrum and become toxic, spam communities, harass others, or violate our code of conduct. We have a safe way to ban these users in a way that respects the integrity of data across the rest of the database.\n  Do NOT ever `.delete()` a user record from the database!!\n*/\ntype BanUserType = {\n  userId: string,\n  reason: string,\n  currentUserId: string,\n};\nexport const banUser = createWriteQuery((args: BanUserType) => {\n  const { userId, reason, currentUserId } = args;\n\n  return {\n    invalidateTags: () => [userId],\n    query: db\n      .table('users')\n      .get(userId)\n      .update({\n        bannedAt: new Date(),\n        bannedBy: currentUserId,\n        bannedReason: reason,\n        username: null,\n        coverPhoto: null, // in case the photo is inappropriate\n        profilePhoto: null, // in case the photo is inappropriate\n      })\n      .run()\n      .then(async () => {\n        /*  \n          after the user object has been cleared, the user\n          can no longer be searched for, messaged, or viewed\n          so we can simply cleanup db data to ensure they are\n          no longer listed as members of communities or channels\n          and their DMs cant be seen by other users\n        */\n\n        const dmThreadIds = await db\n          .table('usersDirectMessageThreads')\n          .getAll(userId, { index: 'userId' })\n          .map(row => row('threadId'))\n          .run();\n\n        let removeOtherParticipantsDmThreadIds, removeDMThreads;\n        if (dmThreadIds && dmThreadIds.length > 0) {\n          removeOtherParticipantsDmThreadIds = db\n            .table('usersDirectMessageThreads')\n            .getAll(...dmThreadIds, { index: 'threadId' })\n            .update({ deletedAt: new Date() })\n            .run();\n\n          removeDMThreads = await db\n            .table('directMessageThreads')\n            .getAll(...dmThreadIds)\n            .update({ deletedAt: new Date() })\n            .run();\n        }\n\n        const publishedThreadIds = await db\n          .table('threads')\n          .getAll(userId, { index: 'creatorId' })\n          .map(row => row('id'))\n          .run();\n\n        const deletePublishedThreadsPromises =\n          publishedThreadIds && publishedThreadIds.length > 0\n            ? publishedThreadIds.map(id => deleteThread(id, currentUserId))\n            : [];\n\n        const usersThreadsIds = await db\n          .table('usersThreads')\n          .getAll(userId, { index: 'userId' })\n          .map(row => row('threadId'))\n          .run();\n\n        const usersMessagesIds = await db\n          .table('messages')\n          .getAll(...usersThreadsIds, { index: 'threadId' })\n          .filter({ senderId: userId })\n          .map(row => row('id'))\n          .run();\n\n        const deleteSentMessagesPromises =\n          usersMessagesIds && usersMessagesIds.length > 0\n            ? usersMessagesIds.map(id => deleteMessage(currentUserId, id))\n            : [];\n\n        return await Promise.all([\n          removeUsersCommunityMemberships(userId),\n          removeUsersChannelMemberships(userId),\n          disableAllUsersEmailSettings(userId),\n          removeOtherParticipantsDmThreadIds,\n          removeDMThreads,\n          ...deletePublishedThreadsPromises,\n          ...deleteSentMessagesPromises,\n        ]);\n      }),\n  };\n});\n"
  },
  {
    "path": "shared/db/query-cache.js",
    "content": "// @flow\nimport TagCache from 'redis-tag-cache';\n\nconst DEFAULT_REDIS_OPTIONS = {\n  keyPrefix: 'query-cache',\n};\n\nconst queryCache = new TagCache({\n  defaultTimeout: 86400,\n  redis: {\n    ...DEFAULT_REDIS_OPTIONS,\n  },\n});\n\nexport default queryCache;\n"
  },
  {
    "path": "shared/draft-utils/add-embeds-to-draft-js.js",
    "content": "// @flow\nimport genKey from 'draft-js/lib/generateRandomKey';\nimport type { RawDraftContentState } from 'draft-js/lib/RawDraftContentState.js';\n\nconst FIGMA_URLS = /\\b((?:https?:\\/\\/)?(?:www\\.)?figma.com\\/(file|proto)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?)/gi;\nconst YOUTUBE_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(&(amp;)?[\\w\\?=]*)?/gi;\nconst VIMEO_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?vimeo.com\\/(?:channels\\/[0-9a-z-_]+\\/)?([0-9a-z\\-_]+)/gi;\nconst IFRAME_TAG = /<iframe.+?src=['\"](.+?)['\"]/gi;\nconst FRAMER_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?(?:framer\\.cloud|share\\.framerjs\\.com)\\/([A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\nconst CODEPEN_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?codepen\\.io(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\nconst CODESANDBOX_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?codesandbox\\.io(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\nconst SIMPLECAST_URLS = /\\b(?:https?:\\/\\/)?(?:www\\.)?simplecast\\.com(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\nconst THREAD_URLS = /(?:(?:https?:\\/\\/)?|\\B)(?:spectrum\\.chat|localhost:3000)\\/.*?(?:~|(?:\\?|&)t=|(?:\\?|&)thread=|thread\\/)([^&\\s]*)/gi;\n\nconst REGEXPS = {\n  figma: FIGMA_URLS,\n  youtube: YOUTUBE_URLS,\n  vimeo: VIMEO_URLS,\n  iframe: IFRAME_TAG,\n  framer: FRAMER_URLS,\n  codepen: CODEPEN_URLS,\n  codesandbox: CODESANDBOX_URLS,\n  simplecast: SIMPLECAST_URLS,\n  internal: THREAD_URLS,\n};\n\nexport type InternalEmbedData = {\n  type: 'internal',\n  entity: 'thread',\n  id: string,\n};\n\nexport type ExternalEmbedData = {\n  url: string,\n  type:\n    | 'figma'\n    | 'youtube'\n    | 'vimeo'\n    | 'iframe'\n    | 'framer'\n    | 'codepen'\n    | 'codesandbox'\n    | 'simplecast',\n  aspectRatio?: string,\n  width?: number,\n  height?: number,\n};\n\nexport type EmbedData = InternalEmbedData | ExternalEmbedData;\n\nexport const addEmbedsToEditorState = (\n  input: RawDraftContentState\n): RawDraftContentState => {\n  let lastEntityKey = Math.max(...Object.keys(input.entityMap));\n  if (lastEntityKey === -Infinity || lastEntityKey === Infinity)\n    lastEntityKey = -1;\n  let newEntityMap = input.entityMap || {};\n  let newBlocks = [];\n\n  // Detect the embeds and add an atomic block and an entity to the\n  // raw content state for each one\n  input.blocks.forEach((block, blockIndex) => {\n    newBlocks.push(block);\n\n    if (block.type !== 'unstyled') return;\n\n    const embeds = getEmbedsFromText(block.text);\n    if (embeds.length === 0) return;\n\n    embeds.forEach(embed => {\n      lastEntityKey++;\n      const entityKey = lastEntityKey;\n      newEntityMap[entityKey] = {\n        data: {\n          ...embed,\n          ...(embed.url ? { src: embed.url } : {}),\n        },\n        mutability: 'MUTABLE',\n        type: 'embed',\n      };\n      const regexp = new RegExp(REGEXPS[embed.type], 'ig');\n      const text = block.text;\n      var match;\n      while ((match = regexp.exec(text)) !== null) {\n        const offset = match.index;\n        const length = match[0].length;\n        newBlocks[blockIndex].entityRanges = newBlocks[\n          blockIndex\n        ].entityRanges.filter(\n          entity => entity.offset !== offset || entity.length !== length\n        );\n        newBlocks[blockIndex].entityRanges.push({\n          offset,\n          length,\n          key: entityKey,\n        });\n      }\n    });\n  });\n\n  return {\n    ...input,\n    entityMap: newEntityMap,\n    blocks: newBlocks,\n  };\n};\n\n// Utility function to return the first capturing group of each unique match\n// of a regex in a string\nconst match = (regex: RegExp, text: string) => {\n  const matches = text.match(regex);\n  if (!matches) return [];\n  return [...new Set(matches)].map(match => {\n    return regex.exec(match)[1];\n  });\n};\n\nexport const getEmbedsFromText = (text: string): Array<EmbedData> => {\n  let embeds = [];\n\n  match(IFRAME_TAG, text).forEach(url => {\n    embeds.push({ type: 'iframe', url });\n  });\n\n  match(FIGMA_URLS, text).forEach(url => {\n    embeds.push({\n      type: 'figma',\n      url: `https://www.figma.com/embed?embed_host=spectrum&url=${url}`,\n      aspectRatio: '56.25%', // 16:9 aspect ratio\n    });\n  });\n\n  match(YOUTUBE_URLS, text).forEach(id => {\n    embeds.push({\n      type: 'youtube',\n      url: `https://www.youtube.com/embed/${id}`,\n      aspectRatio: '56.25%', // 16:9 aspect ratio\n    });\n  });\n\n  match(VIMEO_URLS, text).forEach(id => {\n    embeds.push({\n      type: 'vimeo',\n      url: `https://player.vimeo.com/video/${id}`,\n      aspectRatio: '56.25%', // 16:9 aspect ratio\n    });\n  });\n\n  match(FRAMER_URLS, text).forEach(id => {\n    embeds.push({\n      type: 'framer',\n      url: `https://share.framerjs.com/${id}`,\n      width: 600,\n      height: 800,\n    });\n  });\n\n  match(CODEPEN_URLS, text).forEach(path => {\n    embeds.push({\n      type: 'codepen',\n      url: `https://codepen.io${path.replace(/(pen|full|details)/, 'embed')}`,\n      height: 300,\n    });\n  });\n\n  match(CODESANDBOX_URLS, text).forEach(path => {\n    embeds.push({\n      type: 'codesandbox',\n      url: `https://codesandbox.io${path.replace('/s/', '/embed/')}`,\n      height: 500,\n    });\n  });\n\n  match(SIMPLECAST_URLS, text).forEach(path => {\n    embeds.push({\n      type: 'simplecast',\n      url: `https://embed.simplecast.com/${path\n        .replace('/s/', '')\n        .replace('/', '')}`,\n      height: 200,\n    });\n  });\n\n  match(THREAD_URLS, text).forEach(id => {\n    embeds.push({\n      type: 'internal',\n      id,\n      entity: 'thread',\n    });\n  });\n\n  return embeds;\n};\n"
  },
  {
    "path": "shared/draft-utils/index.js",
    "content": "// @flow\n/**\n * This file is shared between server and client.\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\n *\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\n * so it chokes on the Flow syntax.\n * More info: https://flow.org/en/docs/types/comments/\n */\n//$FlowIssue\nvar EditorState = require('draft-js/lib/EditorState');\n//$FlowIssue\nvar ContentState = require('draft-js/lib/ContentState');\n//$FlowIssue\nvar convertFromRaw = require('draft-js/lib/convertFromRawToDraftState');\n//$FlowIssue\nvar convertToRaw = require('draft-js/lib/convertFromDraftStateToRaw');\n\nvar toPlainText = function toPlainText(\n  editorState /*: typeof EditorState */\n) /*: string */ {\n  return editorState.getCurrentContent().getPlainText();\n};\n\n// This is necessary for SSR, if you create an empty editor on the server and on the client they have to\n// have matching keys, so just doing fromPlainText('') breaks checksum matching because the key\n// of the block is randomly generated twice and thusly does't match\nvar emptyContentState = convertFromRaw({\n  entityMap: {},\n  blocks: [\n    {\n      text: '',\n      key: 'foo',\n      type: 'unstyled',\n      entityRanges: [],\n    },\n  ],\n});\n\nvar fromPlainText = function fromPlainText(\n  text /*: string */\n) /*: typeof EditorState */ {\n  if (!text || text === '')\n    return EditorState.createWithContent(emptyContentState);\n  return EditorState.createWithContent(ContentState.createFromText(text));\n};\n\nvar toJSON = function toJSON(\n  editorState /*: typeof EditorState */\n) /*: Object */ {\n  return convertToRaw(editorState.getCurrentContent());\n};\n\nvar toState = function toState(json /*: Object */) /*: typeof EditorState */ {\n  return EditorState.createWithContent(convertFromRaw(json));\n};\n\nvar isAndroid = function isAndroid() /*: bool */ {\n  return navigator.userAgent.toLowerCase().indexOf('android') > -1;\n};\n\nmodule.exports = {\n  toJSON: toJSON,\n  toState: toState,\n  toPlainText: toPlainText,\n  fromPlainText: fromPlainText,\n  emptyContentState: emptyContentState,\n  isAndroid: isAndroid,\n};\n"
  },
  {
    "path": "shared/draft-utils/message-types.js",
    "content": "// @flow\n\nexport const messageTypeObj = {\n  text: 'text',\n  media: 'media',\n  draftjs: 'draftjs',\n};\nexport type MessageType = $Keys<typeof messageTypeObj>;\n"
  },
  {
    "path": "shared/draft-utils/process-message-content.js",
    "content": "// @flow\nimport { stateFromMarkdown } from 'draft-js-import-markdown';\nimport { convertFromRaw, convertToRaw, EditorState } from 'draft-js';\nimport { addEmbedsToEditorState } from './add-embeds-to-draft-js';\nimport { messageTypeObj, type MessageType } from './message-types';\n\nexport { messageTypeObj };\n\nexport default (type: MessageType, body: string): string => {\n  let newBody = body;\n  if (type === messageTypeObj.text) {\n    // workaround react-mentions bug by replacing @[username] with @username\n    // @see withspectrum/spectrum#4587\n    newBody = newBody.replace(/@\\[([a-z0-9_-]+)\\]/g, '@$1');\n    newBody = JSON.stringify(\n      convertToRaw(\n        stateFromMarkdown(newBody, {\n          customBlockFn: elem => {\n            if (elem.nodeName !== 'PRE') return;\n\n            const code = elem.childNodes.find(node => node.nodeName === 'CODE');\n            if (!code) return;\n\n            const className = code.attributes.find(\n              ({ name }) => name === 'class'\n            );\n            if (!className) return;\n\n            const lang = className.value.replace('lang-', '');\n\n            return {\n              type: null,\n              data: {\n                language: lang,\n              },\n            };\n          },\n          parserOptions: {\n            breaks: true,\n          },\n        })\n      )\n    );\n  }\n\n  // Add automatic embeds to body\n  try {\n    return JSON.stringify(addEmbedsToEditorState(JSON.parse(newBody)));\n    // Ignore errors during automatic embed detection\n  } catch (err) {\n    console.error(err);\n    return newBody;\n  }\n};\n"
  },
  {
    "path": "shared/draft-utils/process-thread-content.js",
    "content": "// @flow\nimport { stateFromMarkdown } from 'draft-js-import-markdown';\nimport { convertFromRaw, convertToRaw, EditorState } from 'draft-js';\nimport { addEmbedsToEditorState } from './add-embeds-to-draft-js';\n\nexport default (type: 'TEXT' | 'DRAFTJS', body: ?string): string => {\n  let newBody = body;\n  if (type === 'TEXT') {\n    // workaround react-mentions bug by replacing @[username] with @username\n    // @see withspectrum/spectrum#4587\n    newBody = newBody ? newBody.replace(/@\\[([a-z0-9_-]+)\\]/g, '@$1') : '';\n    newBody = JSON.stringify(\n      convertToRaw(\n        stateFromMarkdown(newBody, {\n          customBlockFn: elem => {\n            if (elem.nodeName !== 'PRE') return;\n\n            const code = elem.childNodes.find(node => node.nodeName === 'CODE');\n            if (!code) return;\n\n            const className = code.attributes.find(\n              ({ name }) => name === 'class'\n            );\n            if (!className) return;\n\n            const lang = className.value.replace('lang-', '');\n\n            return {\n              type: null,\n              data: {\n                language: lang,\n              },\n            };\n          },\n          parserOptions: {\n            atomicImages: true,\n            breaks: true,\n          },\n        })\n      )\n    );\n  }\n\n  // Add automatic embeds to body\n  try {\n    return JSON.stringify(addEmbedsToEditorState(JSON.parse(newBody || '')));\n    // Ignore errors during automatic embed detection\n  } catch (err) {\n    console.error(err);\n    return newBody || '';\n  }\n};\n"
  },
  {
    "path": "shared/draft-utils/test/__snapshots__/add-embeds-to-draft-js.test.js.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`should add embeds 1`] = `\nObject {\n  \"blocks\": Array [\n    Object {\n      \"data\": Object {},\n      \"depth\": 0,\n      \"entityRanges\": Array [\n        Object {\n          \"key\": 0,\n          \"length\": 33,\n          \"offset\": 0,\n        },\n      ],\n      \"inlineStyleRanges\": Array [],\n      \"key\": \"g0000\",\n      \"text\": \"https://simplecast.com/s/a1f11d11\",\n      \"type\": \"unstyled\",\n    },\n  ],\n  \"entityMap\": Object {\n    \"0\": Object {\n      \"data\": Object {\n        \"height\": 200,\n        \"src\": \"https://embed.simplecast.com/a1f11d11\",\n        \"type\": \"simplecast\",\n        \"url\": \"https://embed.simplecast.com/a1f11d11\",\n      },\n      \"mutability\": \"MUTABLE\",\n      \"type\": \"embed\",\n    },\n  },\n}\n`;\n\nexports[`should add multiple embeds to text 1`] = `\nObject {\n  \"blocks\": Array [\n    Object {\n      \"data\": Object {},\n      \"depth\": 0,\n      \"entityRanges\": Array [\n        Object {\n          \"key\": 0,\n          \"length\": 33,\n          \"offset\": 13,\n        },\n        Object {\n          \"key\": 0,\n          \"length\": 33,\n          \"offset\": 65,\n        },\n      ],\n      \"inlineStyleRanges\": Array [],\n      \"key\": \"g0000\",\n      \"text\": \"New podcast! https://simplecast.com/s/a1f11d11 it is really cool https://simplecast.com/s/a1f11d11\",\n      \"type\": \"unstyled\",\n    },\n  ],\n  \"entityMap\": Object {\n    \"0\": Object {\n      \"data\": Object {\n        \"height\": 200,\n        \"src\": \"https://embed.simplecast.com/a1f11d11\",\n        \"type\": \"simplecast\",\n        \"url\": \"https://embed.simplecast.com/a1f11d11\",\n      },\n      \"mutability\": \"MUTABLE\",\n      \"type\": \"embed\",\n    },\n  },\n}\n`;\n\nexports[`should remove link entities 1`] = `\nObject {\n  \"blocks\": Array [\n    Object {\n      \"data\": Object {},\n      \"depth\": 0,\n      \"entityRanges\": Array [\n        Object {\n          \"key\": 1,\n          \"length\": 33,\n          \"offset\": 0,\n        },\n      ],\n      \"inlineStyleRanges\": Array [],\n      \"key\": \"g0000\",\n      \"text\": \"https://simplecast.com/s/a1f11d11\",\n      \"type\": \"unstyled\",\n    },\n  ],\n  \"entityMap\": Object {\n    \"0\": Object {\n      \"data\": Object {\n        \"href\": \"https://simplecast.com/s/a1f11d11\",\n      },\n      \"mutability\": \"MUTABLE\",\n      \"type\": \"link\",\n    },\n    \"1\": Object {\n      \"data\": Object {\n        \"height\": 200,\n        \"src\": \"https://embed.simplecast.com/a1f11d11\",\n        \"type\": \"simplecast\",\n        \"url\": \"https://embed.simplecast.com/a1f11d11\",\n      },\n      \"mutability\": \"MUTABLE\",\n      \"type\": \"embed\",\n    },\n  },\n}\n`;\n"
  },
  {
    "path": "shared/draft-utils/test/add-embeds-to-draft-js.test.js",
    "content": "// @flow\njest.mock('draft-js/lib/generateRandomKey', () => {\n  let last = 0;\n  const multiplier = Math.exp(24);\n  return () => Math.floor(last++ * multiplier).toString(32);\n});\nimport {\n  getEmbedsFromText,\n  addEmbedsToEditorState,\n} from '../add-embeds-to-draft-js';\n\ndescribe('sites', () => {\n  describe('<iframe>', () => {\n    it('should handle simple HTML', () => {\n      const url = 'https://bla.com';\n      const text = `<iframe src=\"${url}\" />`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          url,\n          type: 'iframe',\n        },\n      ]);\n    });\n\n    it('should handle attributes', () => {\n      const url = 'https://bla.com';\n      const text = `<iframe src=\"${url}\" height=\"500px\" />`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          url,\n          type: 'iframe',\n        },\n      ]);\n    });\n  });\n\n  describe('vimeo', () => {\n    it('should handle standard urls', () => {\n      const id = '313662630';\n      const text = `https://www.vimeo.com/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://player.vimeo.com/video/${id}`,\n          type: 'vimeo',\n        },\n      ]);\n    });\n\n    it('should handle urls without https://', () => {\n      const id = '313662630';\n      const text = `www.vimeo.com/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://player.vimeo.com/video/${id}`,\n          type: 'vimeo',\n        },\n      ]);\n    });\n\n    it('should handle urls without www', () => {\n      const id = '313662630';\n      const text = `vimeo.com/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://player.vimeo.com/video/${id}`,\n          type: 'vimeo',\n        },\n      ]);\n    });\n\n    it('should handle channel urls', () => {\n      const id = '313662630';\n      const text = `https://www.vimeo.com/channels/staffpicks/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://player.vimeo.com/video/${id}`,\n          type: 'vimeo',\n        },\n      ]);\n    });\n\n    it('should handle channel urls with numbers and underscores', () => {\n      const id = '313662630';\n      const text = `https://www.vimeo.com/channels/my_channel123/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://player.vimeo.com/video/${id}`,\n          type: 'vimeo',\n        },\n      ]);\n    });\n  });\n\n  describe('figma', () => {\n    it('should handle file urls', () => {\n      const text = 'www.figma.com/file/aLQFl2vxHpVRI6yDppNMMH3i/logo';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.figma.com/embed?embed_host=spectrum&url=${text}`,\n          type: 'figma',\n        },\n      ]);\n    });\n\n    it('should handle file urls with query strings', () => {\n      const text =\n        'www.figma.com/file/aLQFl2vxHpVRI6yDppNMMH3i/logo?node-id=0%3A2';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.figma.com/embed?embed_host=spectrum&url=${text}`,\n          type: 'figma',\n        },\n      ]);\n    });\n\n    it('should handle prototyping urls', () => {\n      const text = 'www.figma.com/proto/aLQFl2vxHpVRI6yDppNMMH3i/logo';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.figma.com/embed?embed_host=spectrum&url=${text}`,\n          type: 'figma',\n        },\n      ]);\n    });\n\n    it('should handle prototyping urls with query strings', () => {\n      const text =\n        'www.figma.com/proto/aLQFl2vxHpVRI6yDppNMMH3i/logo?node-id=0%3A2&scaling=min-zoom';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.figma.com/embed?embed_host=spectrum&url=${text}`,\n          type: 'figma',\n        },\n      ]);\n    });\n\n    it('should urls with https', () => {\n      const text = 'https://www.figma.com/file/aLQFl2vxHpVRI6yDppNMMH3i/logo';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.figma.com/embed?embed_host=spectrum&url=${text}`,\n          type: 'figma',\n        },\n      ]);\n    });\n  });\n\n  describe('youtube', () => {\n    it('should handle video urls', () => {\n      const id = '2pMb6RJ7ioU';\n      const text = `https://www.youtube.com/watch?v=${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.youtube.com/embed/${id}`,\n          type: 'youtube',\n        },\n      ]);\n    });\n\n    it('should handle youtu.be urls', () => {\n      const id = '2pMb6RJ7ioU';\n      const text = `https://www.youtu.be/${id}`;\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          aspectRatio: '56.25%',\n          url: `https://www.youtube.com/embed/${id}`,\n          type: 'youtube',\n        },\n      ]);\n    });\n  });\n\n  describe('framer', () => {\n    it('should handle prototyping urls', () => {\n      const text = 'https://framer.cloud/asdf123';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          url: 'https://share.framerjs.com/asdf123',\n          type: 'framer',\n          width: 600,\n          height: 800,\n        },\n      ]);\n    });\n\n    it('should handle share urls', () => {\n      const text = 'https://share.framerjs.com/478kta5wx0wn';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          url: 'https://share.framerjs.com/478kta5wx0wn',\n          type: 'framer',\n          width: 600,\n          height: 800,\n        },\n      ]);\n    });\n  });\n\n  describe('codepen', () => {\n    it('should handle pen URLs', () => {\n      const text = 'https://codepen.io/jcoulterdesign/pen/NeOQzX';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 300,\n          url: 'https://codepen.io/jcoulterdesign/embed/NeOQzX',\n          type: 'codepen',\n        },\n      ]);\n    });\n\n    it('should handle full screen view URLs', () => {\n      const text = 'https://codepen.io/jcoulterdesign/full/NeOQzX';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 300,\n          url: 'https://codepen.io/jcoulterdesign/embed/NeOQzX',\n          type: 'codepen',\n        },\n      ]);\n    });\n\n    it('should handle details view URLs', () => {\n      const text = 'https://codepen.io/jcoulterdesign/details/NeOQzX';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 300,\n          url: 'https://codepen.io/jcoulterdesign/embed/NeOQzX',\n          type: 'codepen',\n        },\n      ]);\n    });\n\n    it('should handle embed URLs', () => {\n      const text = 'https://codepen.io/jcoulterdesign/embed/NeOQzX';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 300,\n          url: 'https://codepen.io/jcoulterdesign/embed/NeOQzX',\n          type: 'codepen',\n        },\n      ]);\n    });\n  });\n\n  describe('codesandbox', () => {\n    it('should handle sandbox urls', () => {\n      const text = 'https://codesandbox.io/s/8lz7276xz2';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 500,\n          url: 'https://codesandbox.io/embed/8lz7276xz2',\n          type: 'codesandbox',\n        },\n      ]);\n    });\n\n    it('should handle sandbox urls with query params', () => {\n      const text = 'https://codesandbox.io/s/8lz7276xz2?autoresize=true';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 500,\n          url: 'https://codesandbox.io/embed/8lz7276xz2?autoresize=true',\n          type: 'codesandbox',\n        },\n      ]);\n    });\n\n    it('should handle embed urls', () => {\n      const text = 'https://codesandbox.io/embed/8lz7276xz2';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 500,\n          url: 'https://codesandbox.io/embed/8lz7276xz2',\n          type: 'codesandbox',\n        },\n      ]);\n    });\n  });\n\n  describe('simplecast', () => {\n    it('should handle simplecast urls', () => {\n      const text = 'https://simplecast.com/s/8fb96767';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 200,\n          url: 'https://embed.simplecast.com/8fb96767',\n          type: 'simplecast',\n        },\n      ]);\n    });\n\n    it('should handle simplecast urls with query params', () => {\n      const text = 'https://simplecast.com/s/8fb96767?color=000000';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 200,\n          url: 'https://embed.simplecast.com/8fb96767?color=000000',\n          type: 'simplecast',\n        },\n      ]);\n    });\n\n    it('should handle embed urls', () => {\n      const text = 'https://embed.simplecast.com/8fb96767';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          height: 200,\n          url: 'https://embed.simplecast.com/8fb96767',\n          type: 'simplecast',\n        },\n      ]);\n    });\n  });\n\n  describe('thread urls', () => {\n    it('should handle full thread urls', () => {\n      const text =\n        'https://spectrum.chat/spectrum/general/hello~4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle /thread/:id urls', () => {\n      const text =\n        'https://spectrum.chat/thread/4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?thread urls', () => {\n      const text =\n        'https://spectrum.chat/?thread=4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?thread urls with query params before', () => {\n      const text =\n        'https://spectrum.chat/?m=asdf&thread=4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?thread urls with query params after', () => {\n      const text =\n        'https://spectrum.chat/?thread=4026b1bd-3896-46a4-9ade-e621a90e64ad&m=asdf';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?t urls', () => {\n      const text =\n        'https://spectrum.chat/?t=4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?t urls with query params before', () => {\n      const text =\n        'https://spectrum.chat/?m=asdf&t=4026b1bd-3896-46a4-9ade-e621a90e64ad';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n\n    it('should handle ?t urls with query params after', () => {\n      const text =\n        'https://spectrum.chat/?t=4026b1bd-3896-46a4-9ade-e621a90e64ad&m=asdf';\n      expect(getEmbedsFromText(text)).toEqual([\n        {\n          id: '4026b1bd-3896-46a4-9ade-e621a90e64ad',\n          entity: 'thread',\n          type: 'internal',\n        },\n      ]);\n    });\n  });\n});\n\ndescribe('complex text', () => {\n  it('should handle text before and after the URL', () => {\n    const text = 'this is cool: vimeo.com/123456 love it!';\n    expect(getEmbedsFromText(text)).toEqual([\n      {\n        url: 'https://player.vimeo.com/video/123456',\n        aspectRatio: '56.25%',\n        type: 'vimeo',\n      },\n    ]);\n  });\n\n  it('should handle the same url multiple times', () => {\n    const text = 'vimeo.com/123456 vimeo.com/123456 vimeo.com/123456';\n    expect(getEmbedsFromText(text)).toEqual([\n      {\n        url: 'https://player.vimeo.com/video/123456',\n        aspectRatio: '56.25%',\n        type: 'vimeo',\n      },\n    ]);\n  });\n\n  it('should handle multiple embeds', () => {\n    const text =\n      'Hey, look at this vimeo.com/123456 and this: youtu.be/asdf123 wow';\n    expect(getEmbedsFromText(text)).toEqual([\n      {\n        aspectRatio: '56.25%',\n        url: 'https://www.youtube.com/embed/asdf123',\n        type: 'youtube',\n      },\n      {\n        aspectRatio: '56.25%',\n        url: 'https://player.vimeo.com/video/123456',\n        type: 'vimeo',\n      },\n    ]);\n  });\n\n  it('should handle a URL and an iframe', () => {\n    const text = 'vimeo.com/123456 <iframe src=\"bla.com\" />';\n    expect(getEmbedsFromText(text)).toEqual([\n      {\n        url: 'bla.com',\n        type: 'iframe',\n      },\n      {\n        url: 'https://player.vimeo.com/video/123456',\n        aspectRatio: '56.25%',\n        type: 'vimeo',\n      },\n    ]);\n  });\n\n  it('should handle text without embeds', () => {\n    expect(getEmbedsFromText('no embeds here')).toEqual([]);\n  });\n\n  it('should handle embeds with duplicate other links (#4778)', () => {\n    const text =\n      'https://simplecast.com/s/a1f11d11\\n\\n[Sentry.io](http://www.sentry.io) [Sentry](https://sentry.io)';\n    expect(getEmbedsFromText(text)).toEqual([\n      {\n        height: 200,\n        url: 'https://embed.simplecast.com/a1f11d11',\n        type: 'simplecast',\n      },\n    ]);\n  });\n});\n\nit('should not change anything if there are not embeds to add', () => {\n  const input = {\n    blocks: [\n      {\n        type: 'unstyled',\n        key: 'g0000',\n        data: {},\n        depth: 0,\n        inlineStyleRanges: [],\n        entityRanges: [],\n        text: 'Hello world!',\n      },\n    ],\n    entityMap: {},\n  };\n  expect(addEmbedsToEditorState(input)).toEqual(input);\n});\n\nit('should add embeds', () => {\n  const input = {\n    blocks: [\n      {\n        type: 'unstyled',\n        key: 'g0000',\n        data: {},\n        depth: 0,\n        inlineStyleRanges: [],\n        entityRanges: [],\n        text: 'https://simplecast.com/s/a1f11d11',\n      },\n    ],\n    entityMap: {},\n  };\n  expect(addEmbedsToEditorState(input)).toMatchSnapshot();\n});\n\nit('should add multiple embeds to text', () => {\n  const input = {\n    blocks: [\n      {\n        type: 'unstyled',\n        key: 'g0000',\n        data: {},\n        depth: 0,\n        inlineStyleRanges: [],\n        entityRanges: [],\n        text:\n          'New podcast! https://simplecast.com/s/a1f11d11 it is really cool https://simplecast.com/s/a1f11d11',\n      },\n    ],\n    entityMap: {},\n  };\n  expect(addEmbedsToEditorState(input)).toMatchSnapshot();\n});\n\nit('should remove link entities', () => {\n  const input = {\n    blocks: [\n      {\n        type: 'unstyled',\n        key: 'g0000',\n        data: {},\n        depth: 0,\n        inlineStyleRanges: [],\n        entityRanges: [\n          {\n            offset: 0,\n            length: 33,\n            key: 0,\n          },\n        ],\n        text: 'https://simplecast.com/s/a1f11d11',\n      },\n    ],\n    entityMap: {\n      0: {\n        type: 'link',\n        mutability: 'MUTABLE',\n        data: {\n          href: 'https://simplecast.com/s/a1f11d11',\n        },\n      },\n    },\n  };\n  expect(addEmbedsToEditorState(input)).toMatchSnapshot();\n});\n"
  },
  {
    "path": "shared/encryption/index.js",
    "content": "// @flow\nrequire('now-env');\n\nvar ENCRYPTION_KEY =\n  process.env.NODE_ENV === 'development'\n    ? 'abcdefghijklmnopqrstuvwxyzasdfjk'\n    : process.env.ENCRYPTION_KEY; // Must be 256 bytes (32 characters)\n\nif (!ENCRYPTION_KEY) {\n  throw new Error(\n    'Looks like youre missing an encryption key for sensitive data!'\n  );\n}\n\nvar Cryptr = require('cryptr'),\n  cryptr = new Cryptr(ENCRYPTION_KEY);\n\nfunction encryptString(text /*: string */) /*: string */ {\n  return cryptr.encrypt(text);\n}\n\nfunction decryptString(text /*: string */) /*: string */ {\n  return cryptr.decrypt(text);\n}\n\nfunction encryptObject(object /*: Object */) /*: Object */ {\n  return cryptr.encrypt(JSON.stringify(object));\n}\n\nfunction decryptObject(text /*: string */) /*: Object */ {\n  return JSON.parse(cryptr.decrypt(text));\n}\n\nmodule.exports = { decryptString, encryptString, decryptObject, encryptObject };\n"
  },
  {
    "path": "shared/generate-meta-info.js",
    "content": "/**\n * This file is shared between server and client.\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\n *\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\n * so it chokes on the Flow syntax.\n * More info: https://flow.org/en/docs/types/comments/\n */\nvar truncate = require('./truncate');\nvar striptags = require('striptags');\nvar toPlainText = require('./clients/draft-js/utils/plaintext').toPlainText;\n\nvar DEFAULT_META = {\n  title: 'Spectrum',\n  description: 'Where communities live.',\n};\n\nvar HIDE_FROM_CRAWLERS = '<meta name=\"robots\" content=\"noindex, nofollow\">';\n\n/*::\ntype MaybeMeta = {\n  title?: string,\n  description?: string,\n  extra?: string,\n};\n\ntype Meta = {\n  title: string,\n  description: string,\n  extra: string,\n};\n\ntype OtherInput = {\n  type?: string,\n  data?: void,\n};\ntype ThreadInput = {\n  type: 'thread',\n  data?: { title: string, body?: ?string, communityName?: string, privateChannel?: ?boolean type?: ?string },\n};\ntype UserInput = {\n  type: 'user',\n  data?: { name: string, username: string, description?: string },\n};\ntype ChannelInput = {\n  type: 'channel',\n  data?: { name: string, description?: string, communityName?: string, private?: ?boolean },\n};\ntype CommunityInput = {\n  type: 'community',\n  data?: { name: string, description?: string },\n};\ntype DirectMessageInput = {\n  type: 'directMessage',\n  data?: { title: string, description?: string },\n};\ntype Input =\n  | ThreadInput\n  | UserInput\n  | ChannelInput\n  | CommunityInput\n  | OtherInput;\n*/\n\nfunction setDefault(input /*: MaybeMeta */) /*: Meta */ {\n  var title = input.title || DEFAULT_META.title;\n  var description = input.description || DEFAULT_META.description;\n  // If theres a custom title but no custom description\n  // prefix \"On spectrum\" to the description\n  // Otherwise you end up with \"SpecFM | Where communities live\"\n  if (input.title && !input.description) {\n    description = 'on Spectrum, ' + DEFAULT_META.description.toLowerCase();\n  }\n  return {\n    title: title,\n    description: cleanDescription(description),\n    extra: input.extra || '',\n  };\n}\n\nfunction cleanDescription(input /*: string */) /*: string */ {\n  return truncate(striptags(input), 160);\n}\n\nfunction generateMetaInfo(input /*: Input */) /*: Meta */ {\n  var exists = input || {};\n  var type = exists.type;\n  var data = exists.data;\n  switch (type) {\n    case 'explore': {\n      return {\n        title: 'Explore',\n        description: 'Explore some of the communities on Spectrum',\n      };\n    }\n    case 'thread': {\n      if (data.privateChannel)\n        return setDefault({\n          extra: HIDE_FROM_CRAWLERS,\n        });\n\n      var body =\n        data &&\n        data.body &&\n        (data.type === 'DRAFTJS'\n          ? toPlainText(JSON.parse(data.body))\n          : data.body);\n      return setDefault({\n        title: data && data.title + ' · ' + data.communityName,\n        description: body,\n      });\n    }\n    case 'user': {\n      return setDefault({\n        title: data && data.name + ' · @' + data.username,\n        description: data && data.description,\n      });\n    }\n    case 'channel': {\n      if (data.private)\n        return setDefault({\n          extra: HIDE_FROM_CRAWLERS,\n        });\n      return setDefault({\n        title: data && data.communityName + ' · ' + data.name,\n        description: data && data.description,\n      });\n    }\n    case 'community': {\n      return setDefault({\n        title: data && data.name,\n        description: data && data.description,\n      });\n    }\n    case 'directMessage': {\n      return setDefault({\n        title: data && data.title,\n        description: data && data.description,\n      });\n    }\n    case 'notifications': {\n      return setDefault({\n        title: 'Notifications',\n        description: 'Notifications on Spectrum',\n      });\n    }\n    default: {\n      return DEFAULT_META;\n    }\n  }\n}\n\nmodule.exports = generateMetaInfo;\n"
  },
  {
    "path": "shared/get-mentions.js",
    "content": "// @flow\nimport { MENTIONS } from './regexps';\n\nexport const getMentions = (text: string): Array<string> => {\n  const matchedMentions = text.match(MENTIONS);\n  const mentions = matchedMentions\n    ? matchedMentions.filter(mention => !mention.startsWith('/'))\n    : [];\n  if (!mentions || mentions.length === 0) return [];\n  // \" @Mxstbr\" => \"@Mxstbr\"\n  const trimmed = mentions.map(\n    mention => (typeof mention === 'string' ? mention.trim() : mention)\n  );\n  // \"@Mxstbr\" => \"Mxstbr\"\n  const cleaned = removeAtSymbol(trimmed);\n  // \"Mxstbr\" => \"mxstbr\"\n  const lowercase = makeLowercase(cleaned);\n  // [\"mxstbr\", \"mxstbr\"] => [\"mxstbr\"]\n  const distinct = getDistinctMentions(lowercase);\n  return distinct;\n};\n\nconst makeLowercase = (usernames: Array<string>): Array<string> => {\n  return usernames.map(u => u.toLowerCase());\n};\n\nconst removeAtSymbol = (usernames: Array<string>): Array<string> => {\n  return usernames.map(u => u.substr(1));\n};\n\nexport const getDistinctMentions = (\n  usernames: Array<string>\n): Array<string> => {\n  return usernames.filter((v, i, a) => a.indexOf(v) === i);\n};\n\nexport default getMentions;\n"
  },
  {
    "path": "shared/graphql/apollo-client-options.js",
    "content": "var apollo = require('apollo-utilities'),\n  toIdValue = apollo.toIdValue;\n\nfunction dataIdFromObject(result) {\n  if (result.__typename) {\n    // Custom Community cache key based on slug\n    if (result.__typename === 'Community' && !!result.slug) {\n      return result.__typename + ':' + result.slug;\n    }\n    // Custom Channel cache key based on slug and community slug\n    if (\n      result.__typename === 'Channel' &&\n      !!result.slug &&\n      !!result.community &&\n      !!result.community.slug\n    ) {\n      return (\n        result.__typename + ':' + result.community.slug + ':' + result.slug\n      );\n    }\n    // This was copied from the default dataIdFromObject\n    if (result.id !== undefined) {\n      return result.__typename + ':' + result.id;\n    }\n    if (result._id !== undefined) {\n      return result.__typename + ':' + result._id;\n    }\n  }\n  return null;\n}\n\nvar getSharedApolloClientOptions = function getSharedApolloClientOptions() {\n  return {\n    queryDeduplication: true,\n    dataIdFromObject: dataIdFromObject,\n    cacheRedirects: {\n      Query: {\n        thread: function thread(_, _ref) {\n          var id = _ref.id;\n          return toIdValue(dataIdFromObject({ __typename: 'Thread', id: id }));\n        },\n        community: function community(_, _ref2) {\n          var slug = _ref2.slug;\n          return toIdValue(\n            dataIdFromObject({ __typename: 'Community', slug: slug })\n          );\n        },\n        channel: function channel(_, _ref3) {\n          var channelSlug = _ref3.channelSlug,\n            communitySlug = _ref3.communitySlug;\n          return toIdValue(\n            dataIdFromObject({\n              __typename: 'Channel',\n              slug: channelSlug,\n              community: { slug: communitySlug },\n            })\n          );\n        },\n      },\n    },\n  };\n};\n\nmodule.exports = getSharedApolloClientOptions;\n"
  },
  {
    "path": "shared/graphql/constants.js",
    "content": "// @flow\n// The constants for the GraphQL client on the web\n\nexport const IS_PROD =\n  process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV;\n// In production the API is at the same URL, in development it's at a different port\nexport const API_URI = IS_PROD ? '/api' : 'http://localhost:3001/api';\nexport const WS_URI = IS_PROD\n  ? `wss://${window.location.host}/websocket`\n  : 'ws://localhost:3001/websocket';\n"
  },
  {
    "path": "shared/graphql/fragments/channel/channelInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport communityInfoFragment from '../community/communityInfo';\nimport communityMetaFragment from '../community/communityMetaData';\nimport type { CommunityInfoType } from '../community/communityInfo';\nimport type { CommunityMetaDataType } from '../community/communityMetaData';\n\nexport type ChannelInfoType = {\n  id: string,\n  name: string,\n  slug: string,\n  description: ?string,\n  isPrivate: boolean,\n  createdAt: Date,\n  isArchived: boolean,\n  channelPermissions: {\n    isMember: boolean,\n    isPending: boolean,\n    isBlocked: boolean,\n    isOwner: boolean,\n    isModerator: boolean,\n    receiveNotifications: boolean,\n  },\n  community: {\n    ...$Exact<CommunityInfoType>,\n    ...$Exact<CommunityMetaDataType>,\n  },\n};\n\nexport default gql`\n  fragment channelInfo on Channel {\n    id\n    name\n    slug\n    description\n    isPrivate\n    createdAt\n    isArchived\n    channelPermissions {\n      isMember\n      isPending\n      isBlocked\n      isOwner\n      isModerator\n      receiveNotifications\n    }\n    community {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/channel/channelMemberConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../user/userInfo';\nimport type { UserInfoType } from '../user/userInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<UserInfoType>,\n    contextPermissions: {\n      communityId: string,\n    },\n  },\n};\n\nexport type ChannelMemberConnectionType = {\n  memberConnection?: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment channelMemberConnection on Channel {\n    memberConnection(after: $after, first: $first) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...userInfo\n          contextPermissions {\n            communityId\n          }\n        }\n      }\n    }\n  }\n  ${userInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/channel/channelMetaData.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type ChannelMetaDataType = {\n  metaData: {\n    members: number,\n  },\n};\n\nexport default gql`\n  fragment channelMetaData on Channel {\n    metaData {\n      members\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/channel/channelThreadConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../thread/threadInfo';\nimport type { ThreadInfoType } from '../thread/threadInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<ThreadInfoType>,\n  },\n};\n\nexport type ChannelThreadConnectionType = {\n  threadConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment channelThreadConnection on Channel {\n    threadConnection(first: 10, after: $after) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...threadInfo\n        }\n      }\n    }\n  }\n  ${threadInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communityChannelConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport channelInfoFragment from '../../fragments/channel/channelInfo';\nimport type { ChannelInfoType } from '../../fragments/channel/channelInfo';\n\ntype Edge = {\n  node: {\n    ...$Exact<ChannelInfoType>,\n  },\n};\n\nexport type CommunityChannelConnectionType = {\n  channelConnection: {\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment communityChannelConnection on Community {\n    channelConnection {\n      edges {\n        node {\n          ...channelInfo\n        }\n      }\n    }\n  }\n  ${channelInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communityInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type CommunityInfoType = {\n  id: string,\n  createdAt: Date,\n  name: string,\n  slug: string,\n  description: ?string,\n  website: ?string,\n  profilePhoto: string,\n  coverPhoto: string,\n  pinnedThreadId: ?string,\n  watercoolerId: ?string,\n  isPrivate: boolean,\n  redirect?: Boolean,\n  communityPermissions: {\n    isMember: boolean,\n    isBlocked: boolean,\n    isOwner: boolean,\n    isPending: boolean,\n    isModerator: boolean,\n  },\n};\n\nexport default gql`\n  fragment communityInfo on Community {\n    id\n    createdAt\n    name\n    slug\n    description\n    website\n    profilePhoto\n    coverPhoto\n    pinnedThreadId\n    isPrivate\n    watercoolerId\n    redirect\n    noindex\n    communityPermissions {\n      isMember\n      isBlocked\n      isOwner\n      isPending\n      isModerator\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communityMembers.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport communityMemberInfoFragment, {\n  type CommunityMemberInfoType,\n} from '../communityMember/communityMemberInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<CommunityMemberInfoType>,\n  },\n};\n\nexport type CommunityMembersType = {\n  members: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment communityMembers on Community {\n    members(after: $after, filter: $filter, first: $first)\n      @connection(key: \"communityMembers\", filters: [\"filter\"]) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...communityMemberInfo\n        }\n      }\n    }\n  }\n  ${communityMemberInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communityMetaData.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type CommunityMetaDataType = {\n  metaData: {\n    members: number,\n  },\n};\n\nexport default gql`\n  fragment communityMetaData on Community {\n    metaData {\n      members\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communitySettings.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type CommunitySettingsType = {\n  joinSettings: {\n    tokenJoinEnabled: boolean,\n    token: string,\n  },\n};\n\nexport default gql`\n  fragment communitySettings on Community {\n    joinSettings {\n      tokenJoinEnabled\n      token\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/community/communityThreadConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../thread/threadInfo';\nimport type { ThreadInfoType } from '../thread/threadInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<ThreadInfoType>,\n  },\n};\n\nexport type ThreadConnectionType = {\n  pageInfo: {\n    hasNextPage: boolean,\n    hasPreviousPage: boolean,\n  },\n  edges: Array<?Edge>,\n};\n\nexport type CommunityThreadConnectionType = {\n  pinnedThread: {\n    ...$Exact<ThreadInfoType>,\n  },\n  watercooler: {\n    ...$Exact<ThreadInfoType>,\n  },\n  threadConnection: ThreadConnectionType,\n};\n\nexport default gql`\n  fragment communityThreadConnection on Community {\n    pinnedThread {\n      ...threadInfo\n    }\n    watercooler {\n      ...threadInfo\n    }\n    threadConnection(first: 10, after: $after, sort: $sort)\n      @connection(key: \"community-thread-connection\", filter: [\"sort\"]) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...threadInfo\n        }\n      }\n    }\n  }\n  ${threadInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/communityMember/communityMemberInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport userInfoFragment, { type UserInfoType } from '../user/userInfo';\n\nexport type CommunityMemberInfoType = {\n  user: {\n    ...$Exact<UserInfoType>,\n  },\n  isMember: boolean,\n  isModerator: boolean,\n  isBlocked: boolean,\n  isOwner: boolean,\n  isPending: boolean,\n  roles: Array<string>,\n};\n\nexport default gql`\n  fragment communityMemberInfo on CommunityMember {\n    id\n    user {\n      ...userInfo\n    }\n    isMember\n    isModerator\n    isBlocked\n    isOwner\n    isPending\n    roles\n  }\n  ${userInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/directMessageThread/directMessageThreadInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport type { UserInfoType } from '../user/userInfo';\n\nexport type ParticipantType = {\n  ...$Exact<UserInfoType>,\n  userId: string,\n};\n\nexport type DirectMessageThreadInfoType = {\n  id: string,\n  snippet: string,\n  threadLastActive: Date,\n  participants: Array<ParticipantType>,\n};\n\nexport default gql`\n  fragment directMessageThreadInfo on DirectMessageThread {\n    id\n    snippet\n    threadLastActive\n    participants {\n      id\n      name\n      profilePhoto\n      username\n      userId\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/directMessageThread/directMessageThreadMessageConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport directMessageInfoFragment from '../message/directMessageInfo';\nimport type { DirectMessageInfoType } from '../message/directMessageInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<DirectMessageInfoType>,\n  },\n};\n\nexport type DirectMessageThreadMessageConnectionType = {\n  messageConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment directMessageThreadMessageConnection on DirectMessageThread {\n    messageConnection(after: $after) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...directMessageInfo\n        }\n      }\n    }\n  }\n  ${directMessageInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/message/directMessageInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../user/userInfo';\nimport type { UserInfoType } from '../user/userInfo';\n\nexport type DirectMessageInfoType = {\n  id: string,\n  timestamp: Date,\n  messageType: string,\n  modifiedAt: string,\n  author: {\n    user: {\n      ...$Exact<UserInfoType>,\n    },\n  },\n  parent: {\n    id: string,\n    timestamp: Date,\n    messageType: string,\n    author: {\n      user: {\n        ...$Exact<UserInfoType>,\n      },\n    },\n    content: {\n      body: string,\n    },\n  },\n  reactions: {\n    count: number,\n    hasReacted: boolean,\n  },\n  content: {\n    body: string,\n  },\n};\n\nexport default gql`\n  fragment directMessageInfo on Message {\n    id\n    timestamp\n    messageType\n    modifiedAt\n    author {\n      user {\n        ...userInfo\n      }\n    }\n    parent {\n      id\n      timestamp\n      messageType\n      author {\n        user {\n          ...userInfo\n        }\n      }\n      content {\n        body\n      }\n    }\n    reactions {\n      count\n      hasReacted\n    }\n    content {\n      body\n    }\n  }\n  ${userInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/message/messageInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport threadParticipantFragment from '../thread/threadParticipant';\nimport type { ThreadParticipantType } from '../thread/threadParticipant';\n\nexport type MessageInfoType = {\n  id: string,\n  timestamp: string,\n  messageType: string,\n  modifiedAt: string,\n  bot?: boolean,\n  parent: {\n    id: string,\n    timestamp: Date,\n    messageType: string,\n    author: {\n      ...$Exact<ThreadParticipantType>,\n    },\n    content: {\n      body: string,\n    },\n  },\n  author: {\n    ...$Exact<ThreadParticipantType>,\n  },\n  reactions: {\n    count: number,\n    hasReacted: boolean,\n  },\n  content: {\n    body: string,\n  },\n};\n\nexport default gql`\n  fragment messageInfo on Message {\n    id\n    timestamp\n    modifiedAt\n    messageType\n    bot\n    parent {\n      id\n      timestamp\n      messageType\n      author {\n        ...threadParticipant\n      }\n      content {\n        body\n      }\n    }\n    author {\n      ...threadParticipant\n    }\n    reactions {\n      count\n      hasReacted\n    }\n    content {\n      body\n    }\n  }\n  ${threadParticipantFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/notification/notificationInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport type {\n  NotificationEventType,\n  NotificationPayloadType,\n} from 'shared/types';\n\ntype Node = {\n  id: string,\n  type: NotificationPayloadType,\n  payload: string,\n};\n\nexport type NotificationInfoType = {\n  id: string,\n  createdAt: string,\n  modifiedAt: ?string,\n  actors: Array<Node>,\n  context: Node,\n  entities: Array<Node>,\n  event: NotificationEventType,\n  isRead: boolean,\n  isSeen: boolean,\n};\n\nexport default gql`\n  fragment notificationInfo on Notification {\n    id\n    createdAt\n    modifiedAt\n    actors {\n      id\n      type\n      payload\n    }\n    context {\n      id\n      type\n      payload\n    }\n    entities {\n      id\n      type\n      payload\n    }\n    event\n    isRead\n    isSeen\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/thread/threadInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../user/userInfo';\nimport communityInfoFragment from '../community/communityInfo';\nimport type { CommunityInfoType } from '../community/communityInfo';\nimport communityMetaDataFragment from '../community/communityMetaData';\nimport type { CommunityMetaDataType } from '../community/communityMetaData';\nimport threadParticipantFragment from './threadParticipant';\nimport channelInfoFragment from '../channel/channelInfo';\nimport type { ChannelInfoType } from '../channel/channelInfo';\nimport type { ThreadMessageConnectionType } from 'shared/graphql/fragments/thread/threadMessageConnection';\nimport type { ThreadParticipantType } from './threadParticipant';\n\ntype Attachment = {\n  attachmentType: string,\n  data: string,\n  trueUrl: string,\n};\n\nexport type ThreadInfoType = {\n  id: string,\n  messageCount: number,\n  createdAt: string,\n  modifiedAt: ?string,\n  lastActive: ?string,\n  editedBy?: {\n    ...$Exact<ThreadParticipantType>,\n  },\n  author: {\n    ...$Exact<ThreadParticipantType>,\n  },\n  channel: {\n    ...$Exact<ChannelInfoType>,\n  },\n  community: {\n    ...$Exact<CommunityInfoType>,\n    ...$Exact<CommunityMetaDataType>,\n  },\n  // $FlowFixMe: We need to remove `messageConnection` from ThreadMessageConnectionType. This works in the meantime.\n  ...$Exact<ThreadMessageConnectionType>,\n  isPublished: boolean,\n  isLocked: boolean,\n  isAuthor: boolean,\n  type: string,\n  content: {\n    title: string,\n    body: string,\n  },\n  attachments: Array<?Attachment>,\n  watercooler: boolean,\n  metaImage: string,\n  reactions: {\n    count: number,\n    hasReacted: boolean,\n  },\n};\n\nexport default gql`\n  fragment threadInfo on Thread {\n    id\n    messageCount\n    createdAt\n    modifiedAt\n    lastActive\n    editedBy {\n      ...threadParticipant\n    }\n    author {\n      ...threadParticipant\n    }\n    channel {\n      ...channelInfo\n    }\n    community {\n      ...communityInfo\n      ...communityMetaData\n    }\n    isPublished\n    isLocked\n    isAuthor\n    type\n    content {\n      title\n      body\n    }\n    attachments {\n      attachmentType\n      data\n    }\n    watercooler\n    metaImage\n    reactions {\n      count\n      hasReacted\n    }\n  }\n  ${threadParticipantFragment}\n  ${userInfoFragment}\n  ${channelInfoFragment}\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/thread/threadMessageConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport messageInfoFragment from '../message/messageInfo';\nimport type { MessageInfoType } from '../message/messageInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<MessageInfoType>,\n  },\n};\n\nexport type ThreadMessageConnectionType = {\n  messageConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<Edge>,\n  },\n};\n\nexport default gql`\n  fragment threadMessageConnection on Thread {\n    messageConnection(\n      after: $after\n      first: $first\n      before: $before\n      last: $last\n    ) @connection(key: \"messageConnection\") {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...messageInfo\n        }\n      }\n    }\n  }\n  ${messageInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/thread/threadParticipant.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../user/userInfo';\nimport type { UserInfoType } from '../user/userInfo';\n\nexport type ThreadParticipantType = {\n  id: string,\n  user: {\n    ...$Exact<UserInfoType>,\n  },\n  isMember: boolean,\n  isModerator: boolean,\n  isBlocked: boolean,\n  isOwner: boolean,\n  roles: Array<string>,\n};\n\nexport default gql`\n  fragment threadParticipant on ThreadParticipant {\n    user {\n      ...userInfo\n    }\n    isMember\n    isModerator\n    isBlocked\n    isOwner\n    roles\n  }\n  ${userInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userChannelConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport channelInfoFragment from '../channel/channelInfo';\nimport type { ChannelInfoType } from '../channel/channelInfo';\n\ntype Edge = {\n  node: {\n    ...$Exact<ChannelInfoType>,\n  },\n};\n\nexport type UserChannelConnectionType = {\n  channelConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment userChannels on User {\n    channelConnection {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        node {\n          ...channelInfo\n        }\n      }\n    }\n  }\n  ${channelInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userCommunityConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport communityInfoFragment from '../community/communityInfo';\nimport communityMetaDataFragment from '../community/communityMetaData';\nimport type { CommunityInfoType } from '../community/communityInfo';\nimport type { CommunityMetaDataType } from '../community/communityMetaData';\n\ntype Edge = {\n  node: {\n    ...$Exact<CommunityInfoType>,\n    ...$Exact<CommunityMetaDataType>,\n    contextPermissions: {\n      communityId: string,\n      isOwner: boolean,\n      isModerator: boolean,\n    },\n  },\n};\n\nexport type UserCommunityConnectionType = {\n  communityConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<Edge>,\n  },\n};\n\nexport default gql`\n  fragment userCommunityConnection on User {\n    communityConnection {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        node {\n          ...communityInfo\n          ...communityMetaData\n          contextPermissions {\n            communityId\n            isOwner\n            isModerator\n          }\n        }\n      }\n    }\n  }\n  ${communityMetaDataFragment}\n  ${communityInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userDirectMessageThreadConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport directMessageThreadInfoFragment from '../directMessageThread/directMessageThreadInfo';\nimport type { DirectMessageThreadInfoType } from '../directMessageThread/directMessageThreadInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<DirectMessageThreadInfoType>,\n  },\n};\n\nexport type UserDirectMessageThreadsConnectionType = {\n  directMessageThreadsConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment userDirectMessageThreadConnection on User {\n    directMessageThreadsConnection(after: $after) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...directMessageThreadInfo\n        }\n      }\n    }\n  }\n  ${directMessageThreadInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userEverythingConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../thread/threadInfo';\nimport type { ThreadInfoType } from '../thread/threadInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<ThreadInfoType>,\n  },\n};\n\nexport type UserEverythingConnectionType = {\n  everything: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment userEverythingConnection on User {\n    everything(first: 10, after: $after) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...threadInfo\n        }\n      }\n    }\n  }\n  ${threadInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userInfo.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type UserInfoType = {\n  id: string,\n  profilePhoto: string,\n  coverPhoto: string,\n  name: string,\n  firstName: ?string,\n  description: ?string,\n  website: ?string,\n  username: string,\n  timezone: number,\n  betaSupporter?: boolean,\n};\n\nexport default gql`\n  fragment userInfo on User {\n    id\n    profilePhoto\n    coverPhoto\n    name\n    firstName\n    description\n    website\n    username\n    timezone\n    betaSupporter\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userSettings.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\n\nexport type UserSettingsType = {\n  settings: {\n    notifications: {\n      types: {\n        newMessageInThreads: {\n          email: boolean,\n        },\n        newDirectMessage: {\n          email: boolean,\n        },\n        newThreadCreated: {\n          email: boolean,\n        },\n        weeklyDigest: {\n          email: boolean,\n        },\n        dailyDigest: {\n          email: boolean,\n        },\n        newMention: {\n          email: boolean,\n        },\n      },\n    },\n  },\n};\n\nexport default gql`\n  fragment userSettings on User {\n    settings {\n      notifications {\n        types {\n          newMessageInThreads {\n            email\n          }\n          newDirectMessage {\n            email\n          }\n          newThreadCreated {\n            email\n          }\n          weeklyDigest {\n            email\n          }\n          dailyDigest {\n            email\n          }\n          newMention {\n            email\n          }\n        }\n      }\n    }\n  }\n`;\n"
  },
  {
    "path": "shared/graphql/fragments/user/userThreadConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../thread/threadInfo';\nimport type { ThreadInfoType } from '../thread/threadInfo';\n\ntype Edge = {\n  cursor: string,\n  node: {\n    ...$Exact<ThreadInfoType>,\n  },\n};\n\nexport type UserThreadConnectionType = {\n  threadConnection: {\n    pageInfo: {\n      hasNextPage: boolean,\n      hasPreviousPage: boolean,\n    },\n    edges: Array<?Edge>,\n  },\n};\n\nexport default gql`\n  fragment userThreadConnection on User {\n    threadConnection(first: 10, after: $after, kind: $kind) {\n      pageInfo {\n        hasNextPage\n        hasPreviousPage\n      }\n      edges {\n        cursor\n        node {\n          ...threadInfo\n        }\n      }\n    }\n  }\n  ${threadInfoFragment}\n`;\n"
  },
  {
    "path": "shared/graphql/index.js",
    "content": "// @flow\nimport { ApolloClient } from 'apollo-client';\nimport { createUploadLink } from 'apollo-upload-client';\nimport { RetryLink } from 'apollo-link-retry';\nimport {\n  InMemoryCache,\n  IntrospectionFragmentMatcher,\n} from 'apollo-cache-inmemory';\nimport { split } from 'apollo-link';\nimport { WebSocketLink } from 'apollo-link-ws';\nimport { getMainDefinition } from 'apollo-utilities';\nimport introspectionQueryResultData from './schema.json';\nimport getSharedApolloClientOptions from './apollo-client-options';\nimport { API_URI, WS_URI } from './constants';\n\n// Fixes a bug with ReactNative, see https://github.com/facebook/react-native/issues/9599\nif (typeof global.self === 'undefined') {\n  global.self = global;\n}\n\ntype CreateClientOptions = {\n  token?: ?string,\n};\n\n// Websocket link for subscriptions\nexport const wsLink = new WebSocketLink({\n  uri: WS_URI,\n  options: {\n    reconnect: true,\n  },\n});\n\n// NOTE(@mxstbr): Use the exported client instance from below instead of using this factory!\n// Only use this factory if you need to create a new instance of the client with the Authorization token,\n// i.e. only use this factory on mobile\nexport const createClient = (options?: CreateClientOptions = {}) => {\n  const cache = new InMemoryCache({\n    fragmentMatcher: new IntrospectionFragmentMatcher({\n      introspectionQueryResultData,\n    }),\n    ...getSharedApolloClientOptions(),\n  });\n\n  const headers = options.token\n    ? {\n        authorization: `Bearer ${options.token}`,\n      }\n    : undefined;\n\n  const retryLink = new RetryLink({\n    attempts: (count, operation, error) => {\n      const isMutation =\n        operation &&\n        operation.query &&\n        operation.query.definitions &&\n        Array.isArray(operation.query.definitions) &&\n        operation.query.definitions.some(\n          def =>\n            def.kind === 'OperationDefinition' && def.operation === 'mutation'\n        );\n\n      // Retry mutations for a looong time, those are very important to us so we want them to go through eventually\n      if (isMutation) {\n        return !!error && count < 25;\n      }\n\n      // Retry queries for way less long as this just ends up showing\n      // loading indicators for that whole time which is v annoying\n      return !!error && count < 6;\n    },\n  });\n\n  // HTTP Link for queries and mutations including file uploads\n  const httpLink = retryLink.concat(\n    createUploadLink({\n      uri: API_URI,\n      credentials: 'include',\n      headers,\n    })\n  );\n\n  // Switch between the two links based on operation\n  const link = split(\n    ({ query }) => {\n      const { kind, operation } = getMainDefinition(query);\n      return kind === 'OperationDefinition' && operation === 'subscription';\n    },\n    wsLink,\n    httpLink\n  );\n\n  return new ApolloClient({\n    link,\n    // eslint-disable-next-line\n    cache: window.__DATA__ ? cache.restore(window.__DATA__) : cache,\n    ssrForceFetchDelay: 100,\n    queryDeduplication: true,\n  });\n};\n\nconst client = createClient();\n\nexport { client };\n\nexport const clearApolloStore = () => {\n  try {\n    client.resetStore();\n  } catch (e) {\n    console.error('error clearing store');\n  }\n};\n"
  },
  {
    "path": "shared/graphql/mutations/channel/deleteChannel.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\nexport type DeleteChannelType = {\n  data: {\n    deleteChannel: boolean,\n  },\n};\n\nexport const deleteChannelMutation = gql`\n  mutation deleteChannel($channelId: ID!) {\n    deleteChannel(channelId: $channelId)\n  }\n`;\n\nconst deleteChannelOptions = {\n  props: ({ mutate }) => ({\n    deleteChannel: (channelId: string) =>\n      mutate({\n        variables: {\n          channelId,\n        },\n      }),\n  }),\n};\n\nexport default graphql(deleteChannelMutation, deleteChannelOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/channel/editChannel.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport channelInfoFragment from '../../fragments/channel/channelInfo';\nimport type { ChannelInfoType } from '../../fragments/channel/channelInfo';\n\nexport type EditChannelType = {\n  data: {\n    editChannel: {\n      ...$Exact<ChannelInfoType>,\n    },\n  },\n};\n\ntype EditChannelInput = {\n  channelId: string,\n  name: string,\n  description: string,\n  slug: string,\n  isPrivate: Boolean,\n};\n\nexport const editChannelMutation = gql`\n  mutation editChannel($input: EditChannelInput!) {\n    editChannel(input: $input) {\n      ...channelInfo\n    }\n  }\n  ${channelInfoFragment}\n`;\n\nconst editChannelOptions = {\n  props: ({ mutate }) => ({\n    editChannel: (input: EditChannelInput) =>\n      mutate({\n        variables: {\n          input,\n        },\n      }),\n  }),\n};\n\nexport default graphql(editChannelMutation, editChannelOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/community/deleteCommunity.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\nexport type DeleteCommunityType = {\n  data: {\n    deleteCommunity: boolean,\n  },\n};\n\nexport const deleteCommunityMutation = gql`\n  mutation deleteCommunity($communityId: ID!) {\n    deleteCommunity(communityId: $communityId)\n  }\n`;\n\nconst deleteCommunityOptions = {\n  props: ({ mutate }) => ({\n    deleteCommunity: (communityId: string) =>\n      mutate({\n        variables: {\n          communityId,\n        },\n      }),\n  }),\n};\n\nexport default graphql(deleteCommunityMutation, deleteCommunityOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/community/editCommunity.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport communityInfoFragment from 'shared/graphql/fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\n\nexport type EditCommunityType = {\n  data: {\n    editCommunity: {\n      ...$Exact<CommunityInfoType>,\n    },\n  },\n};\n\ntype EditCommunityInput = {\n  name: string,\n  slug: string,\n  description: string,\n  website: string,\n  file: Object,\n  coverFile: Object,\n  communityId: string,\n};\n\nexport const editCommunityMutation = gql`\n  mutation editCommunity($input: EditCommunityInput!) {\n    editCommunity(input: $input) {\n      ...communityInfo\n    }\n  }\n  ${communityInfoFragment}\n`;\n\nconst editCommunityOptions = {\n  props: ({ mutate }) => ({\n    editCommunity: (input: EditCommunityInput) =>\n      mutate({\n        variables: {\n          input,\n        },\n      }),\n  }),\n};\n\nexport default graphql(editCommunityMutation, editCommunityOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/community/toggleCommunityNoindex.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\nexport const toggleCommunityNoindexMutation = gql`\n  mutation toggleCommunityNoindex($communityId: ID!) {\n    toggleCommunityNoindex(communityId: $communityId) {\n      id\n      slug\n      noindex\n    }\n  }\n`;\n\nconst toggleCommunityNoindexOptions = {\n  props: ({ mutate }) => ({\n    toggleCommunityNoindex: communityId =>\n      mutate({\n        variables: {\n          communityId,\n        },\n      }),\n  }),\n};\n\nexport default graphql(\n  toggleCommunityNoindexMutation,\n  toggleCommunityNoindexOptions\n);\n"
  },
  {
    "path": "shared/graphql/mutations/community/toggleCommunityRedirect.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\nexport const toggleCommunityRedirectMutation = gql`\n  mutation toggleCommunityRedirect($communityId: ID!) {\n    toggleCommunityRedirect(communityId: $communityId) {\n      id\n      slug\n      redirect\n    }\n  }\n`;\n\nconst toggleCommunityRedirectOptions = {\n  props: ({ mutate }) => ({\n    toggleCommunityRedirect: communityId =>\n      mutate({\n        variables: {\n          communityId,\n        },\n      }),\n  }),\n};\n\nexport default graphql(\n  toggleCommunityRedirectMutation,\n  toggleCommunityRedirectOptions\n);\n"
  },
  {
    "path": "shared/graphql/mutations/message/deleteMessage.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport { getThreadMessageConnectionQuery } from '../../queries/thread/getThreadMessageConnection';\nimport { getDMThreadMessageConnectionQuery } from '../../queries/directMessageThread/getDirectMessageThreadMessageConnection';\nexport type DeleteMessageType = {\n  data: {\n    deleteMessage: boolean,\n  },\n};\n\nexport const deleteMessageMutation = gql`\n  mutation deleteMessage($id: ID!) {\n    deleteMessage(id: $id)\n  }\n`;\n\nconst deleteMessageOptions = {\n  props: ({ ownProps, mutate }) => ({\n    ...ownProps,\n    deleteMessage: id =>\n      mutate({\n        variables: {\n          id,\n        },\n        update: store => {\n          // we have to split out the optimistic update by thread type\n          // because DMs and story threads have different queries and response\n          // shapes\n          if (ownProps.threadType === 'story') {\n            // Read the data from our cache for this query.\n            const data = store.readQuery({\n              query: getThreadMessageConnectionQuery,\n              variables: {\n                id: ownProps.threadId || ownProps.thread.id,\n              },\n            });\n\n            data.thread.messageConnection.edges = data.thread.messageConnection.edges.filter(\n              ({ node }) => node.id !== id\n            );\n\n            // Write our data back to the cache.\n            store.writeQuery({\n              query: getThreadMessageConnectionQuery,\n              data,\n              variables: {\n                id: ownProps.threadId,\n              },\n            });\n          } else if (ownProps.threadType === 'directMessageThread') {\n            // Read the data from our cache for this query.\n            const data = store.readQuery({\n              query: getDMThreadMessageConnectionQuery,\n              variables: {\n                id: ownProps.threadId,\n              },\n            });\n\n            data.directMessageThread.messageConnection.edges = data.directMessageThread.messageConnection.edges.filter(\n              ({ node }) => node.id !== id\n            );\n            // Write our data back to the cache.\n            store.writeQuery({\n              query: getDMThreadMessageConnectionQuery,\n              data,\n              variables: {\n                id: ownProps.threadId,\n              },\n            });\n          }\n        },\n      }),\n  }),\n};\n\nexport default graphql(deleteMessageMutation, deleteMessageOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/thread/deleteThread.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\nexport type DeleteThreadType = {\n  data: {\n    deleteThread: boolean,\n  },\n};\n\nexport const deleteThreadMutation = gql`\n  mutation deleteThread($threadId: ID!) {\n    deleteThread(threadId: $threadId)\n  }\n`;\n\nconst deleteThreadOptions = {\n  props: ({ mutate }) => ({\n    deleteThread: (threadId: string) =>\n      mutate({\n        variables: {\n          threadId,\n        },\n      }),\n  }),\n};\n\nexport default graphql(deleteThreadMutation, deleteThreadOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/uploadImage.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport type { EntityTypes } from 'shared/types';\n\nexport type UploadImageType = {\n  data: {\n    uploadImage: string,\n  },\n};\n\nexport type UploadImageInput = {\n  image: Object,\n  type: EntityTypes,\n  id?: string,\n};\n\nexport const uploadImageMutation = gql`\n  mutation uploadImage($input: UploadImageInput!) {\n    uploadImage(input: $input)\n  }\n`;\n\nconst uploadImageOptions = {\n  props: ({ mutate }) => ({\n    uploadImage: (input: UploadImageInput) =>\n      mutate({\n        variables: {\n          input,\n        },\n      }),\n  }),\n};\n\nexport default graphql(uploadImageMutation, uploadImageOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/user/banUser.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\n\ntype BanUserInput = {\n  userId: string,\n  reason: string,\n};\n\nexport const banUserMutation = gql`\n  mutation banUser($input: BanUserInput!) {\n    banUser(input: $input)\n  }\n`;\n\nconst banUserOptions = {\n  props: ({ mutate }) => ({\n    banUser: input =>\n      mutate({\n        variables: {\n          input,\n        },\n      }),\n  }),\n};\n\nexport default graphql(banUserMutation, banUserOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/user/deleteCurrentUser.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\n\nexport const deleteCurrentUserMutation = gql`\n  mutation deleteCurrentUser {\n    deleteCurrentUser\n  }\n`;\n\nconst deleteCurrentUserOptions = {\n  props: ({ mutate }) => ({\n    deleteCurrentUser: () => mutate(),\n  }),\n};\n\nexport default graphql(deleteCurrentUserMutation, deleteCurrentUserOptions);\n"
  },
  {
    "path": "shared/graphql/mutations/user/editUser.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\nimport type { EditUserInput } from 'shared/db/queries/user';\nimport { getUserByUsernameQuery } from '../../queries/user/getUser';\n\nexport type EditUserType = {\n  ...$Exact<UserInfoType>,\n};\n\nexport type EditUserProps = {\n  editUser: (\n    input: $PropertyType<EditUserInput, 'input'>\n  ) => Promise<EditUserType>,\n};\n\nexport const editUserMutation = gql`\n  mutation editUser($input: EditUserInput!) {\n    editUser(input: $input) {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n\nconst editUserOptions = {\n  options: {\n    refetchQueries: ['getCurrentUser'],\n  },\n  props: ({ mutate }) => ({\n    editUser: input =>\n      mutate({\n        variables: {\n          input,\n        },\n        refetchQueries: [\n          {\n            query: getUserByUsernameQuery,\n            variables: {\n              id: input.username,\n            },\n          },\n        ],\n      }),\n  }),\n};\n\nexport default graphql(editUserMutation, editUserOptions);\n"
  },
  {
    "path": "shared/graphql/queries/channel/getChannel.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport channelInfoFragment from '../../fragments/channel/channelInfo';\nimport type { ChannelInfoType } from '../../fragments/channel/channelInfo';\n\nexport type GetChannelType = {\n  ...$Exact<ChannelInfoType>,\n};\n\nexport const getChannelByIdQuery = gql`\n  query getChannelById($id: ID) {\n    channel(id: $id) {\n      ...channelInfo\n    }\n  }\n  ${channelInfoFragment}\n`;\n\nconst getChannelByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getChannelById = graphql(\n  getChannelByIdQuery,\n  getChannelByIdOptions\n);\n\n/*\n  Alternative implementation that takes a channel slug and community slug\n  to perform a lookup\n  Used to check for duplicate channel names during channel creation, and can\n  be used as a way to get a channel based on url params.\n*/\nexport const getChannelBySlugAndCommunitySlugQuery = gql`\n  query getChannelBySlugAndCommunitySlug(\n    $channelSlug: LowercaseString\n    $communitySlug: LowercaseString\n  ) {\n    channel(channelSlug: $channelSlug, communitySlug: $communitySlug) {\n      ...channelInfo\n    }\n  }\n  ${channelInfoFragment}\n`;\n\nconst getChannelBySlugAndCommunitySlugOptions = {\n  options: ({ channelSlug, communitySlug }) => ({\n    variables: {\n      channelSlug: channelSlug,\n      communitySlug: communitySlug,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getChannelBySlugAndCommunitySlug = graphql(\n  getChannelBySlugAndCommunitySlugQuery,\n  getChannelBySlugAndCommunitySlugOptions\n);\n\nconst getChannelByMatchOptions = {\n  options: ({\n    match: {\n      params: { channelSlug, communitySlug },\n    },\n  }) => ({\n    variables: {\n      channelSlug: channelSlug,\n      communitySlug: communitySlug,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getChannelByMatch = graphql(\n  getChannelBySlugAndCommunitySlugQuery,\n  getChannelByMatchOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/channel/getChannelMemberConnection.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport channelInfoFragment from '../../fragments/channel/channelInfo';\nimport type { ChannelInfoType } from '../../fragments/channel/channelInfo';\nimport channelMemberConnectionFragment from '../../fragments/channel/channelMemberConnection';\nimport type { ChannelMemberConnectionType } from '../../fragments/channel/channelMemberConnection';\n\nexport type GetChannelMemberConnectionType = {\n  ...$Exact<ChannelInfoType>,\n  ...$Exact<ChannelMemberConnectionType>,\n};\n\nexport const getChannelMemberConnectionQuery = gql`\n  query getChannelMemberConnection($id: ID, $first: Int, $after: String) {\n    channel(id: $id) {\n      ...channelInfo\n      ...channelMemberConnection\n    }\n  }\n  ${channelInfoFragment}\n  ${channelMemberConnectionFragment}\n`;\n\nconst LoadMoreMembers = gql`\n  query loadMoreChannelMembers($id: ID, $first: Int, $after: String) {\n    channel(id: $id) {\n      ...channelInfo\n      ...channelMemberConnection\n    }\n  }\n  ${channelInfoFragment}\n  ${channelMemberConnectionFragment}\n`;\n\nconst getChannelMemberConnectionOptions = {\n  props: ({ data: { fetchMore, error, loading, channel, networkStatus } }) => ({\n    data: {\n      error,\n      loading,\n      channel,\n      networkStatus: networkStatus,\n      hasNextPage:\n        channel && channel.memberConnection\n          ? channel.memberConnection.pageInfo.hasNextPage\n          : false,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreMembers,\n          variables: {\n            id: channel.id,\n            after:\n              channel.memberConnection.edges[\n                channel.memberConnection.edges.length - 1\n              ].cursor,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.channel) {\n              return prev;\n            }\n\n            return {\n              ...prev,\n              channel: {\n                ...prev.channel,\n                memberConnection: {\n                  ...prev.channel.memberConnection,\n                  pageInfo: {\n                    ...prev.channel.memberConnection.pageInfo,\n                    ...fetchMoreResult.channel.memberConnection.pageInfo,\n                  },\n                  edges: [\n                    ...prev.channel.memberConnection.edges,\n                    ...fetchMoreResult.channel.memberConnection.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n  options: ({ id, first = 10 }) => ({\n    variables: {\n      id,\n      first,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(\n  getChannelMemberConnectionQuery,\n  getChannelMemberConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/channel/getChannelSettings.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport channelInfoFragment, {\n  type ChannelInfoType,\n} from '../../fragments/channel/channelInfo';\n\nexport type GetChannelSettingsType = {\n  ...$Exact<ChannelInfoType>,\n  joinSettings: {\n    tokenJoinEnabled: boolean,\n    token: string,\n  },\n};\n\nexport const getChannelSettingsByIdQuery = gql`\n  query getChannelSettings($id: ID) {\n    channel(id: $id) {\n      ...channelInfo\n      joinSettings {\n        tokenJoinEnabled\n        token\n      }\n    }\n  }\n  ${channelInfoFragment}\n`;\n\nconst getChannelSettingsByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport default graphql(\n  getChannelSettingsByIdQuery,\n  getChannelSettingsByIdOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/channel/getChannelThreadConnection.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport channelInfoFragment from '../../fragments/channel/channelInfo';\nimport type { ChannelInfoType } from '../../fragments/channel/channelInfo';\nimport channelThreadConnectionFragment from '../../fragments/channel/channelThreadConnection';\nimport type { ChannelThreadConnectionType } from '../../fragments/channel/channelThreadConnection';\n\nexport type GetChannelThreadConnectionType = {\n  ...$Exact<ChannelInfoType>,\n  ...$Exact<ChannelThreadConnectionType>,\n};\n\nexport const getChannelThreadConnectionQuery = gql`\n  query getChannelThreadConnection($id: ID, $after: String) {\n    channel(id: $id) {\n      ...channelInfo\n      ...channelThreadConnection\n    }\n  }\n  ${channelInfoFragment}\n  ${channelThreadConnectionFragment}\n`;\n\nconst LoadMoreThreads = gql`\n  query loadMoreChannelThreads($id: ID, $after: String) {\n    channel(id: $id) {\n      ...channelInfo\n      ...channelThreadConnection\n    }\n  }\n  ${channelInfoFragment}\n  ${channelThreadConnectionFragment}\n`;\n\nconst getChannelThreadConnectionOptions = {\n  props: ({\n    ownProps,\n    data: { fetchMore, error, loading, channel, networkStatus, refetch },\n  }) => ({\n    data: {\n      error,\n      loading,\n      networkStatus,\n      channel,\n      refetch,\n      threadConnection: channel && channel.threadConnection,\n      threads:\n        channel && channel.threadConnection\n          ? channel.threadConnection.edges\n          : [],\n      feed: channel && channel.id,\n      hasNextPage:\n        channel && channel.threadConnection\n          ? channel.threadConnection.pageInfo.hasNextPage\n          : false,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreThreads,\n          variables: {\n            after:\n              channel.threadConnection.edges[\n                channel.threadConnection.edges.length - 1\n              ].cursor,\n            id: channel.id,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.channel) {\n              return prev;\n            }\n            return {\n              ...prev,\n              channel: {\n                ...prev.channel,\n                threadConnection: {\n                  ...prev.channel.threadConnection,\n                  pageInfo: {\n                    ...prev.channel.threadConnection.pageInfo,\n                    ...fetchMoreResult.channel.threadConnection.pageInfo,\n                  },\n                  edges: [\n                    ...prev.channel.threadConnection.edges,\n                    ...fetchMoreResult.channel.threadConnection.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(\n  getChannelThreadConnectionQuery,\n  getChannelThreadConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunities.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communityMetaDataFragment from '../../fragments/community/communityMetaData';\nimport type { CommunityMetaDataType } from '../../fragments/community/communityMetaData';\n\ntype Node = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityMetaDataType>,\n};\n\nexport type GetCommunitiesType = Array<?Node>;\n\nexport const getCommunitiesByIdsQuery = gql`\n  query getCommunitiesByIds($ids: [ID]) {\n    communities(ids: $ids) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunitiesByIdsOptions = {\n  options: ({ ids }: { ids: Array<string> }) => ({\n    variables: {\n      ids,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport const getCommunitiesByIds = graphql(\n  getCommunitiesByIdsQuery,\n  getCommunitiesByIdsOptions\n);\n\nexport const getCommunitiesBySlugsQuery = gql`\n  query getCommunitiesBySlugs($slugs: [LowercaseString]) {\n    communities(slugs: $slugs) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunitiesBySlugOptions = {\n  options: ({ slugs }: { slugs: Array<string> }) => ({\n    variables: {\n      slugs: slugs,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport const getCommunitiesBySlug = graphql(\n  getCommunitiesBySlugsQuery,\n  getCommunitiesBySlugOptions\n);\n\nconst getCommunitiesByCuratedContentTypeQuery = gql`\n  query getCommunitiesCollection($curatedContentType: String) {\n    communities(curatedContentType: $curatedContentType) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunitiesByCuratedContentTypeOptions = {\n  options: ({ curatedContentType }: { curatedContentType: string }) => ({\n    variables: {\n      curatedContentType,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport const getCommunitiesByCuratedContentType = graphql(\n  getCommunitiesByCuratedContentTypeQuery,\n  getCommunitiesByCuratedContentTypeOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunity.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communityMetaDataFragment from '../../fragments/community/communityMetaData';\nimport type { CommunityMetaDataType } from '../../fragments/community/communityMetaData';\n\nexport type GetCommunityType = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityMetaDataType>,\n};\n\nexport const getCommunityByIdQuery = gql`\n  query getCommunityById($id: ID) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunityByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n  }),\n};\n\nexport const getCommunityById = graphql(\n  getCommunityByIdQuery,\n  getCommunityByIdOptions\n);\n\nexport const getCommunityBySlugQuery = gql`\n  query getCommunityBySlug($slug: LowercaseString) {\n    community(slug: $slug) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunityBySlugOptions = {\n  options: ({ slug }) => ({\n    variables: {\n      slug: slug,\n    },\n  }),\n};\n\nexport const getCommunityBySlug = graphql(\n  getCommunityBySlugQuery,\n  getCommunityBySlugOptions\n);\n\nexport const getCommunityByMatchQuery = gql`\n  query getCommunityByMatch($slug: LowercaseString) {\n    community(slug: $slug) {\n      ...communityInfo\n      ...communityMetaData\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunityByMatchOptions = {\n  options: ({\n    match: {\n      params: { communitySlug },\n    },\n  }) => ({\n    variables: {\n      slug: communitySlug,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport const getCommunityByMatch = graphql(\n  getCommunityByMatchQuery,\n  getCommunityByMatchOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunityChannelConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communityChannelConnectionFragment from '../../fragments/community/communityChannelConnection';\nimport type { CommunityChannelConnectionType } from '../../fragments/community/communityChannelConnection';\n\nexport type GetCommunityChannelConnectionType = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityChannelConnectionType>,\n};\n\nexport const getCommunityChannelConnectionQuery = gql`\n  query getCommunityChannels($id: ID) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityChannelConnection\n    }\n  }\n  ${communityInfoFragment}\n  ${communityChannelConnectionFragment}\n`;\n\nconst getCommunityChannelConnectionOptions = {\n  options: ({ id }: { id: string }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport default graphql(\n  getCommunityChannelConnectionQuery,\n  getCommunityChannelConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunityMembers.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport communityMetaDataFragment from '../../fragments/community/communityMetaData';\nimport type { CommunityMetaDataType } from '../../fragments/community/communityMetaData';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communityMembersFragment, {\n  type CommunityMembersType,\n} from '../../fragments/community/communityMembers';\n\nexport type GetCommunityMembersType = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityMetaDataType>,\n  ...$Exact<CommunityMembersType>,\n};\n\nconst LoadMoreMembers = gql`\n  query loadMoreCommunityMembers(\n    $id: ID\n    $after: String\n    $first: Int\n    $filter: MembersFilter\n  ) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityMetaData\n      ...communityMembers\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n  ${communityMembersFragment}\n`;\n\nexport const getcommunityMembersQuery = gql`\n  query getCommunityMembers(\n    $id: ID\n    $after: String\n    $first: Int\n    $filter: MembersFilter\n  ) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityMetaData\n      ...communityMembers\n    }\n  }\n  ${communityInfoFragment}\n  ${communityMetaDataFragment}\n  ${communityMembersFragment}\n`;\n\nconst getcommunityMembersOptions = {\n  props: ({\n    data: { fetchMore, error, loading, community, networkStatus },\n    ownProps: { filter },\n  }) => ({\n    data: {\n      error,\n      loading,\n      community,\n      networkStatus: networkStatus,\n      hasNextPage:\n        community && community.members\n          ? community.members.pageInfo.hasNextPage\n          : false,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreMembers,\n          variables: {\n            id: community.id,\n            after:\n              community.members.edges[community.members.edges.length - 1]\n                .cursor,\n            filter: filter || null,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.community) {\n              return prev;\n            }\n\n            return {\n              ...prev,\n              community: {\n                ...prev.community,\n                members: {\n                  ...prev.community.members,\n                  pageInfo: {\n                    ...prev.community.members.pageInfo,\n                    ...fetchMoreResult.community.members.pageInfo,\n                  },\n                  edges: [\n                    ...prev.community.members.edges,\n                    ...fetchMoreResult.community.members.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n  options: ({\n    id,\n    filter,\n    after,\n    first = 10,\n  }: {\n    id: string,\n    filter: ?Object,\n    after?: string,\n    first?: number,\n  }) => ({\n    variables: {\n      id,\n      after: after || null,\n      filter,\n      first,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(getcommunityMembersQuery, getcommunityMembersOptions);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunitySettings.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communitySettingsFragment from '../../fragments/community/communitySettings';\nimport type { CommunitySettingsType } from '../../fragments/community/communitySettings';\nimport communityMetaDataFragment from '../../fragments/community/communityMetaData';\nimport type { CommunityMetaDataType } from '../../fragments/community/communityMetaData';\n\nexport type GetCommunitySettingsType = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityMetaDataType>,\n  ...$Exact<CommunitySettingsType>,\n};\n\nexport const getCommunitySettingsQuery = gql`\n  query getCommunitySettingsById($id: ID) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityMetaData\n      ...communitySettings\n    }\n  }\n  ${communityInfoFragment}\n  ${communitySettingsFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunitySettingsOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getCommunitySettingsByMatchQuery = gql`\n  query getCommunitySettingsByMatch($slug: LowercaseString) {\n    community(slug: $slug) {\n      ...communityInfo\n      ...communityMetaData\n      ...communitySettings\n    }\n  }\n  ${communityInfoFragment}\n  ${communitySettingsFragment}\n  ${communityMetaDataFragment}\n`;\n\nconst getCommunitySettingsByMatchOptions = {\n  options: ({ match: { params: { communitySlug } } }) => ({\n    variables: {\n      slug: communitySlug,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getCommunitySettingsByMatch = graphql(\n  getCommunitySettingsByMatchQuery,\n  getCommunitySettingsByMatchOptions\n);\n\nexport default graphql(getCommunitySettingsQuery, getCommunitySettingsOptions);\n"
  },
  {
    "path": "shared/graphql/queries/community/getCommunityThreadConnection.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../../fragments/thread/threadInfo';\nimport communityInfoFragment from '../../fragments/community/communityInfo';\nimport type { CommunityInfoType } from '../../fragments/community/communityInfo';\nimport communityThreadConnectionFragment from '../../fragments/community/communityThreadConnection';\nimport type { CommunityThreadConnectionType } from '../../fragments/community/communityThreadConnection';\n\nexport type GetCommunityThreadConnectionType = {\n  ...$Exact<CommunityInfoType>,\n  ...$Exact<CommunityThreadConnectionType>,\n};\n\nconst LoadMoreThreads = gql`\n  query loadMoreCommunityThreads(\n    $after: String\n    $id: ID\n    $sort: CommunityThreadConnectionSort\n  ) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityThreadConnection\n    }\n  }\n  ${threadInfoFragment}\n  ${communityInfoFragment}\n  ${communityThreadConnectionFragment}\n`;\n\nexport const getCommunityThreadConnectionQuery = gql`\n  query getCommunityThreadConnection(\n    $id: ID\n    $after: String\n    $sort: CommunityThreadConnectionSort\n  ) {\n    community(id: $id) {\n      ...communityInfo\n      ...communityThreadConnection\n    }\n  }\n  ${threadInfoFragment}\n  ${communityInfoFragment}\n  ${communityThreadConnectionFragment}\n`;\n\nconst getCommunityThreadConnectionOptions = {\n  props: ({\n    ownProps,\n    data: { fetchMore, error, loading, community, networkStatus, refetch },\n  }) => ({\n    data: {\n      error,\n      loading,\n      networkStatus,\n      community,\n      refetch,\n      threadConnection: community && community.threadConnection,\n      threads:\n        community && community.threadConnection\n          ? community.threadConnection.edges\n          : [],\n      hasNextPage:\n        community && community.threadConnection\n          ? community.threadConnection.pageInfo.hasNextPage\n          : false,\n      feed: community && community.id,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreThreads,\n          variables: {\n            after:\n              community.threadConnection.edges[\n                community.threadConnection.edges.length - 1\n              ].cursor,\n            id: community.id,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.community) {\n              return prev;\n            }\n            return {\n              ...prev,\n              community: {\n                ...prev.community,\n                threadConnection: {\n                  ...prev.community.threadConnection,\n                  pageInfo: {\n                    ...prev.community.threadConnection.pageInfo,\n                    ...fetchMoreResult.community.threadConnection.pageInfo,\n                  },\n                  edges: [\n                    ...prev.community.threadConnection.edges,\n                    ...fetchMoreResult.community.threadConnection.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n  options: ({\n    id,\n    after,\n    sort,\n  }: {\n    id: string,\n    after?: ?string,\n    sort?: ?string,\n  }) => ({\n    variables: {\n      id,\n      after: after || null,\n      sort,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(\n  getCommunityThreadConnectionQuery,\n  getCommunityThreadConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/communityMember/getCommunityMember.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport { type CommunityMemberInfoType } from '../../fragments/communityMember/communityMemberInfo';\n\nexport type GetCommunityMemberType = {\n  ...$Exact<CommunityMemberInfoType>,\n};\n\nexport const getCommunityMemberQuery = gql`\n  query getCommunityMember($userId: ID!, $communityId: ID!) {\n    communityMember(userId: $userId, communityId: $communityId) {\n      id\n      isPending\n    }\n  }\n`;\n\nconst getCommunityMemberOptions = {\n  options: ({ userId, communityId }) => ({\n    variables: {\n      userId,\n      communityId,\n    },\n  }),\n};\n\nexport default graphql(getCommunityMemberQuery, getCommunityMemberOptions);\n"
  },
  {
    "path": "shared/graphql/queries/composer/getComposerCommunitiesAndChannels.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\n\ntype CommunityNode = {\n  node: {\n    id: string,\n    name: string,\n    slug: string,\n    profilePhoto: string,\n    communityPermissions: {\n      isMember: boolean,\n      isBlocked: boolean,\n      isOwner: boolean,\n      isModerator: boolean,\n    },\n  },\n};\n\ntype ChannelNode = {\n  node: {\n    id: string,\n    name: string,\n    slug: string,\n    isDefault: boolean,\n    isPrivate: boolean,\n    isArchived: boolean,\n    community: {\n      id: string,\n    },\n    channelPermissions: {\n      isMember: boolean,\n      isPending: boolean,\n      isBlocked: boolean,\n      isOwner: boolean,\n      isModerator: boolean,\n    },\n  },\n};\n\nexport type GetComposerType = {\n  ...$Exact<UserInfoType>,\n  communityConnection: {\n    edges: Array<?CommunityNode>,\n  },\n  channelConnection: {\n    edges: Array<?ChannelNode>,\n  },\n};\n\nexport const getComposerCommunitiesAndChannelsQuery = gql`\n  query getComposerCommunitiesAndChannels {\n    user: currentUser {\n      ...userInfo\n      communityConnection {\n        edges {\n          node {\n            id\n            name\n            slug\n            profilePhoto\n            communityPermissions {\n              isMember\n              isBlocked\n              isOwner\n              isModerator\n            }\n          }\n        }\n      }\n      channelConnection {\n        edges {\n          node {\n            id\n            name\n            slug\n            isDefault\n            isPrivate\n            isArchived\n            community {\n              id\n            }\n            channelPermissions {\n              isMember\n              isPending\n              isBlocked\n              isOwner\n              isModerator\n            }\n          }\n        }\n      }\n    }\n  }\n  ${userInfoFragment}\n`;\n\nconst getComposerCommunitiesAndChannelsOptions = {\n  options: { fetchPolicy: 'cache-first' },\n};\n\nexport default graphql(\n  getComposerCommunitiesAndChannelsQuery,\n  getComposerCommunitiesAndChannelsOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/directMessageThread/getCurrentUserDMThreadConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport userDirectMessageThreadsConnectionFragment from '../../fragments/user/userDirectMessageThreadConnection';\nimport type { UserDirectMessageThreadsConnectionType } from '../../fragments/user/userDirectMessageThreadConnection';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\n\nexport type GetCurrentUserDMThreadConnectionType = {\n  ...$Exact<UserInfoType>,\n  ...$Exact<UserDirectMessageThreadsConnectionType>,\n};\n\nconst LoadMoreDirectMessageThreads = gql`\n  query loadMoreDirectMessageThreads($after: String) {\n    user: currentUser {\n      ...userInfo\n      ...userDirectMessageThreadConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userDirectMessageThreadsConnectionFragment}\n`;\n\nexport const getCurrentUserDMThreadConnectionQuery = gql`\n  query currentUserDirectMessageThreads($after: String) {\n    user: currentUser {\n      ...userInfo\n      ...userDirectMessageThreadConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userDirectMessageThreadsConnectionFragment}\n`;\n\nexport const getCurrentUserDMThreadConnectionOptions = {\n  options: {\n    variables: {\n      after: '',\n    },\n    fetchPolicy: 'cache-and-network',\n  },\n  // $FlowFixMe\n  props: props => ({\n    ...props,\n    dmData: {\n      ...props.data,\n      fetchMore: () =>\n        props.data.fetchMore({\n          query: LoadMoreDirectMessageThreads,\n          variables: {\n            after:\n              props.data.user.directMessageThreadsConnection.edges[\n                props.data.user.directMessageThreadsConnection.edges.length - 1\n              ].cursor,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.user) {\n              return prev;\n            }\n\n            const foo = {\n              ...prev,\n              user: {\n                ...prev.user,\n                directMessageThreadsConnection: {\n                  ...prev.user.directMessageThreadsConnection,\n                  pageInfo: {\n                    ...prev.user.directMessageThreadsConnection.pageInfo,\n                    ...fetchMoreResult.user.directMessageThreadsConnection\n                      .pageInfo,\n                  },\n                  edges: [\n                    ...prev.user.directMessageThreadsConnection.edges,\n                    ...fetchMoreResult.user.directMessageThreadsConnection\n                      .edges,\n                  ],\n                },\n              },\n            };\n            return foo;\n          },\n        }),\n    },\n  }),\n};\n\nexport default graphql(\n  getCurrentUserDMThreadConnectionQuery,\n  getCurrentUserDMThreadConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/directMessageThread/getDirectMessageThread.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport directMessageThreadInfoFragment from '../../fragments/directMessageThread/directMessageThreadInfo';\nimport type { DirectMessageThreadInfoType } from '../../fragments/directMessageThread/directMessageThreadInfo';\n\nexport type GetDirectMessageThreadType = {\n  ...$Exact<DirectMessageThreadInfoType>,\n};\n\nexport const getDirectMessageThreadQuery = gql`\n  query getDirectMessageThread($id: ID!) {\n    directMessageThread(id: $id) {\n      ...directMessageThreadInfo\n    }\n  }\n  ${directMessageThreadInfoFragment}\n`;\n\nexport const getDirectMessageThreadOptions = {\n  options: ({ id }: { id: string }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(\n  getDirectMessageThreadQuery,\n  getDirectMessageThreadOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/directMessageThread/getDirectMessageThreadByUserIds.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport directMessageThreadInfoFragment from '../../fragments/directMessageThread/directMessageThreadInfo';\nimport type { DirectMessageThreadInfoType } from '../../fragments/directMessageThread/directMessageThreadInfo';\n\nexport type GetDirectMessageThreadByUserIdsType = {\n  ...$Exact<DirectMessageThreadInfoType>,\n};\n\nexport const getDirectMessageThreadByUserIdsQuery = gql`\n  query getDirectMessageThreadByUserIds($userIds: [ID!]) {\n    directMessageThreadByUserIds(userIds: $userIds) {\n      ...directMessageThreadInfo\n    }\n  }\n  ${directMessageThreadInfoFragment}\n`;\n\nexport const getDirectMessageThreadByUserIdsOptions = {\n  options: ({ userIds }: { userIds: Array<string> }) => ({\n    variables: {\n      userIds,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport default graphql(\n  getDirectMessageThreadByUserIdsQuery,\n  getDirectMessageThreadByUserIdsOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/directMessageThread/getDirectMessageThreadMessageConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport { btoa } from 'b2a';\nimport directMessageThreadMessageConnectionFragment from '../../fragments/directMessageThread/directMessageThreadMessageConnection';\nimport type { DirectMessageThreadMessageConnectionType } from '../../fragments/directMessageThread/directMessageThreadMessageConnection';\nimport directMessageThreadInfoFragment from '../../fragments/directMessageThread/directMessageThreadInfo';\nimport type { DirectMessageThreadInfoType } from '../../fragments/directMessageThread/directMessageThreadInfo';\n\nexport type GetDirectMessageThreadMessageConnectionType = {\n  ...$Exact<DirectMessageThreadInfoType>,\n  ...$Exact<DirectMessageThreadMessageConnectionType>,\n};\n\nconst LoadMoreMessages = gql`\n  query loadMoreMessages($id: ID!, $after: String) {\n    directMessageThread(id: $id) {\n      ...directMessageThreadInfo\n      ...directMessageThreadMessageConnection\n    }\n  }\n  ${directMessageThreadInfoFragment}\n  ${directMessageThreadMessageConnectionFragment}\n`;\n\nexport const getDMThreadMessageConnectionQuery = gql`\n  query getDirectMessageThreadMessages($id: ID!, $after: String) {\n    directMessageThread(id: $id) {\n      ...directMessageThreadInfo\n      ...directMessageThreadMessageConnection\n    }\n  }\n  ${directMessageThreadInfoFragment}\n  ${directMessageThreadMessageConnectionFragment}\n`;\n\nexport const getDMThreadMessageConnectionOptions = {\n  options: ({ id }: { id: string }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n  // $FlowFixMe\n  props: ({ data: { directMessageThread }, data, ownProps, ...rest }) => ({\n    ...rest,\n    data: {\n      ...data,\n      messages:\n        directMessageThread &&\n        directMessageThread.messageConnection &&\n        directMessageThread.messageConnection.edges,\n      messageConnection:\n        directMessageThread && directMessageThread.messageConnection,\n      hasNextPage:\n        directMessageThread && directMessageThread.messageConnection\n          ? directMessageThread.messageConnection.pageInfo.hasNextPage\n          : false,\n      fetchMore: () =>\n        data.fetchMore({\n          query: LoadMoreMessages,\n          variables: {\n            id: directMessageThread.id,\n            after:\n              directMessageThread.messageConnection.edges[\n                directMessageThread.messageConnection.edges.length - 1\n              ].cursor,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.directMessageThread) {\n              return prev;\n            }\n\n            return {\n              ...prev,\n              directMessageThread: {\n                ...prev.directMessageThread,\n                messageConnection: {\n                  ...prev.directMessageThread.messageConnection,\n                  pageInfo: {\n                    ...prev.directMessageThread.messageConnection.pageInfo,\n                    ...fetchMoreResult.directMessageThread.messageConnection\n                      .pageInfo,\n                  },\n                  edges: [\n                    ...prev.directMessageThread.messageConnection.edges,\n                    ...fetchMoreResult.directMessageThread.messageConnection\n                      .edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n};\n\nexport default graphql(\n  getDMThreadMessageConnectionQuery,\n  getDMThreadMessageConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/message/getMediaMessagesForThread.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\n\ntype Message = {\n  id: string,\n  content: {\n    body: string,\n  },\n};\n\nexport type GetMediaMessagesForThreadType = Array<?Message>;\n\nexport const getMediaMessagesForThreadQuery = gql`\n  query getMediaMessagesForThread($threadId: ID!) {\n    getMediaMessagesForThread(threadId: $threadId) {\n      id\n      content {\n        body\n      }\n    }\n  }\n`;\n\nconst getMediaMessagesForThreadOptions = {\n  options: ({ threadId }) => ({\n    variables: {\n      threadId,\n    },\n    fetchPolicy: 'network-only',\n  }),\n  props: ({ data: { error, loading, getMediaMessagesForThread } }) => ({\n    data: {\n      error,\n      loading,\n      getMediaMessagesForThread,\n      messages: getMediaMessagesForThread ? getMediaMessagesForThread : '',\n    },\n  }),\n};\n\nexport default graphql(\n  getMediaMessagesForThreadQuery,\n  getMediaMessagesForThreadOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/message/getMessage.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport messageInfoFragment from '../../fragments/message/messageInfo';\nimport type { MessageInfoType } from '../../fragments/message/messageInfo';\n\nexport type GetMessageType = {\n  ...$Exact<MessageInfoType>,\n};\n\nexport const getMessageByIdQuery = gql`\n  query getMessageById($id: ID!) {\n    message(id: $id) {\n      ...messageInfo\n    }\n  }\n  ${messageInfoFragment}\n`;\n\nconst getMessageByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n  }),\n};\n\nexport const getMessageById = graphql(\n  getMessageByIdQuery,\n  getMessageByIdOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/thread/getThread.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport threadInfoFragment from '../../fragments/thread/threadInfo';\nimport type { ThreadInfoType } from '../../fragments/thread/threadInfo';\n\nexport type GetThreadType = {\n  ...$Exact<ThreadInfoType>,\n};\n\nexport const getThreadByIdQuery = gql`\n  query getThreadById($id: ID!) {\n    thread(id: $id) {\n      ...threadInfo\n    }\n  }\n  ${threadInfoFragment}\n`;\n\nconst getThreadByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n  }),\n};\n\nexport const getThreadById = graphql(getThreadByIdQuery, getThreadByIdOptions);\n\nexport const getThreadByMatchQuery = gql`\n  query getThreadByMatch($id: ID!) {\n    thread(id: $id) {\n      ...threadInfo\n    }\n  }\n  ${threadInfoFragment}\n`;\n\nexport const getThreadByMatchOptions = {\n  options: ({\n    threadId,\n    match,\n  }: {\n    threadId?: string,\n    match?: { params: { threadId: string } },\n  }) => ({\n    variables: {\n      id: threadId\n        ? threadId\n        : match\n          ? match.params.threadId\n          : console.error('bad arg supplied to getThreadByMatch') || null,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport const getThreadByMatch = graphql(\n  getThreadByMatchQuery,\n  getThreadByMatchOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/thread/getThreadMessageConnection.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport queryString from 'query-string';\nimport { btoa } from 'b2a';\nimport threadInfoFragment from '../../fragments/thread/threadInfo';\nimport type { ThreadInfoType } from '../../fragments/thread/threadInfo';\nimport threadMessageConnectionFragment from '../../fragments/thread/threadMessageConnection';\nimport type { ThreadMessageConnectionType } from '../../fragments/thread/threadMessageConnection';\n\nexport type GetThreadMessageConnectionType = {\n  ...$Exact<ThreadInfoType>,\n  ...$Exact<ThreadMessageConnectionType>,\n};\n\ntype Variables = {\n  id: string,\n  last?: number,\n  first?: number,\n  after?: string,\n  before?: string,\n};\n\nconst getVariables = ({ thread, ...props }): Variables => {\n  // if the thread has less than 25 messages, just load all of them\n  if (thread && thread.messageCount <= 25) {\n    return {\n      id: props.id,\n      last: 25,\n    };\n  }\n\n  // If the user is linked to either a specific message or has pagination URL params, load those messages\n  if (props.location && props.location.search) {\n    const params = queryString.parse(props.location.search);\n\n    if (params) {\n      if (params.msgsafter) {\n        return {\n          id: props.id,\n          after: params.msgsafter,\n          first: 25,\n        };\n      } else if (params.msgsbefore) {\n        return {\n          id: props.id,\n          before: params.msgsbefore,\n          last: 25,\n        };\n      } else if (params.m) {\n        return {\n          id: props.id,\n          after: params.m,\n          first: 25,\n        };\n      }\n    }\n  }\n\n  // if it's a watercooler thread load the 25 most recent messages\n  if (props.isWatercooler) {\n    return {\n      id: props.id,\n      last: 25,\n    };\n  }\n\n  // In all other cases, load the first 25\n  return {\n    id: props.id,\n    first: 25,\n  };\n};\n\nexport const getThreadMessageConnectionQuery = gql`\n  query getThreadMessages(\n    $id: ID!\n    $after: String\n    $first: Int\n    $before: String\n    $last: Int\n  ) {\n    thread(id: $id) {\n      ...threadInfo\n      ...threadMessageConnection\n    }\n  }\n  ${threadInfoFragment}\n  ${threadMessageConnectionFragment}\n`;\nexport const getThreadMessageConnectionOptions = {\n  // $FlowFixMe\n  options: props => {\n    return {\n      variables: getVariables(props),\n      fetchPolicy: 'cache-and-network',\n    };\n  },\n  // $FlowFixMe\n  props: props => ({\n    data: {\n      ...props.data,\n      messageConnection: props.data.thread\n        ? props.data.thread.messageConnection\n        : null,\n    },\n    loadNextPage: () => {\n      let cursor;\n      const { thread } = props.data;\n      if (\n        thread &&\n        thread.messageConnection &&\n        thread.messageConnection.edges &&\n        thread.messageConnection.edges.length > 0\n      ) {\n        cursor =\n          thread.messageConnection.edges[\n            thread.messageConnection.edges.length - 1\n          ].cursor;\n      }\n      return props.data.fetchMore({\n        variables: {\n          after: cursor,\n          first: 25,\n          before: undefined,\n          last: undefined,\n        },\n        updateQuery: (prev, { fetchMoreResult }) => {\n          if (!fetchMoreResult || !fetchMoreResult.thread) return prev;\n\n          return {\n            ...prev,\n            thread: {\n              ...prev.thread,\n              messageConnection: {\n                ...prev.thread.messageConnection,\n                pageInfo: {\n                  ...prev.thread.messageConnection.pageInfo,\n                  hasNextPage:\n                    fetchMoreResult.thread.messageConnection.pageInfo\n                      .hasNextPage,\n                },\n                edges: [\n                  ...prev.thread.messageConnection.edges,\n                  ...fetchMoreResult.thread.messageConnection.edges,\n                ],\n              },\n            },\n          };\n        },\n      });\n    },\n    loadPreviousPage: () => {\n      let cursor;\n      const { thread } = props.data;\n      if (\n        thread &&\n        thread.messageConnection &&\n        thread.messageConnection.edges &&\n        thread.messageConnection.edges.length > 0\n      ) {\n        cursor = thread.messageConnection.edges[0].cursor;\n      }\n      return props.data.fetchMore({\n        variables: {\n          after: undefined,\n          first: undefined,\n          before: cursor,\n          last: 25,\n        },\n        updateQuery: (prev, { fetchMoreResult }) => {\n          if (!fetchMoreResult || !fetchMoreResult.thread) return prev;\n          const {\n            messageConnection: { pageInfo, edges },\n          } = fetchMoreResult.thread;\n\n          return {\n            ...prev,\n            thread: {\n              ...prev.thread,\n              messageConnection: {\n                ...prev.thread.messageConnection,\n                pageInfo: {\n                  ...prev.thread.messageConnection.pageInfo,\n                  hasPreviousPage: pageInfo.hasPreviousPage,\n                },\n                edges: edges\n                  ? [...edges, ...prev.thread.messageConnection.edges]\n                  : prev.thread.messageConnection.edges,\n              },\n            },\n          };\n        },\n      });\n    },\n  }),\n};\n\nexport default graphql(\n  getThreadMessageConnectionQuery,\n  getThreadMessageConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/user/getCurrentUserEverythingFeed.js",
    "content": "// @flow\nimport gql from 'graphql-tag';\nimport { graphql } from 'react-apollo';\nimport userEverythingConnectionFragment, {\n  type UserEverythingConnectionType,\n} from '../../fragments/user/userEverythingConnection';\n\nexport type GetCurrentUserEverythingFeedType = {\n  id: string,\n  ...$Exact<UserEverythingConnectionType>,\n};\n\nconst LoadMoreThreads = gql`\n  query loadMoreEverythingThreads($after: String) {\n    user: currentUser {\n      id\n      ...userEverythingConnection\n    }\n  }\n  ${userEverythingConnectionFragment}\n`;\n\nexport const getCurrentUserEverythingQuery = gql`\n  query getEverythingThreads($after: String) {\n    user: currentUser {\n      id\n      ...userEverythingConnection\n    }\n  }\n  ${userEverythingConnectionFragment}\n`;\n\nconst getCurrentUserEverythingOptions = {\n  options: () => ({\n    fetchPolicy: 'cache-and-network',\n  }),\n  props: ({\n    data: { fetchMore, error, loading, user, networkStatus, refetch },\n  }) => ({\n    data: {\n      error,\n      loading,\n      user,\n      networkStatus,\n      refetch,\n      threads: user && user.everything ? user.everything.edges : '',\n      feed: 'everything',\n      threadConnection: user && user.everything ? user.everything : null,\n      hasNextPage:\n        user && user.everything ? user.everything.pageInfo.hasNextPage : false,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreThreads,\n          variables: {\n            after:\n              user.everything.edges[user.everything.edges.length - 1].cursor,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.user) {\n              return prev;\n            }\n            return {\n              ...prev,\n              user: {\n                ...prev.user,\n                everything: {\n                  ...prev.user.everything,\n                  pageInfo: {\n                    ...prev.user.everything.pageInfo,\n                    ...fetchMoreResult.user.everything.pageInfo,\n                  },\n                  edges: [\n                    ...prev.user.everything.edges,\n                    ...fetchMoreResult.user.everything.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n};\n\nexport default graphql(\n  getCurrentUserEverythingQuery,\n  getCurrentUserEverythingOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/user/getCurrentUserSettings.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\nimport userSettingsFragment from '../../fragments/user/userSettings';\nimport type { UserSettingsType } from '../../fragments/user/userSettings';\n\nexport type GetCurrentUserSettingsType = {\n  ...$Exact<UserInfoType>,\n  email: ?string,\n  pendingEmail: ?string,\n  ...$Exact<UserSettingsType>,\n};\n\nexport const getCurrentUserSettings = gql`\n  query getCurrentUserSettings {\n    user: currentUser {\n      ...userInfo\n      email\n      pendingEmail\n      ...userSettings\n    }\n  }\n  ${userInfoFragment}\n  ${userSettingsFragment}\n`;\n\nexport default graphql(getCurrentUserSettings, {\n  options: { fetchPolicy: 'network-only' },\n});\n"
  },
  {
    "path": "shared/graphql/queries/user/getUser.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\n\nexport type GetUserType = {\n  ...$Exact<UserInfoType>,\n};\n\nexport const getUserByIdQuery = gql`\n  query getUserById($id: ID) {\n    user(id: $id) {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n\nconst getUserByIdOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n  }),\n};\n\nexport const getUserByUsernameQuery = gql`\n  query getUserByUsername($username: LowercaseString) {\n    user(username: $username) {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n\nconst getUserByUsernameOptions = {\n  options: ({ username }) => ({\n    variables: {\n      username,\n    },\n  }),\n};\n\nconst getUserByMatchOptions = {\n  options: ({\n    match: {\n      params: { username },\n    },\n  }) => ({\n    fetchPolicy: 'cache-and-network',\n    variables: {\n      username,\n    },\n  }),\n};\n\nexport const getUserById = graphql(getUserByIdQuery, getUserByIdOptions);\nexport const getUserByUsername = graphql(\n  getUserByUsernameQuery,\n  getUserByUsernameOptions\n);\nexport const getUserByMatch = graphql(\n  getUserByUsernameQuery,\n  getUserByMatchOptions\n);\n\nexport const getCurrentUserQuery = gql`\n  query getCurrentUser {\n    user: currentUser {\n      ...userInfo\n    }\n  }\n  ${userInfoFragment}\n`;\n\nexport const getCurrentUser = graphql(getCurrentUserQuery, {\n  options: { fetchPolicy: 'cache-first' },\n});\n"
  },
  {
    "path": "shared/graphql/queries/user/getUserCommunityConnection.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\nimport userCommunityConnectionFragment from '../../fragments/user/userCommunityConnection';\nimport type { UserCommunityConnectionType } from '../../fragments/user/userCommunityConnection';\n\nexport type GetUserCommunityConnectionType = {\n  ...$Exact<UserInfoType>,\n  ...$Exact<UserCommunityConnectionType>,\n};\n\nexport const getUserCommunityConnectionQuery = gql`\n  query getUserCommunityConnection($id: ID) {\n    user(id: $id) {\n      ...userInfo\n      ...userCommunityConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userCommunityConnectionFragment}\n`;\n\nexport const getCurrentUserCommunityConnectionQuery = gql`\n  query getCurrentUserCommunityConnection {\n    user: currentUser {\n      ...userInfo\n      ...userCommunityConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userCommunityConnectionFragment}\n`;\n\nconst getUserCommunityConnectionOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n    fetchPolicy: 'cache-and-network',\n  }),\n};\n\nexport const getCurrentUserCommunityConnection = graphql(\n  getCurrentUserCommunityConnectionQuery,\n  {\n    options: { fetchPolicy: 'cache-first' },\n    props: props => ({\n      ...props,\n    }),\n  }\n);\n\nexport const getUserCommunityConnection = graphql(\n  getUserCommunityConnectionQuery,\n  getUserCommunityConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/queries/user/getUserGithubProfile.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\n\ntype Profile = {\n  id: string,\n  username: string,\n};\n\nexport type GetUserGithbProfileType = {\n  id: string,\n  username: string,\n  githubProfile: ?Profile,\n};\n\nexport const getUserGithubProfileQuery = gql`\n  query getUserGithubProfile($id: ID) {\n    user(id: $id) {\n      id\n      username\n      githubProfile {\n        id\n        username\n      }\n    }\n  }\n`;\n\nconst getUserGithubProfileOptions = {\n  options: ({ id }) => ({\n    variables: {\n      id,\n    },\n  }),\n};\nexport default graphql(getUserGithubProfileQuery, getUserGithubProfileOptions);\n"
  },
  {
    "path": "shared/graphql/queries/user/getUserThreadConnection.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\nimport userInfoFragment from '../../fragments/user/userInfo';\nimport type { UserInfoType } from '../../fragments/user/userInfo';\nimport userThreadConnectionFragment from '../../fragments/user/userThreadConnection';\nimport type { UserThreadConnectionType } from '../../fragments/user/userThreadConnection';\n\nexport type GetUserThreadConnectionType = {\n  ...$Exact<UserInfoType>,\n  ...$Exact<UserThreadConnectionType>,\n};\n\nconst LoadMoreThreads = gql`\n  query loadMoreUserThreads(\n    $after: String\n    $id: ID\n    $kind: ThreadConnectionType\n  ) {\n    user(id: $id) {\n      ...userInfo\n      ...userThreadConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userThreadConnectionFragment}\n`;\n\nexport const getUserThreadConnectionQuery = gql`\n  query getUserThreadConnection(\n    $id: ID\n    $after: String\n    $kind: ThreadConnectionType\n  ) {\n    user(id: $id) {\n      ...userInfo\n      ...userThreadConnection\n    }\n  }\n  ${userInfoFragment}\n  ${userThreadConnectionFragment}\n`;\n\nconst getUserThreadConnectionOptions = {\n  props: ({\n    ownProps,\n    data: { fetchMore, error, loading, networkStatus, user, refetch },\n  }) => ({\n    data: {\n      error,\n      loading,\n      user,\n      networkStatus,\n      refetch,\n      threadConnection: user && user.threadConnection,\n      threads: user && user.threadConnection ? user.threadConnection.edges : '',\n      hasNextPage:\n        user && user.threadConnection\n          ? user.threadConnection.pageInfo.hasNextPage\n          : false,\n      fetchMore: () =>\n        fetchMore({\n          query: LoadMoreThreads,\n          variables: {\n            after:\n              user.threadConnection.edges[\n                user.threadConnection.edges.length - 1\n              ].cursor,\n            id: user.id,\n            kind: ownProps.kind,\n          },\n          updateQuery: (prev, { fetchMoreResult }) => {\n            if (!fetchMoreResult.user) {\n              return prev;\n            }\n            return {\n              ...prev,\n              user: {\n                ...prev.user,\n                threadConnection: {\n                  ...prev.user.threadConnection,\n                  pageInfo: {\n                    ...prev.user.threadConnection.pageInfo,\n                    ...fetchMoreResult.user.threadConnection.pageInfo,\n                  },\n                  edges: [\n                    ...prev.user.threadConnection.edges,\n                    ...fetchMoreResult.user.threadConnection.edges,\n                  ],\n                },\n              },\n            };\n          },\n        }),\n    },\n  }),\n  options: ({ id, kind }) => ({\n    variables: {\n      id,\n      kind,\n    },\n    fetchPolicy: 'cache-first',\n  }),\n};\n\nexport default graphql(\n  getUserThreadConnectionQuery,\n  getUserThreadConnectionOptions\n);\n"
  },
  {
    "path": "shared/graphql/schema.json",
    "content": "{\n  \"__schema\": {\n    \"types\": [\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Query\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"String\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"ID\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Community\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Date\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"LowercaseString\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Int\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Thread\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Channel\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Boolean\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelPermissions\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityPermissions\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelThreadsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"PageInfo\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelThreadEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelMembersConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelMemberEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"User\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserCommunitiesConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserCommunityEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserChannelsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserChannelEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserDirectMessageThreadsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"DirectMessageThreadEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"DirectMessageThread\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"DirectMessagesConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"DirectMessageEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Message\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"MessageContent\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ReactionData\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"MessageTypes\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ParticipantInfo\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"ThreadConnectionType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserThreadsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserThreadEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"EverythingThreadsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"EverythingThreadEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserSettings\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UserNotificationsSettings\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"NotificationSettingsType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"NotificationKindSettings\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ContextPermissions\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ChannelMetaData\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ThreadContent\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"ThreadType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Edit\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ThreadMessagesConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"ThreadMessageEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Attachment\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityChannelsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityChannelEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityMembersConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityMemberEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityThreadsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityThreadEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CommunityMetaData\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"SlackImport\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"GrowthData\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"GrowthDataCounts\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"SCALAR\",\n        \"name\": \"Float\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"TopAndNewThreads\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"SearchThreadsFilter\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Reaction\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"ReactionTypes\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Notification\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"NotificationEntityType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"EntityType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"NotificationEventType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"NotificationsConnection\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"NotificationEdge\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Meta\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"UsersGrowthData\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"CoreMetrics\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Mutation\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"CreateCommunityInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"File\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EditCommunityInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"SendSlackInvitesInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EmailInvitesInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EmailInviteContactInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"UpgradeCommunityInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"DowngradeCommunityInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"CreateChannelInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EditChannelInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"TogglePendingUserInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"PendingActionType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"UnblockUserInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"ThreadInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"ThreadContentInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"AttachmentInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EditThreadInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"MessageInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"ThreadTypes\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"MessageContentInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"ReactionInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"EditUserInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"UpgradeToProInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"ToggleNotificationSettingsInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"WebPushSubscription\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"WebPushSubscriptionKeys\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"DirectMessageThreadInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"DirectMessageContentInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"MessageType\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"ContentInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"INPUT_OBJECT\",\n        \"name\": \"SaveUserCommunityPermissionsInput\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"Subscription\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Schema\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Type\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"__TypeKind\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Field\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__InputValue\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__EnumValue\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"OBJECT\",\n        \"name\": \"__Directive\",\n        \"possibleTypes\": null\n      },\n      {\n        \"kind\": \"ENUM\",\n        \"name\": \"__DirectiveLocation\",\n        \"possibleTypes\": null\n      }\n    ]\n  }\n}"
  },
  {
    "path": "shared/graphql/subscriptions/index.js",
    "content": "// @flow\nimport { graphql } from 'react-apollo';\nimport gql from 'graphql-tag';\n\nconst SUBSCRIBE_TO_WEB_PUSH_MUTATION = gql`\n  mutation subscribeToWebPush($subscription: WebPushSubscription!) {\n    subscribeWebPush(subscription: $subscription)\n  }\n`;\n\nconst SUBSCRIBE_TO_WEB_PUSH_OPTIONS = {\n  props: ({ mutate }) => ({\n    subscribeToWebPush: subscription => {\n      if (!subscription) return;\n      const json = subscription.toJSON();\n      return mutate({\n        variables: {\n          subscription: {\n            endpoint: json.endpoint,\n            keys: {\n              p256dh: json.keys.p256dh,\n              auth: json.keys.auth,\n            },\n          },\n        },\n      });\n    },\n  }),\n};\n\nexport const subscribeToWebPush = graphql(\n  SUBSCRIBE_TO_WEB_PUSH_MUTATION,\n  SUBSCRIBE_TO_WEB_PUSH_OPTIONS\n);\n"
  },
  {
    "path": "shared/graphql/subscriptions/utils.js",
    "content": "// @flow\n// used to update feed caches with new threads in real time\n// takes an array of existing threads in the cache and figures out how to insert the newly updated thread\nexport const parseRealtimeThreads = (\n  prevThreads: Array<any>,\n  updatedThread: Object\n) => {\n  // get an array of thread ids based on the threads already in cache\n  const prevThreadIds = prevThreads.map(thread => thread.node.id);\n\n  // determine if the newly updated thread exists in the cache or not\n  // if it doesn't exist in cache, it's a new thread! if it does exist in cache, it just means its\n  // been updated with a new message\n  const hasNewThread = prevThreadIds.indexOf(updatedThread.id) < 0;\n\n  return hasNewThread\n    ? [\n        {\n          node: updatedThread,\n          cursor: '__this-is-a-cursor__',\n          __typename: 'Thread',\n        },\n        ...prevThreads,\n      ]\n    : [\n        ...prevThreads.map(thread => {\n          if (thread.node.id !== updatedThread.id) return thread;\n          return {\n            node: updatedThread,\n            cursor: '__this-is-a-cursor__',\n            __typename: 'Thread',\n          };\n        }),\n      ];\n};\n"
  },
  {
    "path": "shared/graphql-cache-keys.js",
    "content": "// @flow\nexport const communityChannelCount = (id: string) =>\n  `community:${id}:channelCount`;\n"
  },
  {
    "path": "shared/imgix/getDefaultExpires.js",
    "content": "// @flow\n\n/*\nExpire images sent to the client at midnight each day (UTC).\nExpiration needs to be consistent across all images in order\nto preserve client-side caching abilities and to prevent checksum\nmismatches during SSR\n*/\n\nexport const getDefaultExpires = () => {\n  const date = new Date();\n  date.setHours(24);\n  date.setMinutes(0);\n  date.setSeconds(0);\n  date.setMilliseconds(0);\n  return date.getTime();\n};\n"
  },
  {
    "path": "shared/imgix/index.js",
    "content": "// @flow\nimport {\n  signImageUrl,\n  stripLegacyPrefix,\n  hasLegacyPrefix,\n  LEGACY_PREFIX,\n} from './sign';\nimport { getDefaultExpires } from './getDefaultExpires';\nimport { signCommunity } from './signCommunity';\nimport { signThread } from './signThread';\nimport { signUser } from './signUser';\nimport { signMessage } from './signMessage';\n\nexport {\n  getDefaultExpires,\n  LEGACY_PREFIX,\n  stripLegacyPrefix,\n  hasLegacyPrefix,\n  signImageUrl,\n  signCommunity,\n  signThread,\n  signUser,\n  signMessage,\n};\n"
  },
  {
    "path": "shared/imgix/sign.js",
    "content": "// @flow\nrequire('now-env');\nimport ImgixClient from 'imgix-core-js';\nimport decodeUriComponent from 'decode-uri-component';\nimport { getDefaultExpires } from './getDefaultExpires';\n\nconst IS_PROD = process.env.NODE_ENV === 'production';\nexport const LEGACY_PREFIX = 'https://spectrum.imgix.net/';\n\n// prettier-ignore\nconst isLocalUpload = (url: string): boolean => url.startsWith('/uploads/', 0) && !IS_PROD\n// prettier-ignore\nexport const hasLegacyPrefix = (url: string): boolean => url.startsWith(LEGACY_PREFIX, 0)\n// prettier-ignore\nconst useProxy = (url: string): boolean => url.indexOf('spectrum.imgix.net') < 0 && url.startsWith('http', 0)\n\n/*\n  When an image is uploaded to s3, we generate a url to be stored in our db\n  that looks like: https://spectrum.imgix.net/users/:id/foo.png\n\n  Because we are able to proxy our s3 bucket to imgix, we technically only\n  needed to store the '/users/...' path. But since legacy threads and messages\n  contain the full url, it must be stripped in order to generate a *new* signed\n  url in this utility\n*/\n// prettier-ignore\nexport const stripLegacyPrefix = (url: string): string => url.replace(LEGACY_PREFIX, '')\n\ntype Opts = {\n  expires: ?number,\n};\n\nconst defaultOpts = {\n  expires: getDefaultExpires(),\n};\n\nconst signPrimary = (url: string, opts: Opts = defaultOpts): string => {\n  const client = new ImgixClient({\n    domains: 'spectrum.imgix.net',\n    secureURLToken: process.env.IMGIX_SECURITY_KEY,\n  });\n  return client.buildURL(url, opts);\n};\n\nconst signProxy = (url: string, opts?: Opts = defaultOpts): string => {\n  const client = new ImgixClient({\n    domains: 'spectrum-proxy.imgix.net',\n    secureURLToken: process.env.IMGIX_PROXY_SECURITY_KEY,\n  });\n  return client.buildURL(url, opts);\n};\n\nexport const signImageUrl = (url: string, opts: Opts = defaultOpts): string => {\n  if (!url) return '';\n  if (!opts.expires) {\n    opts['expires'] = defaultOpts.expires;\n  }\n\n  if (isLocalUpload(url)) return url;\n\n  const processedUrl = hasLegacyPrefix(url) ? stripLegacyPrefix(url) : url;\n\n  try {\n    // we never have to worry about escaping or unescaping proxied urls e.g. twitter images\n    if (useProxy(url)) return signProxy(processedUrl, opts);\n    return signPrimary(processedUrl, opts);\n  } catch (err) {\n    // if something fails, dont crash the entire frontend, just fail the images\n    console.error(err);\n    return '';\n  }\n};\n"
  },
  {
    "path": "shared/imgix/signCommunity.js",
    "content": "// @flow\nimport type { DBCommunity } from 'shared/types';\nimport { signImageUrl } from 'shared/imgix';\n\n// prettier-ignore\nexport const signCommunity = (community: DBCommunity, expires?: number): DBCommunity => {\n  const { profilePhoto, coverPhoto, ...rest } = community;\n\n  return {\n    ...rest,\n    profilePhoto: signImageUrl(profilePhoto, { \n      w: 256, \n      h: 256, \n      dpr: 2, \n      auto: 'compress',\n      expires \n    }),\n    coverPhoto: signImageUrl(coverPhoto, { \n      w: 1280, \n      h: 384, \n      dpr: 2, \n      q: 100,\n      expires \n    }),\n  };\n};\n"
  },
  {
    "path": "shared/imgix/signMessage.js",
    "content": "// @flow\nimport type { DBMessage } from 'shared/types';\nimport { signImageUrl } from 'shared/imgix';\n\nexport const signMessage = (\n  message: DBMessage,\n  expires?: number\n): DBMessage => {\n  const { content, messageType } = message;\n  if (messageType !== 'media') return message;\n  return {\n    ...message,\n    content: {\n      ...content,\n      body: signImageUrl(message.content.body, { expires }),\n    },\n  };\n};\n"
  },
  {
    "path": "shared/imgix/signThread.js",
    "content": "// @flow\nimport type { DBThread } from 'shared/types';\nimport { signImageUrl } from 'shared/imgix';\nconst url = require('url');\n\nconst signBody = (body?: string, expires?: number): string => {\n  if (!body) {\n    return JSON.stringify({\n      blocks: [\n        {\n          key: 'foo',\n          text: '',\n          type: 'unstyled',\n          depth: 0,\n          inlineStyleRanges: [],\n          entityRanges: [],\n          data: {},\n        },\n      ],\n      entityMap: {},\n    });\n  }\n\n  const returnBody = JSON.parse(body);\n\n  const imageKeys = Object.keys(returnBody.entityMap).filter(\n    key => returnBody.entityMap[key].type.toLowerCase() === 'image'\n  );\n\n  imageKeys.forEach((key, index) => {\n    if (!returnBody.entityMap[key]) return;\n\n    const { src } = returnBody.entityMap[key].data;\n\n    // transform the body inline with signed image urls\n    const imageUrlStoredAsSigned =\n      src &&\n      (src.indexOf('https://spectrum.imgix.net') >= 0 ||\n        src.indexOf('https://spectrum-proxy.imgix.net') >= 0);\n    // if the image was stored in the db as a signed url (eg. after the plaintext update to the thread editor)\n    // we need to remove all query params from the src, then re-sign in order to avoid duplicate signatures\n    // or sending down a url with an expired signature\n    if (imageUrlStoredAsSigned) {\n      const { pathname } = url.parse(src);\n      // always attempt to use the parsed pathname, but fall back to the original src\n      const sanitized = decodeURIComponent(\n        pathname ? pathname.replace(/^\\//, '') : src\n      );\n      returnBody.entityMap[key].data.src = signImageUrl(sanitized, { expires });\n    } else {\n      returnBody.entityMap[key].data.src = signImageUrl(src, { expires });\n    }\n  });\n\n  return JSON.stringify(returnBody);\n};\n\nexport const signThread = (thread: DBThread, expires?: number): DBThread => {\n  const { content, ...rest } = thread;\n\n  return {\n    ...rest,\n    content: {\n      ...content,\n      body: signBody(content.body, expires),\n    },\n  };\n};\n"
  },
  {
    "path": "shared/imgix/signUser.js",
    "content": "// @flow\nimport type { DBUser } from 'shared/types';\nimport { signImageUrl } from 'shared/imgix';\n\nexport const signUser = (user: DBUser, expires?: number): DBUser => {\n  const { profilePhoto, coverPhoto, ...rest } = user;\n\n  return {\n    ...rest,\n    profilePhoto: signImageUrl(profilePhoto, {\n      w: 256,\n      h: 256,\n      dpr: 2,\n      auto: 'compress',\n      expires,\n    }),\n    coverPhoto: signImageUrl(coverPhoto, {\n      w: 1280,\n      h: 384,\n      dpr: 2,\n      q: 100,\n      expires,\n    }),\n  };\n};\n"
  },
  {
    "path": "shared/install-dependencies.js",
    "content": "// @flow\nconst { readdirSync, statSync } = require('fs');\nconst { join } = require('path');\nconst { spawn } = require('child_process');\n\nconst getDirs = p =>\n  readdirSync(p).filter(f => statSync(join(p, f)).isDirectory());\n\n// Get a list of all non-build directories in the root folder\nconst rootDirs = getDirs(join(__dirname, '..')).filter(\n  dir => dir.indexOf('build') === -1\n);\n\n// Filter them by directories that have a package.json\nconst workerDirs = rootDirs.filter(dir => {\n  let result = false;\n  readdirSync(dir).forEach(file => {\n    if (file === 'package.json') {\n      result = true;\n    }\n  });\n  return result;\n});\n\nconst installDeps = (dir, callback) => {\n  const stream = spawn(\n    process.platform === 'win32' ? 'yarn.cmd' : 'yarn',\n    ['install', '--no-progress', '--non-interactive'],\n    { cwd: join(__dirname, '..', dir), stdio: 'inherit' }\n  );\n\n  stream.on('close', code => {\n    callback();\n  });\n};\n\nconst installWorkerDeps = index => {\n  const dir = workerDirs[index];\n  if (!dir) return process.exit(0);\n  installDeps(dir, () => {\n    installWorkerDeps(index + 1);\n  });\n};\n\n// Install the dependencies in the root folder first\n// then recursilvey install them for all the workers\ninstallDeps('/', () => {\n  installWorkerDeps(0);\n});\n"
  },
  {
    "path": "shared/middlewares/cors.js",
    "content": "// @flow\nimport cors from 'cors';\n\nexport const corsOptions = {\n  origin:\n    process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV\n      ? [\n          'https://spectrum.chat',\n          'https://alpha.spectrum.chat',\n          'https://admin.spectrum.chat',\n          'https://hyperion.workers.spectrum.chat',\n          'https://hyperion.alpha.spectrum.chat',\n          process.env.NOW_URL,\n        ].filter(Boolean)\n      : [/localhost/],\n  credentials: true,\n};\n\nexport default cors(corsOptions);\n"
  },
  {
    "path": "shared/middlewares/csrf.js",
    "content": "// @flow\nimport hostValidation from 'host-validation';\n\n// NOTE(@mxstbr):\n// - Host header only contains the domain, so something like 'build-api-asdf123.now.sh' or 'spectrum.chat'\n// - Referer header contains the entire URL, so something like 'https://build-api-asdf123.now.sh/forward' or 'https://spectrum.chat/forward'\n// That means we have to check the Host slightly differently from the Referer to avoid things like 'my-domain-spectrum.chat' to be able to hack our users\n\n// Hosts, without http(s):// and paths\nconst trustedHosts = [\n  process.env.NOW_URL &&\n    new RegExp(`^${process.env.NOW_URL.replace('https://', '')}$`),\n  /^spectrum\\.chat$/,\n  // All subdomains\n  /^.*\\.spectrum\\.chat$/,\n].filter(Boolean);\n\n// Referers, with http(s):// and paths\nconst trustedReferers = [\n  process.env.NOW_URL && new RegExp(`^${process.env.NOW_URL}($|\\/.*)`),\n  /^https:\\/\\/spectrum\\.chat($|\\/.*)/,\n  // All subdomains\n  /^https:\\/\\/.*\\.spectrum\\.chat($|\\/.*)/,\n].filter(Boolean);\n\nexport default hostValidation({\n  hosts: trustedHosts,\n  referers: trustedReferers,\n  mode: 'either',\n});\n"
  },
  {
    "path": "shared/middlewares/error-handler.js",
    "content": "// @flow\nimport Raven from 'shared/raven';\n\nexport default (\n  err: Error,\n  req: express$Request,\n  res: express$Response,\n  next: express$NextFunction\n) => {\n  if (err) {\n    console.error(err);\n    res\n      .status(500)\n      .send(\n        'Oops, something went wrong! Our engineers have been alerted and will fix this asap.'\n      );\n    Raven.captureException(err);\n  } else {\n    return next();\n  }\n};\n"
  },
  {
    "path": "shared/middlewares/logging.js",
    "content": "// @flow\n// Log requests with debug\nconst debug = require('debug')('shared:middlewares:logging');\n\nmodule.exports = (\n  req: express$Request,\n  res: express$Response,\n  next: express$NextFunction\n) => {\n  if (req.body && req.body.operationName) {\n    debug(`requesting ${req.url}: ${req.body.operationName}`);\n  } else {\n    debug(`requesting ${req.url}`);\n  }\n  next();\n};\n"
  },
  {
    "path": "shared/middlewares/raven.js",
    "content": "// @flow\nimport Raven from 'shared/raven';\n\nexport default Raven.requestHandler();\n"
  },
  {
    "path": "shared/middlewares/security.js",
    "content": "// @flow\nconst hpp = require('hpp');\nconst helmet = require('helmet');\nconst uuid = require('uuid');\nconst hsts = require('hsts');\nconst express_enforces_ssl = require('express-enforces-ssl');\nconst IS_PROD = process.env.NODE_ENV === 'production' && !process.env.FORCE_DEV;\n\nfunction securityMiddleware(\n  server: express$Application,\n  { enableNonce, enableCSP }: { enableNonce: boolean, enableCSP: boolean }\n) {\n  // Don't expose any software information to hackers.\n  server.disable('x-powered-by');\n\n  // Prevent HTTP Parameter pollution.\n  server.use(hpp());\n\n  if (IS_PROD) {\n    server.use(\n      hsts({\n        // 5 mins in seconds\n        // we will scale this up incrementally to ensure we dont break the\n        // app for end users\n        // see deployment recommendations here https://hstspreload.org/?domain=spectrum.chat\n        maxAge: 300,\n        includeSubDomains: true,\n        preload: true,\n      })\n    );\n\n    server.use(express_enforces_ssl());\n  }\n\n  // The xssFilter middleware sets the X-XSS-Protection header to prevent\n  // reflected XSS attacks.\n  // @see https://helmetjs.github.io/docs/xss-filter/\n  server.use(helmet.xssFilter());\n\n  // Frameguard mitigates clickjacking attacks by setting the X-Frame-Options header.\n  // @see https://helmetjs.github.io/docs/frameguard/\n  server.use(helmet.frameguard('deny'));\n\n  // Sets the X-Download-Options to prevent Internet Explorer from executing\n  // downloads in your site’s context.\n  // @see https://helmetjs.github.io/docs/ienoopen/\n  server.use(helmet.ieNoOpen());\n\n  // Don’t Sniff Mimetype middleware, noSniff, helps prevent browsers from trying\n  // to guess (“sniff”) the MIME type, which can have security implications. It\n  // does this by setting the X-Content-Type-Options header to nosniff.\n  // @see https://helmetjs.github.io/docs/dont-sniff-mimetype/\n  server.use(helmet.noSniff());\n\n  if (enableNonce) {\n    // Attach a unique \"nonce\" to every response. This allows use to declare\n    // inline scripts as being safe for execution against our content security policy.\n    // @see https://helmetjs.github.io/docs/csp/\n    server.use(\n      (\n        request: express$Request,\n        response: express$Response,\n        next: express$NextFunction\n      ) => {\n        response.locals.nonce = uuid.v4();\n        next();\n      }\n    );\n  }\n\n  // Content Security Policy (CSP)\n  // It can be a pain to manage these, but it's a really great habit to get in to.\n  // @see https://helmetjs.github.io/docs/csp/\n  const cspConfig = {\n    directives: {\n      // The default-src is the default policy for loading content such as\n      // JavaScript, Images, CSS, Fonts, AJAX requests, Frames, HTML5 Media.\n      // As you might suspect, is used as fallback for unspecified directives.\n      defaultSrc: [\"'self'\"],\n\n      // Defines valid sources of JavaScript.\n      scriptSrc: [\n        \"'self'\",\n        \"'unsafe-eval'\",\n        'cdn.ravenjs.com',\n        'cdn.polyfill.io',\n\n        // Note: We will execution of any inline scripts that have the following\n        // nonce identifier attached to them.\n        // This is useful for guarding your application whilst allowing an inline\n        // script to do data store rehydration (redux/mobx/apollo) for example.\n        // @see https://helmetjs.github.io/docs/csp/\n        (request, response) => `'nonce-${response.locals.nonce}'`,\n      ],\n\n      // Defines the origins from which images can be loaded.\n      // @note: Leave open to all images, too much image coming from different servers.\n      imgSrc: ['https:', 'http:', \"'self'\", 'data:', 'blob:'],\n\n      // Defines valid sources of stylesheets.\n      styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n\n      // Applies to XMLHttpRequest (AJAX), WebSocket or EventSource.\n      // If not allowed the browser emulates a 400 HTTP status code.\n      connectSrc: ['https:', 'wss:'],\n\n      // lists the URLs for workers and embedded frame contents.\n      // For example: child-src https://youtube.com would enable\n      // embedding videos from YouTube but not from other origins.\n      // @note: we allow users to embed any page they want.\n      childSrc: ['https:', 'http:'],\n\n      // allows control over Flash and other plugins.\n      objectSrc: [\"'none'\"],\n\n      // restricts the origins allowed to deliver video and audio.\n      mediaSrc: [\"'none'\"],\n    },\n\n    // Set to true if you only want browsers to report errors, not block them.\n    reportOnly:\n      process.env.NODE_ENV === 'development' || process.env.FORCE_DEV || false,\n    // Necessary because of Vercel CDN usage\n    browserSniff: false,\n  };\n\n  if (enableCSP) {\n    server.use(helmet.contentSecurityPolicy(cspConfig));\n  }\n}\n\nmodule.exports = securityMiddleware;\n"
  },
  {
    "path": "shared/middlewares/session.js",
    "content": "// @flow\nimport session from 'cookie-session';\nimport { cookieKeygrip } from '../cookie-utils';\n\nconst ONE_WEEK = 604800000;\n\nif (!process.env.SESSION_COOKIE_SECRET && !process.env.TEST_DB) {\n  throw new Error(\n    '[shared/middlewares/session] You have to provide the SESSION_COOKIE_SECRET environment variable.'\n  );\n}\n\n// Create session middleware\nexport default session({\n  keys: cookieKeygrip,\n  name: 'session',\n  secure: process.env.NODE_ENV === 'production',\n  // This is refresh everytime a user does a request\n  // @see api/routes/middleware/index.js\n  maxAge: ONE_WEEK,\n  signed: process.env.TEST_DB ? false : true,\n  sameSite: 'lax',\n});\n"
  },
  {
    "path": "shared/middlewares/statsd.js",
    "content": "// @flow\nimport statsdMiddleware from 'express-hot-shots';\nimport { statsd } from '../statsd';\n\nconst middleware = statsdMiddleware({\n  client: statsd,\n});\n\nexport default (\n  req: express$Request,\n  res: express$Response,\n  next: express$NextFunction\n) => {\n  // Set a sensible default req.statsdKey, which is what will be shown in the DataDog UI. Example key:\n  // hyperion.http.get\n  // $FlowFixMe\n  req.statsdKey = `http.${req.method.toLowerCase() || 'unknown_method'}`;\n  return middleware(req, res, next);\n};\n"
  },
  {
    "path": "shared/middlewares/thread-param.js",
    "content": "// Redirect any route ?thread=<id> or ?t=<id> to /thread/<id>\n\nconst threadParamRedirect = (req, res, next) => {\n  const threadId = req.query.thread || req.query.t;\n\n  if (threadId) {\n    if (req.query.m) {\n      res.redirect(`/thread/${threadId}?m=${req.query.m}`);\n    } else {\n      res.redirect(`/thread/${threadId}`);\n    }\n  } else {\n    next();\n  }\n};\n\nexport default threadParamRedirect;\n"
  },
  {
    "path": "shared/middlewares/toobusy.js",
    "content": "// @flow\nimport toobusy from 'toobusy-js';\n\n// Middleware which blocks requests when the Node server is too busy\n// now automatically retries the request at another instance of the server if it's too busy\nexport default (\n  req: express$Request | http$IncomingMessage,\n  res: express$Response | http$ServerResponse,\n  next: express$NextFunction | (() => void)\n) => {\n  // // Don't send 503s in testing, that's dumb, just wait it out\n  if (process.env.NODE_ENV !== 'testing' && !process.env.TEST_DB && toobusy()) {\n    res.statusCode = 503;\n    res.end(\n      'It looks like Spectrum is very busy right now, please try again in a minute.'\n    );\n  } else {\n    next();\n  }\n};\n"
  },
  {
    "path": "shared/normalize-url.js",
    "content": "// @flow\n\n// Taken from @braintree/sanitize-url\nconst invalidPrototcolRegex = /^(%20|\\s)*(javascript|data)/im;\nconst ctrlCharactersRegex = /[^\\x20-\\x7E]/gim;\nconst urlSchemeRegex = /^([^:]+):/gm;\nconst relativeFirstCharacters = ['.', '/'];\nconst STARTS_WITH_PROTOCOL = /^https?:\\/\\//i;\n\nfunction isRelativeUrl(url) {\n  return relativeFirstCharacters.indexOf(url[0]) > -1;\n}\n\nfunction sanitizeUrl(url) {\n  var urlScheme, urlSchemeParseResults;\n  var sanitizedUrl = url.replace(ctrlCharactersRegex, '');\n\n  if (isRelativeUrl(sanitizedUrl)) {\n    return sanitizedUrl;\n  }\n\n  urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);\n\n  if (!urlSchemeParseResults) {\n    return sanitizedUrl;\n  }\n\n  urlScheme = urlSchemeParseResults[0];\n\n  if (invalidPrototcolRegex.test(urlScheme)) {\n    return 'about:blank';\n  }\n\n  return sanitizedUrl;\n}\n\n// Note(@mxstbr): This method assumes that a string passed into it is already verified to be an URL\n// it'll just append https:// to anything that doesn't look like an URL\nconst addProtocolToString = (url: string) => {\n  const sanitized = sanitizeUrl(url);\n  if (sanitized === 'about:blank') return sanitized;\n\n  if (STARTS_WITH_PROTOCOL.test(url)) {\n    return sanitized;\n  } else {\n    return `https://${sanitized}`;\n  }\n};\n\nexport default addProtocolToString;\n"
  },
  {
    "path": "shared/only-contains-emoji.js",
    "content": "// @flow\nimport createEmojiRegex from 'emoji-regex';\nimport type { RawDraftContentState } from 'draft-js/lib/RawDraftContentState';\n\n// This regex matches every string with any emoji in it, not just strings that only have emojis\nconst originalEmojiRegex = createEmojiRegex();\n\n// Make sure we match strings that _only_ contain emojis (and whitespace)\nconst regex = new RegExp(\n  '^(' + originalEmojiRegex.toString().replace(/\\/g$/, '') + '|\\\\s)+$'\n);\n\nconst onlyContainsEmoji = (text: string) => regex.test(text);\n\n// DraftJS-specific check\nexport const draftOnlyContainsEmoji = (raw: RawDraftContentState) =>\n  raw.blocks.length === 1 &&\n  raw.blocks[0].type === 'unstyled' &&\n  onlyContainsEmoji(raw.blocks[0].text);\n\nexport default onlyContainsEmoji;\n"
  },
  {
    "path": "shared/raven/index.js",
    "content": "require('now-env');\nconst debug = require('debug')('shared:raven');\n\nlet Raven;\nif (\n  process.env.NODE_ENV === 'production' &&\n  !process.env.FORCE_DEV &&\n  process.env.SENTRY_DSN_SERVER\n) {\n  Raven = require('raven');\n  Raven.config(process.env.SENTRY_DSN_SERVER, {\n    environment: process.env.NODE_ENV,\n    name: process.env.SENTRY_NAME,\n  }).install();\n} else {\n  const noop = () => {};\n  debug('mocking Raven in development');\n  // Mock the Raven API in development\n  Raven = {\n    captureException: noop,\n    setUserContext: noop,\n    config: () => ({ install: noop }),\n    requestHandler: () => (req, res, next) => next(),\n    parsers: {\n      parseRequest: noop,\n    },\n  };\n}\n\nexport default Raven;\n"
  },
  {
    "path": "shared/regexps.js",
    "content": "// @flow\n\nmodule.exports.MENTIONS = /\\/?\\B@[a-z0-9._-]+[a-z0-9_-]/gi;\nmodule.exports.URL = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&\\/=]*)/gi;\nmodule.exports.RELATIVE_URL = /^\\/([^\\/].*|$)/g;\nmodule.exports.SPECTRUM_URLS = /(?:(?:https?:\\/\\/)?|\\B)(?:spectrum\\.chat|localhost:3000)(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\n"
  },
  {
    "path": "shared/sentencify.js",
    "content": "/**\r\n * This file is shared between server and client.\r\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\r\n *\r\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\r\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\r\n * so it chokes on the Flow syntax.\r\n * More info: https://flow.org/en/docs/types/comments/\r\n */\r\nvar defaultOptions = {\r\n  max: 3,\r\n  overflowPostfix: ' and others',\r\n};\r\n\r\n// Sentencify an array of strings\r\nfunction sentencify(strings /*: Array<strings> */) /*:strings */ {\r\n  // Get the default options if necessary\r\n  var _ref =\r\n      arguments.length > 1 && arguments[1] !== undefined\r\n        ? arguments[1]\r\n        : defaultOptions,\r\n    max = _ref.max,\r\n    overflowPostfix = _ref.overflowPostfix;\r\n\r\n  // If we have more than three strings, only take the first 4\r\n  var list = strings.length > max ? strings.slice(0, max) : strings;\r\n  // ['Max Stoiber', 'Bryn Lovin', 'Bryn Jackson']\r\n  // => 'Max Stoiber, Brian Lovin, Bryn Jackson'\r\n  var sentence = list.join(', ');\r\n  if (strings.length <= 1) return sentence;\r\n  // 'Max Stoiber, Brian Lovin, Bryn Jackson'\r\n  // => 'Max Stoiber, Brian Lovin, Bryn Jackson and others'\r\n  if (strings.length > max) return sentence + overflowPostfix;\r\n  // 'Max Stoiber, Brian Lovin, Bryn Jackson'\r\n  // => 'Max Stoiber, Brian Lovin and Bryn Jackson'\r\n  return sentence.replace(\r\n    ', ' + strings[strings.length - 1],\r\n    ' and ' + strings[strings.length - 1]\r\n  );\r\n}\r\n\r\nmodule.exports = sentencify;\r\n"
  },
  {
    "path": "shared/slate-utils.js",
    "content": "// @flow\n/**\n * This file is shared between server and client.\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\n *\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\n * so it chokes on the Flow syntax.\n * More info: https://flow.org/en/docs/types/comments/\n */\nvar Raw = require('slate/lib/serializers/raw').default;\nvar Plain = require('slate/lib/serializers/plain').default;\n\nfunction toJSON(state /*: Object */) {\n  return Raw.serialize(state, { terse: true });\n}\nfunction toState(json /*: Object */) {\n  return Raw.deserialize(json, { terse: true });\n}\n\nfunction toPlainText(state /*: Object*/) {\n  return Plain.serialize(state);\n}\nfunction fromPlainText(string /*: string*/) {\n  return Plain.deserialize(string);\n}\n\nmodule.exports = {\n  toJSON: toJSON,\n  toState: toState,\n  toPlainText: toPlainText,\n  fromPlainText: fromPlainText,\n};\n"
  },
  {
    "path": "shared/slug-deny-lists.js",
    "content": "/**\n * This file is shared between server and client.\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\n */\n\nvar COMMUNITY_SLUG_DENY_LIST = [\n  'about',\n  'admin',\n  'api',\n  'apps',\n  'blog',\n  'business',\n  'code-of-conduct',\n  'contact',\n  'cookies',\n  'copyright',\n  'dashboard',\n  'developers',\n  'discover',\n  'downgrade',\n  'everything',\n  'explore',\n  'faq',\n  'features',\n  'help',\n  'home',\n  'jobs',\n  'legal',\n  'login',\n  'logout',\n  'messages',\n  'new',\n  'notifications',\n  'null',\n  'pages',\n  'pricing',\n  'privacy',\n  'pro',\n  'profile',\n  'search',\n  'security',\n  'settings',\n  'share',\n  'shop',\n  'status',\n  'support',\n  'team',\n  'terms',\n  'thread',\n  'undefined',\n  'upgrade',\n  'user',\n  'users',\n  'me',\n];\n\nvar CHANNEL_SLUG_DENY_LIST = ['feed', 'members', 'settings'];\n\nmodule.exports = {\n  COMMUNITY_SLUG_DENY_LIST: COMMUNITY_SLUG_DENY_LIST,\n  CHANNEL_SLUG_DENY_LIST: CHANNEL_SLUG_DENY_LIST,\n};\n"
  },
  {
    "path": "shared/sort-by-date.js",
    "content": "/**\r\n * This file is shared between server and client.\r\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\r\n *\r\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\r\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\r\n * so it chokes on the Flow syntax.\r\n * More info: https://flow.org/en/docs/types/comments/\r\n */\r\n\r\nfunction sortByDate(\r\n  array /*: Array<number> */,\r\n  key /*: string */,\r\n  order /*: string */\r\n) {\r\n  return array.sort(function(a, b) {\r\n    var x = new Date(a[key]).getTime();\r\n    var y = new Date(b[key]).getTime();\r\n    // desc = older to newest from top to bottom\r\n    var val = order === 'desc' ? y - x : x - y;\r\n    return val;\r\n  });\r\n}\r\n\r\nmodule.exports = sortByDate;\r\n"
  },
  {
    "path": "shared/statsd.js",
    "content": "// @flow\nconst os = require('os');\nconst debug = require('debug')('shared:middlewares:statsd');\n\ntype Tags = {\n  [key: string]: string,\n};\n\nconst stringify = (obj?: { [key: string]: string }): Array<string> => {\n  if (!obj) return [];\n  return Object.keys(obj).reduce((arr, key) => {\n    // $FlowFixMe\n    return arr.concat([`${key}:${obj[key]}`]);\n  }, []);\n};\n\nconst log = (\n  name: string,\n  key: string,\n  value?: number,\n  tags?: Tags,\n  timestamp?: number\n) => {\n  let stringTags;\n  if (!tags && typeof value !== 'number') {\n    tags = value;\n    value = undefined;\n  }\n  if (tags) {\n    if (Array.isArray(tags)) {\n      stringTags = tags.join(',');\n    } else {\n      stringTags = stringify(tags).join(',');\n    }\n  }\n  debug(\n    `${name}: ${key}${value !== undefined ? `:${value}` : ''}${\n      stringTags ? `#${stringTags}` : ''\n    }`\n  );\n};\n\nlet counts = {};\nexport let statsd = {\n  histogram: (key: string, value: number, tags?: Tags, timestamp?: number) => {\n    log('histogram', key, value, tags, timestamp);\n  },\n  timing: (key: string, value: number, tags?: Tags, timestamp?: number) => {\n    log('timing', key, value, tags, timestamp);\n  },\n  increment: (key: string, value?: number, tags?: Tags, timestamp?: number) => {\n    if (!counts[key]) counts[key] = 0;\n    counts[key] += typeof value === 'number' ? value : 1;\n    log(\n      'increment',\n      key,\n      counts[key],\n      tags || (typeof value !== 'number' && value) || undefined,\n      timestamp\n    );\n  },\n  gauge: (key: string, value: number, tags?: Tags, timestamp?: number) => {\n    log('gauge', key, value, tags, timestamp);\n  },\n};\nif (\n  !process.env.DATADOG_API_KEY ||\n  process.env.DATADOG_API_KEY === 'undefined'\n) {\n  console.warn('No DATADOG_API_KEY provided, not tracking metrics.');\n} else {\n  console.warn('Tracking metrics to DataDog.');\n  const metrics = require('datadog-metrics');\n  metrics.init({\n    defaultTags: [\n      `server:${process.env.SENTRY_NAME || 'unknown_server'}`,\n      `hostname: ${os.hostname() || 'unknown_instance_hostname'}`,\n    ],\n  });\n\n  // This is necessary for express-hot-shots to work\n  const handleObjectTags = method => {\n    const original = metrics[method];\n    metrics[method] = (key, val, tags, timestamp) => {\n      return original.call(\n        metrics,\n        key,\n        val,\n        Array.isArray(tags) ? tags : stringify(tags),\n        timestamp\n      );\n    };\n  };\n  handleObjectTags('histogram');\n  handleObjectTags('gauge');\n  handleObjectTags('increment');\n  metrics.timing = (...args) => metrics.histogram.call(metrics, ...args);\n\n  statsd = metrics;\n}\n\nfunction collectMemoryStats() {\n  var memory = process.memoryUsage();\n  statsd.gauge('memory.rss', memory.rss);\n  statsd.gauge('memory.heapTotal', memory.heapTotal);\n  statsd.gauge('memory.heapUsed', memory.heapUsed);\n}\n\n// Report memory usage every second\nsetInterval(collectMemoryStats, 1000);\n"
  },
  {
    "path": "shared/test/encryption.test.js",
    "content": "// @flow\nimport {\n  encryptString,\n  decryptString,\n  encryptObject,\n  decryptObject,\n} from '../encryption';\n\nconst inputString = 'this should be encrypted';\nconst inputObject = { foo: 'bar', biz: 'baz' };\n\nit('should encrypt and decrypt a string', () => {\n  const encrypted = encryptString(inputString);\n  const decrypted = decryptString(encrypted);\n\n  expect(encrypted).not.toEqual(inputString);\n  expect(decrypted).toEqual(inputString);\n  expect(typeof decrypted).toEqual('string');\n  expect(typeof encrypted).toEqual('string');\n});\n\nit('should encrypt and decrypt a object', () => {\n  const encrypted = encryptObject(inputObject);\n  const decrypted = decryptObject(encrypted);\n\n  expect(encrypted).not.toEqual(inputObject);\n  expect(decrypted).toEqual(inputObject);\n  expect(typeof decrypted).toEqual('object');\n  expect(typeof encrypted).toEqual('string');\n});\n"
  },
  {
    "path": "shared/test/fixtures/CHANNEL_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:49:54.243Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"db72709f-b27a-4494-b536-7bacbb0e6ca2\",\n    \"payload\": \"{\\\"coverPhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/cover-green.png\\\",\\\"createdAt\\\":\\\"2017-07-12T21:46:14.591Z\\\",\\\"description\\\":\\\"Damn son\\\",\\\"id\\\":\\\"db72709f-b27a-4494-b536-7bacbb0e6ca2\\\",\\\"name\\\":\\\"Whaddup\\\",\\\"profilePhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/profile-green.png\\\",\\\"slug\\\":\\\"whaddup\\\",\\\"website\\\":\\\"\\\"}\",\n    \"type\": \"COMMUNITY\"\n  },\n  \"createdAt\": \"2017-07-12T21:50:41.380Z\",\n  \"entities\": [\n    {\n      \"id\": \"6b937853-a525-408b-a5a6-23a33e27de87\",\n      \"payload\": \"{\\\"communityId\\\":\\\"db72709f-b27a-4494-b536-7bacbb0e6ca2\\\",\\\"createdAt\\\":\\\"2017-07-12T21:50:41.266Z\\\",\\\"description\\\":\\\"3\\\",\\\"id\\\":\\\"6b937853-a525-408b-a5a6-23a33e27de87\\\",\\\"isDefault\\\":true,\\\"isPrivate\\\":false,\\\"name\\\":\\\"New channel3\\\",\\\"slug\\\":\\\"3\\\"}\",\n      \"type\": \"CHANNEL\"\n    },\n    {\n      \"id\": \"681cddff-9446-4354-9688-e242dd279cdc\",\n      \"payload\": \"{\\\"communityId\\\":\\\"db72709f-b27a-4494-b536-7bacbb0e6ca2\\\",\\\"createdAt\\\":\\\"2017-07-12T21:51:22.856Z\\\",\\\"description\\\":\\\"test\\\",\\\"id\\\":\\\"681cddff-9446-4354-9688-e242dd279cdc\\\",\\\"isDefault\\\":true,\\\"isPrivate\\\":false,\\\"name\\\":\\\"Test test 1,2,3\\\",\\\"slug\\\":\\\"test-test-1-2-3\\\"}\",\n      \"type\": \"CHANNEL\"\n    }\n  ],\n  \"event\": \"CHANNEL_CREATED\",\n  \"id\": \"f5bcf233-295e-4a74-b0c9-53732136029d\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:51:22.958Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/COMMUNITY_INVITE.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:48:21.629Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"db72709f-b27a-4494-b536-7bacbb0e6ca2\",\n    \"payload\": \"{\\\"coverPhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/cover-green.png\\\",\\\"createdAt\\\":\\\"2017-07-12T21:46:14.591Z\\\",\\\"description\\\":\\\"Damn son\\\",\\\"id\\\":\\\"db72709f-b27a-4494-b536-7bacbb0e6ca2\\\",\\\"name\\\":\\\"Whaddup\\\",\\\"profilePhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/profile-green.png\\\",\\\"slug\\\":\\\"whaddup\\\",\\\"website\\\":\\\"\\\"}\",\n    \"type\": \"COMMUNITY\"\n  },\n  \"createdAt\": \"2017-07-12T21:48:33.882Z\",\n  \"entities\": [\n    {\n      \"id\": \"db72709f-b27a-4494-b536-7bacbb0e6ca2\",\n      \"payload\": \"{\\\"coverPhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/cover-green.png\\\",\\\"createdAt\\\":\\\"2017-07-12T21:46:14.591Z\\\",\\\"description\\\":\\\"Damn son\\\",\\\"id\\\":\\\"db72709f-b27a-4494-b536-7bacbb0e6ca2\\\",\\\"name\\\":\\\"Whaddup\\\",\\\"profilePhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/profile-green.png\\\",\\\"slug\\\":\\\"whaddup\\\",\\\"website\\\":\\\"\\\"}\",\n      \"type\": \"COMMUNITY\"\n    }\n  ],\n  \"event\": \"COMMUNITY_INVITE\",\n  \"id\": \"ad75b507-f83d-4bbf-9bca-664107ae4302\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:48:33.882Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/DIRECT_MESSAGE_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-14T23:50:58.932Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"7e37e582-3a06-47c9-b799-9a9f7f330ae4\",\n    \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:50:12.720Z\\\",\\\"id\\\":\\\"7e37e582-3a06-47c9-b799-9a9f7f330ae4\\\",\\\"isGroup\\\":false,\\\"name\\\":null,\\\"threadLastActive\\\":\\\"2017-07-17T17:39:20.140Z\\\"}\",\n    \"type\": \"DIRECT_MESSAGE_THREAD\"\n  },\n  \"createdAt\": \"2017-07-17T17:38:13.279Z\",\n  \"entities\": [\n    {\n      \"id\": \"91fff467-927d-4946-8810-44875760d980\",\n      \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"Hey man what's up\\\"},\\\"id\\\":\\\"91fff467-927d-4946-8810-44875760d980\\\",\\\"messageType\\\":\\\"text\\\",\\\"senderId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"threadId\\\":\\\"7e37e582-3a06-47c9-b799-9a9f7f330ae4\\\",\\\"threadType\\\":\\\"directMessageThread\\\",\\\"timestamp\\\":\\\"2017-07-17T17:38:12.601Z\\\"}\",\n      \"type\": \"MESSAGE\"\n    },\n    {\n      \"id\": \"7b967b61-f84f-4363-93d4-ad7553cb59e3\",\n      \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"Testin\\\"},\\\"id\\\":\\\"7b967b61-f84f-4363-93d4-ad7553cb59e3\\\",\\\"messageType\\\":\\\"text\\\",\\\"senderId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"threadId\\\":\\\"7e37e582-3a06-47c9-b799-9a9f7f330ae4\\\",\\\"threadType\\\":\\\"directMessageThread\\\",\\\"timestamp\\\":\\\"2017-07-17T17:39:20.129Z\\\"}\",\n      \"type\": \"MESSAGE\"\n    }\n  ],\n  \"event\": \"MESSAGE_CREATED\",\n  \"id\": \"9518d65b-db9d-4d19-bca4-181c045d988d\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-17T17:39:20.463Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/MEDIA_MESSAGE_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T04:31:27.939Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"ef021b3b-c520-4133-8749-e96252eff5fc\",\n    \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"block\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"text\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\"}]}]}\\\",\\\"title\\\":\\\"New thread by @mxstbr\\\"},\\\"createdAt\\\":\\\"2017-07-12T21:43:28.409Z\\\",\\\"creatorId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"edits\\\":[],\\\"id\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2017-07-12T21:43:50.279Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"SLATE\\\"}\",\n    \"type\": \"THREAD\"\n  },\n  \"createdAt\": \"2017-07-12T21:43:50.399Z\",\n  \"entities\": [\n    {\n      \"id\": \"e9bfb8fc-fcb2-482e-9ed7-b141e974febe\",\n      \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"/thread/this-is-fake-asdf-123\\\"},\\\"id\\\":\\\"e9bfb8fc-fcb2-482e-9ed7-b141e974febe\\\",\\\"messageType\\\":\\\"media\\\",\\\"senderId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"threadId\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"threadType\\\":\\\"story\\\",\\\"timestamp\\\":\\\"2017-07-12T21:43:50.279Z\\\"}\",\n      \"type\": \"MESSAGE\"\n    }\n  ],\n  \"event\": \"MESSAGE_CREATED\",\n  \"id\": \"eb3464c9-e533-43ba-a913-924429bfe7a2\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:43:50.399Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/MENTION_MESSAGE.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:47:24.617Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"2182d960-5970-46e0-801f-ab0b8e02cfbc\",\n    \"payload\": \"{\\\"attachments\\\":[{\\\"attachmentType\\\":\\\"linkPreview\\\",\\\"data\\\":{\\\"author\\\":\\\"Styled Components\\\",\\\"date\\\":null,\\\"description\\\":\\\"styled-components - Visual primitives for the component age 💅\\\",\\\"image\\\":\\\"https://avatars0.githubusercontent.com/u/20658825?s=400&v=4\\\",\\\"publisher\\\":\\\"GitHub\\\",\\\"title\\\":\\\"styled-components/styled-components\\\",\\\"trueUrl\\\":\\\"https://github.com/styled-components/styled-components/blob/master/dangerfile.js\\\",\\\"url\\\":\\\"https://github.com/styled-components/styled-components\\\"}}],\\\"channelId\\\":\\\"dabab876-d870-40d4-83e7-594cc30d9c72\\\",\\\"communityId\\\":\\\"4e54a41d-bcde-4e7e-8df6-ec00fb235830\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"entityMap\\\\\\\":{},\\\\\\\"blocks\\\\\\\":[{\\\\\\\"key\\\\\\\":\\\\\\\"foo\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"As the title says, show us your Dangerfile and walk us through what it does!\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"6h49g\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"2thjo\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Here's ours: https://github.com/styled-components/styled-components/blob/master/dangerfile.js\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"dakk2\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"7vjf1\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"It does a couple of small things which make our lives much easier:\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"8pg27\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Forces PR submitters to add a CHANGELOG entry (this is huge)\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unordered-list-item\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"4ca04\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Warns from big PRs\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unordered-list-item\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"8r8fh\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Adds comment with test failures if there are any so people don't have to click through to slow-loading Travis\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unordered-list-item\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"25b9h\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Makes sure that tests were added\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unordered-list-item\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}},{\\\\\\\"key\\\\\\\":\\\\\\\"2aueq\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Makes sure that styled-components native and the web version stay in sync with their changes\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unordered-list-item\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}}]}\\\",\\\"title\\\":\\\"Show us your Dangerfile\\\"},\\\"createdAt\\\":\\\"2017-10-30T12:42:05.545Z\\\",\\\"creatorId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"edits\\\":[],\\\"id\\\":\\\"2182d960-5970-46e0-801f-ab0b8e02cfbc\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2018-02-07T11:18:57.824Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"DRAFTJS\\\"}\",\n    \"type\": \"THREAD\"\n  },\n  \"createdAt\": \"2018-02-07T11:18:58.027Z\",\n  \"entities\": [\n    {\n      \"id\": \"72ef51ce-23d3-4f1f-b7f6-e7bad89f68f4\",\n      \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"blocks\\\\\\\":[{\\\\\\\"key\\\\\\\":\\\\\\\"foo\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Test @mxstbr\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}}],\\\\\\\"entityMap\\\\\\\":{}}\\\"},\\\"id\\\":\\\"72ef51ce-23d3-4f1f-b7f6-e7bad89f68f4\\\",\\\"messageType\\\":\\\"draftjs\\\",\\\"senderId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"threadId\\\":\\\"2182d960-5970-46e0-801f-ab0b8e02cfbc\\\",\\\"threadType\\\":\\\"story\\\",\\\"timestamp\\\":\\\"2018-02-07T11:18:57.824Z\\\"}\",\n      \"type\": \"MESSAGE\"\n    }\n  ],\n  \"event\": \"MENTION_MESSAGE\",\n  \"id\": \"5ab87783-d54e-411c-9522-9f009ab6cb6f\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2018-02-07T11:18:58.027Z\",\n  \"userId\": \"35732c47-eda0-491f-b434-9a6cfef17c4f\"\n}\n"
  },
  {
    "path": "shared/test/fixtures/MENTION_THREAD.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:47:24.617Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"f40e1d78-10e4-484a-b07d-7e7c88afd167\",\n    \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"-Kenmw8GUeJYnxXNc0WS\\\",\\\"communityId\\\":\\\"-Kh6RfPYjmSaIWbkck8i\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"blocks\\\\\\\":[{\\\\\\\"key\\\\\\\":\\\\\\\"foo\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Test @mxstbr \\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}}],\\\\\\\"entityMap\\\\\\\":{}}\\\",\\\"title\\\":\\\"Testing\\\"},\\\"createdAt\\\":\\\"2018-02-07T11:20:26.669Z\\\",\\\"creatorId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"edits\\\":[],\\\"id\\\":\\\"f40e1d78-10e4-484a-b07d-7e7c88afd167\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2018-02-07T11:20:26.669Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"DRAFTJS\\\"}\",\n    \"type\": \"THREAD\"\n  },\n  \"createdAt\": \"2018-02-07T11:20:44.689Z\",\n  \"entities\": [\n    {\n      \"id\": \"f40e1d78-10e4-484a-b07d-7e7c88afd167\",\n      \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"-Kenmw8GUeJYnxXNc0WS\\\",\\\"communityId\\\":\\\"-Kh6RfPYjmSaIWbkck8i\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"blocks\\\\\\\":[{\\\\\\\"key\\\\\\\":\\\\\\\"foo\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Test @mxstbr \\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"unstyled\\\\\\\",\\\\\\\"depth\\\\\\\":0,\\\\\\\"inlineStyleRanges\\\\\\\":[],\\\\\\\"entityRanges\\\\\\\":[],\\\\\\\"data\\\\\\\":{}}],\\\\\\\"entityMap\\\\\\\":{}}\\\",\\\"title\\\":\\\"Testing\\\"},\\\"createdAt\\\":\\\"2018-02-07T11:20:26.669Z\\\",\\\"creatorId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"edits\\\":[],\\\"id\\\":\\\"f40e1d78-10e4-484a-b07d-7e7c88afd167\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2018-02-07T11:20:26.669Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"DRAFTJS\\\"}\",\n      \"type\": \"THREAD\"\n    }\n  ],\n  \"event\": \"MENTION_THREAD\",\n  \"id\": \"a176f386-c0b9-4c0b-a1b6-0fc4490bca32\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2018-02-07T11:20:44.689Z\",\n  \"userId\": \"35732c47-eda0-491f-b434-9a6cfef17c4f\"\n}\n"
  },
  {
    "path": "shared/test/fixtures/MESSAGE_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T04:31:27.939Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"ef021b3b-c520-4133-8749-e96252eff5fc\",\n    \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"block\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"text\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\"}]}]}\\\",\\\"title\\\":\\\"New thread by @mxstbr\\\"},\\\"createdAt\\\":\\\"2017-07-12T21:43:28.409Z\\\",\\\"creatorId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"edits\\\":[],\\\"id\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2017-07-12T21:43:50.279Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"SLATE\\\"}\",\n    \"type\": \"THREAD\"\n  },\n  \"createdAt\": \"2017-07-12T21:43:50.399Z\",\n  \"entities\": [\n    {\n      \"id\": \"e9bfb8fc-fcb2-482e-9ed7-b141e974febe\",\n      \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"Testing\\\"},\\\"id\\\":\\\"e9bfb8fc-fcb2-482e-9ed7-b141e974febe\\\",\\\"messageType\\\":\\\"text\\\",\\\"senderId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"threadId\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"threadType\\\":\\\"story\\\",\\\"timestamp\\\":\\\"2017-07-12T21:43:50.279Z\\\"}\",\n      \"type\": \"MESSAGE\"\n    }\n  ],\n  \"event\": \"MESSAGE_CREATED\",\n  \"id\": \"eb3464c9-e533-43ba-a913-924429bfe7a2\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:43:50.399Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/REACTION_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T04:31:27.939Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"249a41d1-50cc-43b9-80b7-aed12e06065e\",\n    \"payload\": \"{\\\"content\\\":{\\\"body\\\":\\\"Test 1\\\"},\\\"id\\\":\\\"249a41d1-50cc-43b9-80b7-aed12e06065e\\\",\\\"messageType\\\":\\\"text\\\",\\\"senderId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"threadId\\\":\\\"2f8087cf-b74d-4587-8ef6-c1b73a751953\\\",\\\"threadType\\\":\\\"story\\\",\\\"timestamp\\\":\\\"2017-07-10T22:44:30.456Z\\\"}\",\n    \"type\": \"MESSAGE\"\n  },\n  \"createdAt\": \"2017-07-12T21:44:30.017Z\",\n  \"entities\": [\n    {\n      \"id\": \"aa39348d-d63a-4742-ab63-6709d69a0bdc\",\n      \"payload\": \"{\\\"id\\\":\\\"aa39348d-d63a-4742-ab63-6709d69a0bdc\\\",\\\"messageId\\\":\\\"249a41d1-50cc-43b9-80b7-aed12e06065e\\\",\\\"timestamp\\\":1499895869874,\\\"type\\\":\\\"like\\\",\\\"userId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\"}\",\n      \"type\": \"REACTION\"\n    }\n  ],\n  \"event\": \"REACTION_CREATED\",\n  \"id\": \"8a5e0a65-4e2a-4c92-8a44-956f9950dda4\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:44:30.017Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/THREAD_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\",\n      \"payload\": \"{\\\"coverPhoto\\\":\\\"https://pbs.twimg.com/profile_banners/2451223458/1479507323/1500x500\\\",\\\"createdAt\\\":\\\"2016-12-31T23:00:00.000Z\\\",\\\"description\\\":\\\"Makes styled-components, react-boilerplate and micro-analytics 💅 Speciality coffee geek, skier, traveller ☕\\\",\\\"email\\\":\\\"hi@mxstbr.com\\\",\\\"id\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T04:31:27.943Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://img.gs/jztmrqvgzv/500/mxstbr.com/headshot.jpeg\\\",\\\"providerId\\\":\\\"2451223458\\\",\\\"subscriptions\\\":[],\\\"timezone\\\":-420,\\\"username\\\":\\\"mxstbr\\\",\\\"website\\\":\\\"https://mxstbr.com\\\"}\",\n      \"type\": \"USER\"\n    },\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:47:24.617Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"0961e72c-087f-4e80-a5d6-3714022094c2\",\n    \"payload\": \"{\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"createdAt\\\":\\\"2017-07-12T01:22:05.909Z\\\",\\\"description\\\":\\\"General Chatter\\\",\\\"id\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"isDefault\\\":true,\\\"isPrivate\\\":false,\\\"name\\\":\\\"General\\\",\\\"slug\\\":\\\"general\\\"}\",\n    \"type\": \"CHANNEL\"\n  },\n  \"createdAt\": \"2017-07-12T21:43:28.695Z\",\n  \"entities\": [\n    {\n      \"id\": \"ef021b3b-c520-4133-8749-e96252eff5fc\",\n      \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"block\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"text\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\"}]}]}\\\",\\\"title\\\":\\\"New thread by @mxstbr\\\"},\\\"createdAt\\\":\\\"2017-07-12T21:43:28.409Z\\\",\\\"creatorId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"edits\\\":[],\\\"id\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2017-07-12T21:43:28.409Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"SLATE\\\"}\",\n      \"type\": \"THREAD\"\n    },\n    {\n      \"id\": \"4fbdc540-2ad9-4d6b-8404-736e658be9f9\",\n      \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"block\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"text\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"Bla\\\\\\\"}]}]}\\\",\\\"title\\\":\\\"Bla\\\"},\\\"createdAt\\\":\\\"2017-07-12T21:47:32.170Z\\\",\\\"creatorId\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"edits\\\":[],\\\"id\\\":\\\"4fbdc540-2ad9-4d6b-8404-736e658be9f9\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2017-07-12T21:47:32.170Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"SLATE\\\"}\",\n      \"type\": \"THREAD\"\n    }\n  ],\n  \"event\": \"THREAD_CREATED\",\n  \"id\": \"9b5ee0a4-c889-4ae6-8ce7-78176d125717\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:47:32.277Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/THREAD_REACTION_CREATED.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T04:31:27.939Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"ef021b3b-c520-4133-8749-e96252eff5fc\",\n    \"payload\": \"{\\\"attachments\\\":[],\\\"channelId\\\":\\\"0961e72c-087f-4e80-a5d6-3714022094c2\\\",\\\"communityId\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"content\\\":{\\\"body\\\":\\\"{\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"block\\\\\\\",\\\\\\\"type\\\\\\\":\\\\\\\"line\\\\\\\",\\\\\\\"nodes\\\\\\\":[{\\\\\\\"kind\\\\\\\":\\\\\\\"text\\\\\\\",\\\\\\\"text\\\\\\\":\\\\\\\"\\\\\\\"}]}]}\\\",\\\"title\\\":\\\"New thread by @mxstbr\\\"},\\\"createdAt\\\":\\\"2017-07-12T21:43:28.409Z\\\",\\\"creatorId\\\":\\\"gVk5mYwccUOEKiN5vtOouqroGKo1\\\",\\\"edits\\\":[],\\\"id\\\":\\\"ef021b3b-c520-4133-8749-e96252eff5fc\\\",\\\"isLocked\\\":false,\\\"isPublished\\\":true,\\\"lastActive\\\":\\\"2017-07-12T21:43:50.279Z\\\",\\\"modifiedAt\\\":null,\\\"type\\\":\\\"SLATE\\\"}\",\n    \"type\": \"THREAD\"\n  },\n  \"createdAt\": \"2017-07-12T21:43:50.399Z\",\n  \"entities\": [\n    {\n      \"id\":  \"343d0e33-8010-4d45-b1d7-bb7d14cd5ed5\",\n      \"payload\":  \"{\\\"createdAt\\\":1529543590050,\\\"deletedAt\\\":\\\"2018-06-21T01:15:49.678Z\\\",\\\"id\\\":\\\"343d0e33-8010-4d45-b1d7-bb7d14cd5ed5\\\",\\\"threadId\\\":\\\"5e333eab-6a46-4a9d-b270-0d3cad8114d0\\\",\\\"type\\\":\\\"like\\\",\\\"userId\\\":\\\"01p2A7kDCWUjGj6zQLlMQUOSQL42\\\"}\",\n      \"type\":  \"THREAD_REACTION\"\n    }\n  ],\n  \"event\": \"THREAD_REACTION_CREATED\",\n  \"id\": \"eb3464c9-e533-43ba-a913-924429bfe7a2\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:43:50.399Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/fixtures/USER_JOINED_COMMUNITY.json",
    "content": "{\n  \"actors\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:48:01.476Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"context\": {\n    \"id\": \"a719409a-3964-49f6-a570-edfe9db641a9\",\n    \"payload\": \"{\\\"coverPhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/cover-peach.png\\\",\\\"createdAt\\\":\\\"2017-07-12T01:22:05.834Z\\\",\\\"description\\\":\\\"Test\\\",\\\"id\\\":\\\"a719409a-3964-49f6-a570-edfe9db641a9\\\",\\\"name\\\":\\\"Test\\\",\\\"profilePhoto\\\":\\\"https://s3.amazonaws.com/spectrum-chat/default_images/profile-peach.png\\\",\\\"slug\\\":\\\"test\\\",\\\"website\\\":\\\"\\\"}\",\n    \"type\": \"COMMUNITY\"\n  },\n  \"createdAt\": \"2017-07-12T21:48:05.875Z\",\n  \"entities\": [\n    {\n      \"id\": \"41f5151f-7309-4c95-b2af-d45ea2b0ad82\",\n      \"payload\": \"{\\\"createdAt\\\":\\\"2017-07-09T21:47:15.354Z\\\",\\\"email\\\":\\\"vutpaisawesome@gmail.com\\\",\\\"fbProviderId\\\":null,\\\"githubProviderId\\\":null,\\\"googleProviderId\\\":null,\\\"id\\\":\\\"41f5151f-7309-4c95-b2af-d45ea2b0ad82\\\",\\\"isOnline\\\":true,\\\"lastSeen\\\":\\\"2017-07-12T21:48:01.476Z\\\",\\\"name\\\":\\\"Max Stoiber\\\",\\\"profilePhoto\\\":\\\"https://pbs.twimg.com/profile_images/802074607222132736/G_LVLtD7_normal.jpg\\\",\\\"providerId\\\":\\\"3195884567\\\",\\\"timezone\\\":-420,\\\"username\\\":\\\"mstoiber05\\\"}\",\n      \"type\": \"USER\"\n    }\n  ],\n  \"event\": \"USER_JOINED_COMMUNITY\",\n  \"id\": \"aee9ec57-f51b-43c4-b909-559a2cb24f46\",\n  \"isRead\": false,\n  \"isSeen\": false,\n  \"modifiedAt\": \"2017-07-12T21:48:05.875Z\",\n  \"userId\": \"gVk5mYwccUOEKiN5vtOouqroGKo1\"\n}"
  },
  {
    "path": "shared/test/get-mentions.test.js",
    "content": "// @flow\nimport getMentions from '../get-mentions';\n\nit('should return a mention', () => {\n  expect(getMentions('Hey @mxstbr whassup')).toEqual(['mxstbr']);\n});\n\nit('should return multiple mentions', () => {\n  expect(getMentions('Hey @mxstbr @bryn whassup')).toEqual(['mxstbr', 'bryn']);\n});\n\nit('should remove duplicate mentions', () => {\n  expect(getMentions('Hey @mxstbr @bryn @mxstbr whassup')).toEqual([\n    'mxstbr',\n    'bryn',\n  ]);\n});\n\nit('should work at the beginning of a string', () => {\n  expect(getMentions('@mxstbr whassup')).toEqual(['mxstbr']);\n});\n\nit('should work at the end of a string', () => {\n  expect(getMentions('Hey @bryn')).toEqual(['bryn']);\n});\n\nit('should ignore commas after mentions', () => {\n  expect(getMentions('Hey @bryn, whassup?')).toEqual(['bryn']);\n});\n\nit('should match underscores', () => {\n  expect(getMentions('Hey @brian_lovin whassup')).toEqual(['brian_lovin']);\n});\n\nit('should match minusses', () => {\n  expect(getMentions('Hey @brian-lovin whassup')).toEqual(['brian-lovin']);\n});\n\nit('should ignore parenthesis before mentions', () => {\n  expect(getMentions('It is Bryn! (@bryn look)')).toEqual(['bryn']);\n});\n\nit('should match mention in Japanese', () => {\n  expect(getMentions('の@mxstbrに到着を待っている')).toEqual(['mxstbr']);\n});\n\nit('should extract mention before newline', () => {\n  expect(getMentions('@mxstbr\\n@bryn')).toEqual(['mxstbr', 'bryn']);\n});\n\nit('should not extract username from medium link with @', () => {\n  expect(\n    getMentions(\n      'https://medium.com/@probablyup/introducing-buttermilk-fc0b8c6d92af'\n    )\n  ).toEqual([]);\n});\n\nit('should extract username after link ending in /', () => {\n  expect(\n    getMentions(\n      'https://medium.com/@probablyup/introducing-buttermilk-fc0b8c6d92af/ @bryn'\n    )\n  ).toEqual(['bryn']);\n});\n\ndescribe.skip('failing tests', () => {\n  it('should not extract username preceded by !', () => {\n    expect(getMentions('f!@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by @', () => {\n    expect(getMentions('f@@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by #', () => {\n    expect(getMentions('f#@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by $', () => {\n    expect(getMentions('f$@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by %', () => {\n    expect(getMentions('f%@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by &', () => {\n    expect(getMentions('f&@kn')).toEqual([]);\n  });\n\n  it('should not extract username preceded by *', () => {\n    expect(getMentions('f*@kn')).toEqual([]);\n  });\n\n  it('should not extract username ending in @', () => {\n    expect(getMentions('Current Status: @_@ (cc: @bryn)')).toEqual(['bryn']);\n  });\n});\n"
  },
  {
    "path": "shared/test/normalize-url.test.js",
    "content": "// @flow\nimport normalizeUrl from '../normalize-url';\n\ntype Input = string;\ntype Output = string;\n\n// If only Input is provided it tests for input === output\ntype TestCase = [Input, Output];\n\ntype TestCases = {\n  [testName: string]: TestCase,\n};\n\nconst testCases: TestCases = {\n  'should do nothing to https URLs': [\n    'https://github.com',\n    'https://github.com',\n  ],\n  'should do nothing to http URLs': ['http://github.com', 'http://github.com'],\n  'should add https:// in front of URLs without protocol': [\n    'github.com',\n    'https://github.com',\n  ],\n  'should block malicious links': [\n    'javascript:alert(document.cookie)',\n    'about:blank',\n  ],\n};\n\nObject.keys(testCases).forEach(name => {\n  it(name, () => {\n    expect(normalizeUrl(testCases[name][0])).toEqual(testCases[name][1]);\n  });\n});\n"
  },
  {
    "path": "shared/testing/data.js",
    "content": "// @flow\nconst seed = require('../../api/migrations/seed/default/index');\n\nconst {\n  defaultUsers,\n  defaultUsersSettings,\n  defaultCommunities,\n  defaultCommunitySettings,\n  defaultChannels,\n  defaultChannelSettings,\n  defaultThreads,\n  defaultNotifications,\n  defaultUsersNotifications,\n  defaultDirectMessageThreads,\n  defaultUsersDirectMessageThreads,\n  defaultUsersCommunities,\n  defaultUsersChannels,\n  defaultMessages,\n  defaultUsersThreads,\n  defaultReactions,\n} = seed;\n\nconst data = {\n  users: defaultUsers,\n  usersSettings: defaultUsersSettings,\n  communities: defaultCommunities,\n  communitySettings: defaultCommunitySettings,\n  channels: defaultChannels,\n  channelSettings: defaultChannelSettings,\n  threads: defaultThreads,\n  usersThreads: defaultUsersThreads,\n  notifications: defaultNotifications,\n  directMessageThreads: defaultDirectMessageThreads,\n  usersDirectMessageThreads: defaultUsersDirectMessageThreads,\n  usersCommunities: defaultUsersCommunities,\n  usersChannels: defaultUsersChannels,\n  messages: defaultMessages,\n  reactions: defaultReactions,\n  usersNotifications: defaultUsersNotifications,\n};\n\nmodule.exports = data;\n"
  },
  {
    "path": "shared/testing/db.js",
    "content": "// @flow\nmodule.exports = require('rethinkhaberdashery')({\n  db: 'testing',\n});\n"
  },
  {
    "path": "shared/testing/empty-db.js",
    "content": "import data from './data';\nimport db from './db';\nconst tables = Object.keys(data);\n\n/**\n * This is run after all tests\n */\nexport const empty = db => {\n  // Create the tables\n  return Promise.all(\n    tables.map(table =>\n      db\n        .table(table)\n        .delete()\n        .run()\n    )\n  ).catch(err => {\n    console.log(err);\n    throw err;\n  });\n};\n\nempty(db).then(() => process.exit());\n"
  },
  {
    "path": "shared/testing/setup-test-framework.js",
    "content": "const mockDb = require('./db');\n\n// Wait for 15s before timing out, this is useful for e2e tests which have a tendency to time out\njest.setTimeout(30000);\n\n// Mock the database\njest.mock('shared/db/db', () => ({\n  db: mockDb,\n}));\n"
  },
  {
    "path": "shared/testing/setup.js",
    "content": "// This script gets run once before all tests\n// It's responsible for setting up the test db with the test data\nconst path = require('path');\nconst debug = require('debug')('testing:setup');\nconst { migrate } = require('rethinkdb-migrate/lib');\n\nconst mockDb = require('./db');\nconst data = require('./data');\n\nconst tables = Object.keys(data);\n\nmodule.exports = async () => {\n  debug(`run all migrations over database \"testing\"`);\n  await migrate({\n    driver: 'rethinkdbdash',\n    host: 'localhost',\n    port: 28015,\n    migrationsDirectory: path.resolve(__dirname, '../../api/migrations'),\n    db: 'testing',\n    op: 'up',\n  });\n\n  debug(`migrations complete, inserting data into \"testing\"`);\n  await Promise.all(\n    tables.map(table =>\n      mockDb\n        .table(table)\n        .insert(data[table], { conflict: 'replace' })\n        .run()\n    )\n  );\n\n  debug(`setup complete`);\n};\n"
  },
  {
    "path": "shared/testing/teardown.js",
    "content": "// This script gets run once after all tests\n// It's responsible for clearing the test database\n// NOTE(@mxstbr): While this teardown script could also do mockDb.dbDrop('testing'), that would mean that our API server would crash everytime due to changefeeds dropping, which would be very annoying. Instead we just clear the data from all the tables.\nconst debug = require('debug')('testing:teardown');\nconst mockDb = require('./db');\nconst data = require('./data');\n\nconst tables = Object.keys(data);\n\nmodule.exports = () => {\n  debug(`clearing data in database \"testing\"`);\n  return Promise.all(\n    tables.map(table =>\n      mockDb\n        .table(table)\n        .delete()\n        .run()\n    )\n  );\n};\n"
  },
  {
    "path": "shared/theme/index.js",
    "content": "// @flow\nexport const theme = {\n  bg: {\n    default: '#FFFFFF',\n    reverse: '#16171A',\n    wash: '#FAFAFA',\n    divider: '#F6F7F8',\n    border: '#EBECED',\n    inactive: '#DFE7EF',\n  },\n  brand: {\n    default: '#4400CC',\n    alt: '#7B16FF',\n    wash: '#E8E5FF',\n    border: '#DDD9FF',\n    dark: '#2A0080',\n  },\n  generic: {\n    default: '#E6ECF7',\n    alt: '#F6FBFC',\n  },\n  social: {\n    facebook: {\n      default: '#3B5998',\n      alt: '#5A85DF',\n    },\n    twitter: {\n      default: '#00ACED',\n      alt: '#53D0FF',\n    },\n    google: {\n      default: '#ea4335',\n      alt: '#ea4335',\n    },\n    github: {\n      default: '#16171A',\n      alt: '#828C99',\n    },\n    ph: {\n      default: '#D85537',\n      alt: '#D85537',\n    },\n  },\n  space: {\n    default: '#0062D6',\n    alt: '#1CD2F2',\n    wash: '#E5F0FF',\n    border: '#BDD8FF',\n    dark: '#0F015E',\n  },\n  special: {\n    default: '#E58306',\n    alt: '#F1C742',\n    dark: '#7D4A00',\n    wash: '#FFF5E5',\n    border: '#FFE6BF',\n  },\n  success: {\n    default: '#00B88B',\n    alt: '#00D5BD',\n    dark: '#00663C',\n    wash: '#D9FFF2',\n    border: '#9FF5D9',\n  },\n  text: {\n    default: '#24292E',\n    secondary: '#384047',\n    alt: '#67717A',\n    placeholder: '#7C8894',\n    reverse: '#FFFFFF',\n  },\n  warn: {\n    default: '#E22F2F',\n    alt: '#E2197A',\n    dark: '#85000C',\n    wash: '#FFEDF6',\n    border: '#FFCCE5',\n  },\n  ios: {\n    red: '#FF3B30',\n    orange: '#FF9500',\n    yellow: '#FFCC00',\n    green: '#4CD964',\n    tealBlue: '#5AC8FA',\n    blue: '#007AFF',\n    purple: '#5856D6',\n    pink: '#FF2D55',\n  },\n};\n\nexport default theme;\n"
  },
  {
    "path": "shared/time-difference.js",
    "content": "// @flow\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = 60000;\nconst MS_PER_HOUR = 3600000;\nconst MS_PER_DAY = 86400000;\nconst MS_PER_YEAR = 31536000000;\n\nexport function timeDifferenceShort(current: number, previous: number) {\n  const elapsed = current - previous;\n\n  if (elapsed < MS_PER_MINUTE) {\n    return Math.round(elapsed / MS_PER_SECOND) + 's';\n  } else if (elapsed < MS_PER_HOUR) {\n    return Math.round(elapsed / MS_PER_MINUTE) + 'm';\n  } else if (elapsed < MS_PER_DAY) {\n    return Math.round(elapsed / MS_PER_HOUR) + 'h';\n  } else if (elapsed < MS_PER_YEAR) {\n    return Math.round(elapsed / MS_PER_DAY) + 'd';\n  } else {\n    return Math.round(elapsed / MS_PER_YEAR) + 'y';\n  }\n}\n\nexport function timeDifference(current: number, previous: ?number): string {\n  if (!previous) return '';\n\n  const msPerMinute = 60 * 1000;\n  const msPerHour = msPerMinute * 60;\n  const msPerDay = msPerHour * 24;\n  const msPerMonth = msPerDay * 30;\n  const msPerYear = msPerDay * 365;\n\n  let elapsed = current - previous;\n\n  if (elapsed < msPerMinute) {\n    return 'Just now';\n  } else if (elapsed < msPerHour) {\n    const now = Math.round(elapsed / msPerMinute);\n    if (now === 1) {\n      return '1 minute ago';\n    } else {\n      return `${now} minutes ago`;\n    }\n  } else if (elapsed < msPerDay) {\n    const now = Math.round(elapsed / msPerHour);\n    if (now === 1) {\n      return '1 hour ago';\n    } else {\n      return `${now} hours ago`;\n    }\n  } else if (elapsed < msPerMonth) {\n    const now = Math.round(elapsed / msPerDay);\n    if (now === 1) {\n      return 'Yesterday';\n    } else if (now >= 7 && now <= 13) {\n      return '1 week ago';\n    } else if (now >= 14 && now <= 20) {\n      return '2 weeks ago';\n    } else if (now >= 21 && now <= 28) {\n      return '3 weeks ago';\n    } else {\n      return `${now} days ago`;\n    }\n  } else if (elapsed < msPerYear) {\n    const now = Math.round(elapsed / msPerMonth);\n    if (now === 1) {\n      return '1 month ago';\n    } else {\n      return `${now} months ago`;\n    }\n  } else {\n    const now = Math.round(elapsed / msPerYear);\n    if (now === 1) {\n      return '1 year ago';\n    } else {\n      return `${now} years ago`;\n    }\n  }\n}\n"
  },
  {
    "path": "shared/time-formatting.js",
    "content": "// @flow\n\nexport const convertTimestampToDate = (timestamp: number) => {\n  let monthNames = [\n    'January',\n    'February',\n    'March',\n    'April',\n    'May',\n    'June',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December',\n  ];\n  let date = new Date(timestamp);\n  let day = date.getDate();\n  let monthIndex = date.getMonth();\n  let month = monthNames[monthIndex];\n  let year = date.getFullYear();\n  let hours = date.getHours() || 0;\n  let cleanHours;\n  if (hours === 0) {\n    cleanHours = 12; // if timestamp is between midnight and 1am, show 12:XX am\n  } else {\n    cleanHours = hours > 12 ? hours - 12 : hours; // else show proper am/pm -- todo: support 24hr time\n  }\n  let minutes = date.getMinutes();\n  minutes = minutes >= 10 ? minutes : '0' + minutes.toString(); // turns 4 minutes into 04 minutes\n  let ampm = hours >= 12 ? 'pm' : 'am'; // todo: support 24hr time\n  return `${month} ${day}, ${year} at ${cleanHours}:${minutes}${ampm}`;\n};\n\nexport const convertTimestampToTime = (timestamp: Date) => {\n  let date = new Date(timestamp);\n  let hours = date.getHours() || 0;\n  let cleanHours;\n  if (hours === 0) {\n    cleanHours = 12; // if timestamp is between midnight and 1am, show 12:XX am\n  } else {\n    cleanHours = hours > 12 ? hours - 12 : hours; // else show proper am/pm -- todo: support 24hr time\n  }\n  let minutes = date.getMinutes();\n  minutes = minutes >= 10 ? minutes : '0' + minutes.toString(); // turns 4 minutes into 04 minutes\n  let ampm = hours >= 12 ? 'pm' : 'am'; // todo: support 24hr time\n  return `${cleanHours}:${minutes}${ampm}`;\n};\n"
  },
  {
    "path": "shared/truncate.js",
    "content": "// @flow\n/**\n * This file is shared between server and client.\n * ⚠️ DON'T PUT ANY NODE.JS OR BROWSER-SPECIFIC CODE IN HERE ⚠️\n *\n * Note: This uses Flow comment syntax so this whole file is actually valid JS without any transpilation\n * The reason I did that is because create-react-app doesn't transpile files outside the source folder,\n * so it chokes on the Flow syntax.\n * More info: https://flow.org/en/docs/types/comments/\n */\n\n// Truncate a string nicely to a certain length\nfunction truncate(str /*: string */, length /*: number */) {\n  if (str.length <= length) {\n    return str;\n  }\n  var subString = str.substr(0, length);\n\n  // if the title doesn't have any spaces in it, just break at the normal length\n  if (subString.indexOf(' ') < 0) return subString + '…';\n\n  // if the title has a space character, attempt to break between words\n  return (\n    subString.substr(0, subString.lastIndexOf(' ')).replace(/\\n/, ' ') + '…'\n  );\n}\n\nmodule.exports = truncate;\n"
  },
  {
    "path": "shared/truthy-values.js",
    "content": "// @flow\nexport const getTruthyValuesFromObject = (object: Object): Array<?string> => {\n  if (!object) return [];\n  try {\n    return Object.keys(object).filter(key => object[key] === true);\n  } catch (err) {\n    return [];\n  }\n};\n"
  },
  {
    "path": "shared/types.js",
    "content": "// @flow\n/*\n\n  The purpose of this is file is to share flowtypes of our database records across\n  API and our workers. When type checking results directly from a database query,\n  attempt to use or update the types here\n\n*/\nimport type { MessageType } from 'shared/draft-utils/message-types';\n\nexport type DBChannel = {\n  communityId: string,\n  createdAt: Date,\n  deletedAt?: Date,\n  deletedBy?: string,\n  description: string,\n  id: string,\n  isDefault: boolean,\n  isPrivate: boolean,\n  name: string,\n  slug: string,\n  archivedAt?: Date,\n  memberCount: number,\n};\n\nexport type DBCommunity = {\n  coverPhoto: string,\n  createdAt: Date,\n  description: string,\n  id: string,\n  name: string,\n  profilePhoto: string,\n  slug: string,\n  website?: ?string,\n  deletedAt?: Date,\n  deletedBy?: string,\n  pinnedThreadId?: string,\n  watercoolerId?: string,\n  creatorId: string,\n  administratorEmail: ?string,\n  pendingAdministratorEmail?: string,\n  isPrivate: boolean,\n  memberCount: number,\n};\n\nexport type DBCommunitySettings = {\n  id: string,\n  communityId: string,\n  slackSettings: ?{\n    connectedAt: ?string,\n    connectedBy: ?string,\n    invitesSentAt: ?string,\n    teamName: ?string,\n    teamId: ?string,\n    scope: ?string,\n    token: ?string,\n    invitesMemberCount: ?string,\n    invitesCustomMessage: ?string,\n  },\n  joinSettings: {\n    tokenJoinEnabled: boolean,\n    token: ?string,\n  },\n};\n\nexport type DBChannelSettings = {\n  id: string,\n  channelId: string,\n  joinSettings?: {\n    tokenJoinEnabled: boolean,\n    token: string,\n  },\n  slackSettings?: {\n    botLinks: {\n      threadCreated: ?string,\n    },\n  },\n};\n\nexport type DBCuratedContent = {\n  type: string,\n  id: string,\n  data: any,\n};\n\nexport type DBDirectMessageThread = {\n  createdAt: Date,\n  id: string,\n  name?: string,\n  threadLastActive: Date,\n};\n\ntype DBMessageEdits = {\n  content: {\n    body: string,\n  },\n  timestamp: string,\n};\n\nexport type DBMessage = {\n  content: {\n    body: string,\n  },\n  id: string,\n  messageType: MessageType,\n  senderId: string,\n  deletedAt?: Date,\n  deletedBy?: string,\n  threadId: string,\n  threadType: 'story' | 'directMessageThread',\n  timestamp: Date,\n  parentId?: string,\n  edits?: Array<DBMessageEdits>,\n  modifiedAt?: string,\n};\n\nexport type NotificationPayloadType =\n  | 'REACTION'\n  | 'THREAD_REACTION'\n  | 'MESSAGE'\n  | 'THREAD'\n  | 'CHANNEL'\n  | 'COMMUNITY'\n  | 'USER'\n  | 'DIRECT_MESSAGE_THREAD';\n\nexport type NotificationEventType =\n  | 'REACTION_CREATED'\n  | 'THREAD_REACTION_CREATED'\n  | 'MESSAGE_CREATED'\n  | 'THREAD_CREATED'\n  | 'CHANNEL_CREATED'\n  | 'DIRECT_MESSAGE_THREAD_CREATED'\n  | 'USER_JOINED_COMMUNITY'\n  | 'USER_REQUESTED_TO_JOIN_PRIVATE_CHANNEL'\n  | 'USER_APPROVED_TO_JOIN_PRIVATE_CHANNEL'\n  | 'THREAD_LOCKED_BY_OWNER'\n  | 'THREAD_DELETED_BY_OWNER'\n  | 'COMMUNITY_INVITE'\n  | 'MENTION_THREAD'\n  | 'MENTION_MESSAGE'\n  | 'PRIVATE_CHANNEL_REQUEST_SENT'\n  | 'PRIVATE_CHANNEL_REQUEST_APPROVED'\n  | 'PRIVATE_COMMUNITY_REQUEST_SENT'\n  | 'PRIVATE_COMMUNITY_REQUEST_APPROVED';\n\ntype NotificationPayload = {\n  id: string,\n  payload: string,\n  type: NotificationPayloadType,\n};\nexport type DBNotification = {\n  id: string,\n  actors: Array<NotificationPayload>,\n  context: NotificationPayload,\n  createdAt: Date,\n  entities: Array<NotificationPayload>,\n  event: NotificationEventType,\n  modifiedAt: Date,\n};\n\ntype ReactionType = 'like';\nexport type DBReaction = {\n  id: string,\n  messageId: string,\n  timestamp: Date,\n  type: ReactionType,\n  userId: string,\n};\n\nexport type DBThreadReaction = {\n  id: string,\n  threadId: string,\n  createdAt: Date,\n  type: ReactionType,\n  deletedAt?: Date,\n  score?: number,\n  scoreUpdatedAt?: Date,\n  userId: string,\n};\n\nexport type DBReputationEvent = {\n  communityId: string,\n  id: string,\n  score: number,\n  timestamp: Date,\n  type: string,\n  userId: string,\n};\n\ntype DBThreadAttachment = {\n  attachmentType: 'photoPreview',\n  data: {\n    name: string,\n    type: string,\n    url: string,\n  },\n};\n\ntype DBThreadEdits = {\n  attachment?: {\n    photos: Array<DBThreadAttachment>,\n  },\n  content: {\n    body?: any,\n    title: string,\n  },\n  timestamp: Date,\n};\n\nexport type DBThread = {\n  id: string,\n  channelId: string,\n  communityId: string,\n  content: {\n    body?: any,\n    title: string,\n  },\n  createdAt: Date,\n  creatorId: string,\n  isPublished: boolean,\n  isLocked: boolean,\n  lockedBy?: string,\n  lockedAt?: Date,\n  editedBy?: string,\n  lastActive: Date,\n  modifiedAt?: Date,\n  deletedAt?: string,\n  deletedBy: ?string,\n  attachments?: Array<DBThreadAttachment>,\n  edits?: Array<DBThreadEdits>,\n  watercooler?: boolean,\n  messageCount: number,\n  reactionCount: number,\n  type: string,\n};\n\nexport type DBUser = {\n  id: string,\n  email?: string,\n  createdAt: string,\n  name: string,\n  coverPhoto: string,\n  profilePhoto: string,\n  providerId?: ?string,\n  githubProviderId?: ?string,\n  githubUsername?: ?string,\n  fbProviderId?: ?string,\n  googleProviderId?: ?string,\n  username: ?string,\n  timezone?: ?number,\n  description?: ?string,\n  website?: ?string,\n  modifiedAt: ?string,\n  betaSupporter?: boolean,\n};\n\nexport type DBUsersChannels = {\n  id: string,\n  channelId: string,\n  createdAt: Date,\n  isBlocked: boolean,\n  isMember: boolean,\n  isModerator: boolean,\n  isOwner: boolean,\n  isPending: boolean,\n  receiveNotifications: boolean,\n  userId: string,\n};\n\nexport type DBUsersCommunities = {\n  id: string,\n  communityId: string,\n  createdAt: Date,\n  isBlocked: boolean,\n  isMember: boolean,\n  isModerator: boolean,\n  isOwner: boolean,\n  isPending: boolean,\n  receiveNotifications: boolean,\n  userId: string,\n};\n\nexport type DBUsersDirectMessageThreads = {\n  id: string,\n  createdAt: Date,\n  receiveNotifications: boolean,\n  threadId: string,\n  userId: string,\n};\n\nexport type DBUsersNotifications = {\n  id: string,\n  createdAt: Date,\n  entityAddedAt: Date,\n  isRead: boolean,\n  isSeen: boolean,\n  notificationId: string,\n  userId: string,\n};\n\nexport type DBNotificationsJoin = {\n  ...$Exact<DBUsersNotifications>,\n  ...$Exact<DBNotification>,\n};\n\ntype NotificationSetting = { email: boolean };\nexport type DBUsersSettings = {\n  id: string,\n  userId: string,\n  notifications: {\n    types: {\n      dailyDigest: NotificationSetting,\n      newDirectMessage: NotificationSetting,\n      newMessageInThreads: NotificationSetting,\n      newThreadCreated: NotificationSetting,\n      weeklyDigest: NotificationSetting,\n      newMention: NotificationSetting,\n    },\n  },\n};\n\nexport type DBUsersThreads = {\n  id: string,\n  createdAt: Date,\n  isParticipant: boolean,\n  receiveNotifications: boolean,\n  threadId: string,\n  userId: string,\n};\n\nexport type DBExpoPushSubscription = {\n  id: string,\n  token: string,\n  userId: string,\n};\n\nexport type FileUpload = {\n  filename: string,\n  mimetype: string,\n  encoding: string,\n  stream: any,\n};\n\nexport type EntityTypes = 'communities' | 'channels' | 'users' | 'threads';\n\nexport type DBCoreMetric = {\n  dau: number,\n  wau: number,\n  mau: number,\n  dac: number,\n  dacSlugs: Array<string>,\n  wac: number,\n  wacSlugs: Array<string>,\n  mac: number,\n  macSlugs: Array<string>,\n  cpu: number,\n  mpu: number,\n  tpu: number,\n  users: number,\n  communities: number,\n  threads: number,\n  dmThreads: number,\n};\n"
  },
  {
    "path": "shared/unique-elements.js",
    "content": "// @flow\n// Get unique elements in an array, even if they're complex like nested arrays or objects\n// NOTE: Uses ES6 Set, so DO NOT USE on the frontend\n\nconst unique = (array: Array<mixed>): Array<mixed> => {\n  if (array.length <= 1) return array;\n\n  // Turn all elements into strings, including arrays\n  const stringElements = array.map(key => JSON.stringify(key));\n\n  // Get the unique elements by using an ES6 Set\n  const uniqueElements = [...new Set(stringElements)];\n\n  // Turn the non-string elements back into non-strings\n  return uniqueElements.map(key => {\n    // If it's e.g. an array, this will return the original array\n    try {\n      return JSON.parse(key);\n    } catch (err) {\n      // Oh, it was a string after all, let's just return that.\n      return key;\n    }\n  });\n};\n\nexport default unique;\n"
  },
  {
    "path": "spectrum-tmuxp.yaml",
    "content": "session_name: spectrum\nstart_directory: ./\nwindows:\n  - window_name: dev\n    layout: main-vertical\n    focus: true\n    panes:\n      - vim\n      - echo \"Development here\"\n  - window_name: servers\n    layout: tiled\n    panes:\n      - yarn run dev:api\n      - yarn run dev:web\n"
  },
  {
    "path": "src/actions/authentication.js",
    "content": "export const logout = () => {\n  import('shared/graphql')\n    .then(module => module.clearApolloStore)\n    .then(clearApolloStore => {\n      // clear Apollo's query cache\n      clearApolloStore();\n      // redirect to home page\n      window.location.href =\n        process.env.NODE_ENV === 'production'\n          ? '/auth/logout'\n          : 'http://localhost:3001/auth/logout';\n    });\n};\n\nexport const setTrackingContexts = async (user: ?GetUserType) => {\n  if (!user || !user.id) return logout();\n\n  // get an anonymized userId for Sentry\n  const response = await fetch(\n    `https://anonymize.spectrum.chat/api/anonymize?text=${user.id}`\n  );\n  const { text: id } = await response.json();\n  return await setRavenUserContext(id);\n};\n\nexport const setRavenUserContext = (id: string) => {\n  // logs the user id to Sentry\n  // if Raven hasn't loaded yet, try every 5s until it's loaded\n  if (window.Raven) {\n    return window.Raven.setUserContext({ id });\n  } else {\n    const interval = setInterval(() => {\n      if (window.Raven) {\n        window.Raven.setUserContext({ id });\n        clearInterval(interval);\n        return;\n      }\n    }, 5000);\n  }\n};\n"
  },
  {
    "path": "src/actions/directMessageThreads.js",
    "content": "export const initNewThreadWithUser = (user: Object) => {\n  return {\n    type: 'ADD_USERS_DIRECT_MESSAGES_COMPOSER',\n    payload: user,\n  };\n};\n\nexport const clearDirectMessagesComposer = () => {\n  return {\n    type: 'CLEAR_DIRECT_MESSAGES_COMPOSER',\n  };\n};\n"
  },
  {
    "path": "src/actions/gallery.js",
    "content": "//@flow\n\n/**\n * Open the gallery at a certain image\n */\nexport const openGallery = (threadId: string, messageId: string) => {\n  return {\n    type: 'SHOW_GALLERY',\n    isOpen: true,\n    threadId,\n    messageId,\n  };\n};\n\nexport const closeGallery = () => {\n  return {\n    type: 'HIDE_GALLERY',\n  };\n};\n"
  },
  {
    "path": "src/actions/modals.js",
    "content": "// @flow\nimport type { ModalTypes } from 'src/components/modals/modalRoot';\n\nexport const openModal = (name: ModalTypes, props?: Object) => {\n  return {\n    type: 'SHOW_MODAL',\n    modalType: name,\n    modalProps: props || {},\n  };\n};\n\nexport const closeModal = () => ({\n  type: 'HIDE_MODAL',\n});\n"
  },
  {
    "path": "src/actions/threadSlider.js",
    "content": "// @flow\n\nexport const openThreadSlider = (threadId: string) => {\n  return {\n    type: 'OPEN_SLIDER',\n    threadId,\n  };\n};\n\nexport const closeThreadSlider = () => ({\n  type: 'CLOSE_SLIDER',\n});\n"
  },
  {
    "path": "src/actions/titlebar.js",
    "content": "// @flow\nimport type { TitlebarPayloadProps } from 'src/views/globalTitlebar';\n\nexport const setTitlebarProps = (payload: TitlebarPayloadProps) => {\n  return {\n    type: 'SET_TITLEBAR_PROPS',\n    payload,\n  };\n};\n"
  },
  {
    "path": "src/actions/toasts.js",
    "content": "// @flow\nimport type { Dispatch } from 'redux';\ntype Toasts = 'success' | 'error' | 'neutral' | 'notification';\n\nconst addToast = (\n  id: number,\n  kind: Toasts,\n  message: string,\n  timeout?: number\n) => {\n  return {\n    type: 'ADD_TOAST',\n    payload: {\n      id,\n      kind,\n      message,\n      timeout,\n    },\n  };\n};\n\nconst removeToast = (id: number) => {\n  return { type: 'REMOVE_TOAST', id };\n};\n\nlet nextToastId = 0;\nexport const addToastWithTimeout = (kind: Toasts, message: string) => (\n  dispatch: Dispatch<Object>\n) => {\n  let timeout = 6000;\n  if (kind === 'success') timeout = 3000;\n  if (kind === 'notification') timeout = 5000;\n\n  let id = nextToastId++;\n  dispatch(addToast(id, kind, message, timeout));\n\n  setTimeout(() => {\n    dispatch(removeToast(id));\n    id = nextToastId--;\n  }, timeout);\n};\n"
  },
  {
    "path": "src/api/constants.js",
    "content": "// @flow\nexport const IS_PROD = process.env.NODE_ENV === 'production';\n\nexport const SERVER_URL = IS_PROD\n  ? // In production we want to redirect to /whatever\n    ``\n  : // In development we gotta redirect to localhost:3001/whatever tho\n    'http://localhost:3001';\n\nexport const CLIENT_URL = IS_PROD\n  ? `${window.location.protocol}//${window.location.host}`\n  : 'http://localhost:3000';\n"
  },
  {
    "path": "src/components/announcementBanner/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Icon from 'src/components/icon';\nimport { Bar, Content } from './style';\nclass Banner extends React.Component<{}> {\n  render() {\n    return (\n      <Bar>\n        <Content>\n          <Icon glyph=\"announcement\" size=\"24\" />\n          <p>\n            Spectrum is now read-only. Learn more about the decision in our{' '}\n            <a\n              href={\n                'https://spectrum.chat/spectrum/general/join-us-on-our-new-journey~e4ca0386-f15c-4ba8-8184-21cf5fa39cf5'\n              }\n            >\n              official announcement\n            </a>\n            .\n          </p>\n        </Content>\n      </Bar>\n    );\n  }\n}\n\nexport default Banner;\n"
  },
  {
    "path": "src/components/announcementBanner/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\n\nexport const Bar = styled.div`\n  display: flex;\n  background: ${theme.brand.wash};\n  align-items: center;\n  border-bottom: 1px solid ${theme.brand.border};\n  color: ${theme.brand.default};\n  font-size: 14px;\n  font-weight: 400;\n  padding: 0 8px 0 0;\n  justify-content: center;\n  flex: 0 0 48px;\n  max-height: 48px;\n`;\n\nexport const Content = styled.div`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  line-height: 1.2;\n  padding: 12px 0;\n  flex: 1 0 auto;\n  a {\n    text-decoration: underline;\n    font-weight: 600;\n  }\n  .icon {\n    margin-right: 8px;\n  }\n  @media (max-width: 768px) {\n    justify-content: flex-start;\n    padding-left: 12px;\n    flex: 1 1 auto;\n  }\n`;\n"
  },
  {
    "path": "src/components/appViewWrapper/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter, type History } from 'react-router';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { isViewingMarketingPage } from 'src/helpers/is-viewing-marketing-page';\nimport { StyledAppViewWrapper } from './style';\n\ntype Props = {\n  isModal: boolean,\n  currentUser: ?UserInfoType,\n  history: History,\n  location: Object,\n};\n\nclass AppViewWrapper extends React.Component<Props> {\n  ref: ?HTMLElement;\n  prevScrollOffset: number;\n\n  constructor(props: Props) {\n    super(props);\n    this.ref = null;\n    this.prevScrollOffset = 0;\n  }\n\n  getSnapshotBeforeUpdate(prevProps) {\n    const { isModal: currModal } = this.props;\n    const { isModal: prevModal } = prevProps;\n\n    /*\n      If the user is going to open a modal, grab the current scroll\n      offset of the main view the user is on and save it for now; we'll use\n      the value to restore the scroll position after the user closes the modal\n    */\n    if (!prevModal && currModal && this.ref) {\n      const offset = this.ref.scrollTop;\n      this.prevScrollOffset = offset;\n      return null;\n    }\n\n    if (prevModal && !currModal) {\n      // the user is closing the modal, return the previous view's scroll offset\n      return this.prevScrollOffset;\n    }\n\n    return null;\n  }\n\n  componentDidUpdate(prevProps, prevState, snapshot) {\n    /*\n      If we have a snapshot value, the user has closed a modal and we need\n      to return the user to where they were previously scrolled in the primary\n      view\n    */\n    if (snapshot !== null && this.ref) {\n      this.ref.scrollTop = snapshot;\n    }\n  }\n\n  render() {\n    const { currentUser, history, location } = this.props;\n\n    const isMarketingPage = isViewingMarketingPage(history, currentUser);\n    const isViewingExplore = location && location.pathname === '/explore';\n    const isTwoColumn = isViewingExplore || !isMarketingPage;\n\n    return (\n      <StyledAppViewWrapper\n        ref={el => (this.ref = el)}\n        isTwoColumn={isTwoColumn}\n        {...this.props}\n      />\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  withCurrentUser\n)(AppViewWrapper);\n"
  },
  {
    "path": "src/components/appViewWrapper/style.js",
    "content": "import styled from 'styled-components';\nimport {\n  MEDIA_BREAK,\n  TITLEBAR_HEIGHT,\n  NAVBAR_WIDTH,\n  NAVBAR_EXPANDED_WIDTH,\n  MIN_WIDTH_TO_EXPAND_NAVIGATION,\n} from 'src/components/layout';\n\nexport const StyledAppViewWrapper = styled.div`\n  display: grid;\n  width: 100%;\n  grid-template-columns: ${props =>\n    props.isTwoColumn ? `${NAVBAR_WIDTH}px 1fr` : '1fr'};\n  grid-template-areas: ${props =>\n    props.isTwoColumn ? \"'navigation main'\" : \"'main'\"};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-columns: 1fr;\n    grid-template-rows: ${props =>\n      props.isTwoColumn ? `${TITLEBAR_HEIGHT}px 1fr` : '1fr'};\n    grid-template-areas: ${props =>\n      props.isTwoColumn ? \"'titlebar' 'main'\" : \"'main'\"};\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    grid-template-columns: ${props =>\n      props.isTwoColumn ? `${NAVBAR_EXPANDED_WIDTH}px 1fr` : '1fr'};\n    grid-template-areas: ${props =>\n      props.isTwoColumn ? \"'navigation main'\" : \"'main'\"};\n  }\n`;\n"
  },
  {
    "path": "src/components/avatar/communityAvatar.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport AvatarImage from './image';\nimport { Container, AvatarLink } from './style';\nimport ConditionalWrap from 'src/components/conditionalWrap';\n\ntype Props = {\n  community: CommunityInfoType,\n  size?: number,\n  mobilesize?: number,\n  style?: Object,\n  showHoverProfile?: boolean,\n  isClickable?: boolean,\n};\n\nclass Avatar extends React.Component<Props> {\n  render() {\n    const {\n      community,\n      size = 32,\n      isClickable = true,\n      mobilesize,\n      style,\n    } = this.props;\n\n    const src = community.profilePhoto;\n\n    const communityFallback = '/img/default_community.svg';\n    const source = [src, communityFallback];\n\n    return (\n      <Container\n        size={size}\n        mobilesize={mobilesize}\n        style={style}\n        type={'community'}\n      >\n        <ConditionalWrap\n          condition={isClickable}\n          wrap={children => (\n            <AvatarLink to={`/${community.slug}`}>{children}</AvatarLink>\n          )}\n        >\n          <AvatarImage\n            src={source}\n            size={size}\n            mobilesize={mobilesize}\n            type={'community'}\n            alt={community.name}\n          />\n        </ConditionalWrap>\n      </Container>\n    );\n  }\n}\n\nclass AvatarHandler extends React.Component<Props> {\n  render() {\n    return <Avatar {...this.props} />;\n  }\n}\n\nexport default AvatarHandler;\n"
  },
  {
    "path": "src/components/avatar/image.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Img, FallbackImg, LoadingImg } from './style';\nimport VisibilitySensor from 'react-visibility-sensor';\n\ntype Props = {\n  src: any,\n  type: 'user' | 'community',\n  size: number,\n  mobilesize?: number,\n  isClickable?: boolean,\n  alt: string,\n};\n\nexport default class Image extends React.Component<Props> {\n  render() {\n    const { type, size, mobilesize } = this.props;\n    const { ...rest } = this.props;\n    const fallbackSrc =\n      type === 'user'\n        ? '/img/default_avatar.svg'\n        : '/img/default_community.svg';\n\n    return (\n      <VisibilitySensor>\n        <Img\n          {...rest}\n          decode={false}\n          loader={\n            <LoadingImg\n              size={size}\n              mobilesize={mobilesize}\n              type={type}\n              src={fallbackSrc}\n              alt=\"\"\n            />\n          }\n          unloader={\n            <FallbackImg\n              size={size}\n              mobilesize={mobilesize}\n              type={type}\n              src={fallbackSrc}\n              alt=\"\"\n            />\n          }\n        />\n      </VisibilitySensor>\n    );\n  }\n}\n"
  },
  {
    "path": "src/components/avatar/index.js",
    "content": "// @flow\nimport CommunityAvatar from './communityAvatar';\nimport UserAvatar from './userAvatar';\n\nexport { CommunityAvatar, UserAvatar };\n"
  },
  {
    "path": "src/components/avatar/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport ReactImage from 'react-image';\nimport { zIndex } from '../globals';\nimport { Link } from 'react-router-dom';\nimport { ProfileHeaderAction } from '../profile/style';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Container = styled.div`\n  position: relative;\n  display: inline-block;\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n  border-radius: ${props =>\n    props.type === 'community' ? `${props.size / 8}px` : '100%'};\n  border: none;\n  background-color: ${theme.bg.default};\n\n  ${props =>\n    props.mobilesize &&\n    css`\n      @media (max-width: ${MEDIA_BREAK}px) {\n        width: ${props => `${props.mobilesize}px`};\n        height: ${props => `${props.mobilesize}px`};\n      }\n    `};\n`;\n\nexport const AvatarLink = styled(Link)`\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  height: 100%;\n  width: 100%;\n  justify-content: center;\n  align-items: center;\n  pointer-events: auto;\n  border-radius: ${props =>\n    props.type === 'community' ? `${props.size / 8}px` : '100%'};\n`;\n\nexport const CoverAction = styled(ProfileHeaderAction)`\n  position: absolute;\n  top: 12px;\n  right: 12px;\n  z-index: ${zIndex.tooltip + 1};\n`;\n\nexport const Img = styled(ReactImage)`\n  display: inline-block;\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n  border-radius: ${props =>\n    props.type === 'community' ? `${props.size / 8}px` : '100%'};\n  object-fit: cover;\n  background-color: ${theme.bg.default};\n\n  ${props =>\n    props.mobilesize &&\n    css`\n      @media (max-width: ${MEDIA_BREAK}px) {\n        width: ${props => `${props.mobilesize}px`};\n        height: ${props => `${props.mobilesize}px`};\n      }\n    `};\n`;\n\nexport const FallbackImg = styled.img`\n  display: inline-block;\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n  border-radius: ${props =>\n    props.type === 'community' ? `${props.size / 8}px` : '100%'};\n  object-fit: cover;\n  background-color: ${theme.bg.wash};\n\n  ${props =>\n    props.mobilesize &&\n    css`\n      @media (max-width: ${MEDIA_BREAK}px) {\n        width: ${props => `${props.mobilesize}px`};\n        height: ${props => `${props.mobilesize}px`};\n      }\n    `};\n`;\n\nexport const LoadingImg = styled.div`\n  display: inline-block;\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n  border-radius: ${props =>\n    props.type === 'community' ? `${props.size / 8}px` : '100%'};\n  background: ${theme.bg.wash};\n\n  ${props =>\n    props.mobilesize &&\n    css`\n      @media (max-width: ${MEDIA_BREAK}px) {\n        width: ${props => `${props.mobilesize}px`};\n        height: ${props => `${props.mobilesize}px`};\n      }\n    `};\n`;\n"
  },
  {
    "path": "src/components/avatar/userAvatar.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Query } from 'react-apollo';\nimport {\n  getUserByUsernameQuery,\n  type GetUserType,\n} from 'shared/graphql/queries/user/getUser';\nimport { UserHoverProfile } from 'src/components/hoverProfile';\nimport AvatarImage from './image';\nimport { Container, AvatarLink } from './style';\nimport ConditionalWrap from 'src/components/conditionalWrap';\n\ntype HandlerProps = {\n  user?: GetUserType,\n  username?: string,\n  size?: number,\n  mobilesize?: number,\n  style?: Object,\n  showHoverProfile?: boolean,\n  isClickable?: boolean,\n  dataCy?: string,\n  onlineBorderColor?: ?Function,\n};\n\ntype AvatarProps = {\n  ...$Exact<HandlerProps>,\n  user: GetUserType,\n};\n\nconst GetUserByUsername = (props: HandlerProps) => {\n  const { username, showHoverProfile = true } = props;\n  return (\n    <Query variables={{ username }} query={getUserByUsernameQuery}>\n      {({ data }) => {\n        if (!data || !data.user) return null;\n        return (\n          <ConditionalWrap\n            condition={showHoverProfile}\n            wrap={() => (\n              <UserHoverProfile username={props.username}>\n                <Avatar user={data.user} {...props} />\n              </UserHoverProfile>\n            )}\n          >\n            <Avatar user={data.user} {...props} />\n          </ConditionalWrap>\n        );\n      }}\n    </Query>\n  );\n};\n\nclass Avatar extends React.Component<AvatarProps> {\n  render() {\n    const {\n      user,\n      dataCy,\n      size = 32,\n      mobilesize,\n      style,\n      isClickable = true,\n    } = this.props;\n\n    const src = user.profilePhoto;\n\n    const userFallback = '/img/default_avatar.svg';\n    const source = [src, userFallback];\n\n    return (\n      <Container\n        style={style}\n        type={'user'}\n        data-cy={dataCy}\n        size={size}\n        mobileSize={mobilesize}\n      >\n        <ConditionalWrap\n          condition={!!user.username && isClickable}\n          wrap={() => (\n            <AvatarLink to={`/users/${user.username}`}>\n              <AvatarImage\n                src={source}\n                size={size}\n                mobilesize={mobilesize}\n                type={'user'}\n                alt={user.name || user.username}\n              />\n            </AvatarLink>\n          )}\n        >\n          <AvatarImage\n            src={source}\n            size={size}\n            mobilesize={mobilesize}\n            type={'user'}\n            alt={user.name || user.username}\n          />\n        </ConditionalWrap>\n      </Container>\n    );\n  }\n}\n\nclass AvatarHandler extends React.Component<HandlerProps> {\n  render() {\n    const { showHoverProfile = true, isClickable } = this.props;\n\n    if (this.props.user) {\n      const user = this.props.user;\n      return (\n        <ConditionalWrap\n          condition={showHoverProfile}\n          wrap={() => (\n            <UserHoverProfile username={user.username}>\n              <Avatar {...this.props} />\n            </UserHoverProfile>\n          )}\n        >\n          <Avatar {...this.props} />\n        </ConditionalWrap>\n      );\n    }\n\n    if (!this.props.user && this.props.username) {\n      return (\n        <GetUserByUsername\n          username={this.props.username}\n          isClickable={isClickable}\n        />\n      );\n    }\n\n    return null;\n  }\n}\n\nexport default AvatarHandler;\n"
  },
  {
    "path": "src/components/badges/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport { Span, ProBadge, BlockedBadge, PendingBadge, TeamBadge } from './style';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Tooltip from 'src/components/tooltip';\n\ntype Props = {\n  type: string,\n  label?: string,\n  onClick?: Function,\n  tipText: string,\n  currentUser: ?Object,\n  dispatch: Dispatch<Object>,\n};\n\nclass Badge extends React.Component<Props> {\n  render() {\n    const { type, label, ...rest } = this.props;\n    switch (type) {\n      case 'beta-supporter':\n        return (\n          <Tooltip content={'Beta Supporter'}>\n            <ProBadge type={type} {...rest}>\n              {label || 'Supporter'}\n            </ProBadge>\n          </Tooltip>\n        );\n      case 'blocked':\n        return (\n          <Tooltip content={this.props.tipText}>\n            <BlockedBadge type={type} {...rest}>\n              {label || type}\n            </BlockedBadge>\n          </Tooltip>\n        );\n      case 'pending':\n        return (\n          <Tooltip content={this.props.tipText}>\n            <PendingBadge type={type} {...rest}>\n              {label || type}\n            </PendingBadge>\n          </Tooltip>\n        );\n      case 'moderator':\n      case 'admin':\n        return (\n          <Tooltip\n            content={`${\n              type === 'moderator' ? 'Moderator' : 'Owner'\n            } of this community`}\n          >\n            <TeamBadge type={type} {...rest}>\n              Team\n            </TeamBadge>\n          </Tooltip>\n        );\n      default:\n        return (\n          <Tooltip content={this.props.tipText || label || ''}>\n            <Span\n              type={type}\n              onClick={this.props.onClick && this.props.onClick}\n              {...rest}\n            >\n              {label || type}\n            </Span>\n          </Tooltip>\n        );\n    }\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  connect()\n)(Badge);\n"
  },
  {
    "path": "src/components/badges/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { Gradient } from 'src/components/globals';\n\nexport const Span = styled.span`\n  display: inline-block;\n  color: ${theme.text.reverse};\n  background-color: ${theme.text.alt};\n  text-transform: uppercase;\n  padding: 3px 4px;\n  margin-right: 4px;\n  font-size: 9px;\n  font-weight: 800;\n  border-radius: 4px;\n  letter-spacing: 0.6px;\n  line-height: 1;\n  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.16);\n  align-items: center;\n  align-self: center;\n`;\n\nexport const ProBadge = styled(Span)`\n  background-color: ${theme.special.default};\n  background-image: ${Gradient(theme.special.alt, theme.special.default)};\n`;\n\nexport const TeamBadge = styled(Span)`\n  background-color: ${theme.success.default};\n  background-image: ${Gradient(theme.success.alt, theme.success.default)};\n`;\n\nexport const BlockedBadge = styled(Span)`\n  background-color: ${theme.warn.alt};\n  background-image: ${Gradient(theme.warn.alt, theme.warn.default)};\n`;\n\nexport const PendingBadge = styled(Span)`\n  background-color: ${theme.special.alt};\n  background-image: ${Gradient(theme.special.alt, theme.special.default)};\n`;\n"
  },
  {
    "path": "src/components/button/index.js",
    "content": "// @flow\nimport React from 'react';\nimport {\n  A,\n  StyledLink,\n  StyledButton,\n  StyledWhiteIconButton,\n  StyledWhiteButton,\n  StyledPrimaryButton,\n  StyledWarnButton,\n  StyledOutlineButton,\n  StyledHoverWarnOutlineButton,\n  StyledPrimaryOutlineButton,\n  StyledWhiteOutlineButton,\n  StyledTextButton,\n  StyledFacebookButton,\n  StyledTwitterButton,\n} from './style';\n\nconst handleLinkWrapping = (Component, props) => {\n  const { href, to, target, children, disabled, isLoading, ...rest } = props;\n  const button = (\n    <Component disabled={disabled || isLoading} {...rest}>\n      {children}\n    </Component>\n  );\n\n  if (href)\n    return (\n      <A\n        href={href}\n        target={target || '_blank'}\n        rel={!target ? 'noopener noreferrer' : undefined}\n      >\n        {button}\n      </A>\n    );\n  if (to) return <StyledLink to={to}>{button}</StyledLink>;\n  return button;\n};\n\ntype To = {\n  pathname?: string,\n  search?: string,\n  state?: Object,\n};\n\ntype Props = {\n  target?: string,\n  href?: string,\n  to?: string | To,\n  children: React$Node,\n  disabled?: boolean,\n  isLoading?: boolean,\n  size?: 'small',\n};\n\nexport const Button = (props: Props) => handleLinkWrapping(StyledButton, props);\n\nexport const WhiteIconButton = (props: Props) =>\n  handleLinkWrapping(StyledWhiteIconButton, props);\n\nexport const WhiteButton = (props: Props) =>\n  handleLinkWrapping(StyledWhiteButton, props);\n\nexport const PrimaryButton = (props: Props) =>\n  handleLinkWrapping(StyledPrimaryButton, props);\n\nexport const WarnButton = (props: Props) =>\n  handleLinkWrapping(StyledWarnButton, props);\n\nexport const OutlineButton = (props: Props) =>\n  handleLinkWrapping(StyledOutlineButton, props);\n\nexport const PrimaryOutlineButton = (props: Props) =>\n  handleLinkWrapping(StyledPrimaryOutlineButton, props);\n\nexport const WhiteOutlineButton = (props: Props) =>\n  handleLinkWrapping(StyledWhiteOutlineButton, props);\n\nexport const HoverWarnOutlineButton = (props: Props) =>\n  handleLinkWrapping(StyledHoverWarnOutlineButton, props);\n\nexport const TextButton = (props: Props) =>\n  handleLinkWrapping(StyledTextButton, props);\n\nexport const FacebookButton = (props: Props) =>\n  handleLinkWrapping(StyledFacebookButton, props);\n\nexport const TwitterButton = (props: Props) =>\n  handleLinkWrapping(StyledTwitterButton, props);\n"
  },
  {
    "path": "src/components/button/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Link } from 'react-router-dom';\nimport { tint, hexa } from 'src/components/globals';\n\nexport const A = styled.a`\n  display: flex;\n  align-items: center;\n  flex: none;\n`;\n\nexport const StyledLink = styled(Link)`\n  display: flex;\n  flex: none;\n  align-items: center;\n`;\n\nexport const StyledButton = styled.button`\n  font-size: ${props => (props.size === 'small' ? '15px' : '16px')};\n  font-weight: 600;\n  color: ${theme.text.default};\n  border-radius: 32px;\n  padding: ${props => (props.size === 'small' ? '6px 12px' : '10px 16px')};\n  background: ${theme.bg.wash};\n  display: flex;\n  flex: none;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n  -webkit-display: none;\n  opacity: ${props => (props.disabled ? '0.6' : '1')};\n  line-height: 1.2;\n  transition: box-shadow 0.2s ease-in-out;\n\n  .icon:not(:first-child):not(:last-child) {\n    margin-right: 4px;\n  }\n\n  &:hover {\n    background: ${theme.bg.border};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default}, 0 0 0 4px ${theme.bg.border};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${tint(theme.bg.border, -24)};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n`;\n\nexport const StyledWhiteIconButton = styled(StyledButton)`\n  background-color: transparent;\n  padding: 0;\n  color: ${theme.text.default};\n\n  .icon {\n    margin-right: 0;\n  }\n`;\n\nexport const StyledPrimaryButton = styled(StyledButton)`\n  background-color: ${theme.brand.alt};\n  background-image: ${`linear-gradient(to bottom, ${theme.brand.alt}, ${tint(\n    theme.brand.alt,\n    -8\n  )})`};\n  color: ${theme.text.reverse};\n  border: 1px solid ${tint(theme.brand.alt, -8)};\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    border: 1px solid ${tint(theme.brand.alt, -16)};\n    background: ${tint(theme.brand.alt, -8)};\n    color: ${theme.text.reverse};\n  }\n\n  &:focus {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.brand.alt, 0.24)};\n  }\n\n  &:active {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.brand.alt, 0.64)};\n  }\n`;\n\nexport const StyledWarnButton = styled(StyledPrimaryButton)`\n  background-color: ${theme.warn.default};\n  background-image: ${`linear-gradient(to bottom, ${theme.warn.default}, ${tint(\n    theme.warn.default,\n    -8\n  )})`};\n  border: 1px solid ${tint(theme.warn.default, -8)};\n\n  &:hover {\n    border: 1px solid ${tint(theme.warn.default, -16)};\n    background: ${tint(theme.warn.default, -8)};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.warn.default, 0.24)};\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.warn.default, 0.64)};\n  }\n`;\n\nexport const StyledWhiteButton = styled(StyledButton)`\n  background-color: ${theme.bg.default};\n  color: ${theme.text.secondary};\n  border: 0;\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    border: 0;\n    background: ${theme.bg.default};\n    color: ${theme.text.default};\n  }\n\n  &:focus {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.bg.default, 0.24)};\n  }\n\n  &:active {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.bg.default, 0.64)};\n  }\n`;\n\nexport const StyledOutlineButton = styled(StyledButton)`\n  background: transparent;\n  border: 1px solid ${theme.bg.border};\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    background: transparent;\n    border: 1px solid ${tint(theme.bg.border, -8)};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default}, 0 0 0 4px ${theme.bg.border};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${tint(theme.bg.border, -24)};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n`;\n\nexport const StyledPrimaryOutlineButton = styled(StyledOutlineButton)`\n  background: transparent;\n  border: 1px solid ${theme.brand.alt};\n  color: ${theme.brand.alt};\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    background: ${hexa(theme.brand.alt, 0.04)};\n    border: 1px solid ${tint(theme.brand.alt, -8)};\n    color: ${tint(theme.brand.alt, -8)};\n  }\n\n  &:focus {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.brand.alt, 0.16)};\n  }\n\n  &:active {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.brand.alt, 0.48)};\n  }\n`;\n\nexport const StyledWhiteOutlineButton = styled(StyledOutlineButton)`\n  background: transparent;\n  border: 1px solid ${theme.bg.default};\n  color: ${theme.bg.default};\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    background: ${hexa(theme.bg.default, 0.04)};\n    border: 1px solid ${theme.bg.default};\n    color: ${theme.bg.default};\n  }\n\n  &:focus {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.bg.default, 0.16)};\n  }\n\n  &:active {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.bg.default, 0.48)};\n  }\n`;\n\nexport const StyledHoverWarnOutlineButton = styled(StyledOutlineButton)`\n  &:hover {\n    background: ${theme.warn.default};\n    border: 1px solid ${theme.warn.default};\n    color: ${theme.text.reverse};\n  }\n\n  &:active {\n    transition: box-shadow 0.2s ease-in-out;\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.warn.default, 0.48)};\n  }\n`;\n\nexport const StyledTextButton = styled(StyledOutlineButton)`\n  border: 0;\n\n  &:hover {\n    background: transparent;\n    border: 0;\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default}, 0 0 0 4px ${theme.bg.border};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${tint(theme.bg.border, -24)};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n`;\n\nexport const StyledFacebookButton = styled(StyledPrimaryButton)`\n  background-color: ${theme.social.facebook.default};\n  background-image: none;\n  border: 1px solid ${tint(theme.social.facebook.default, -8)};\n\n  &:hover {\n    border: 1px solid ${tint(theme.social.facebook.default, -16)};\n    background: ${tint(theme.social.facebook.default, -8)};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.social.facebook.default, 0.24)};\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.social.facebook.default, 0.64)};\n  }\n`;\n\nexport const StyledTwitterButton = styled(StyledPrimaryButton)`\n  background-color: ${theme.social.twitter.default};\n  background-image: none;\n  border: 1px solid ${tint(theme.social.twitter.default, -8)};\n\n  &:hover {\n    border: 1px solid ${tint(theme.social.twitter.default, -16)};\n    background: ${tint(theme.social.twitter.default, -8)};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.social.twitter.default, 0.24)};\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${hexa(theme.social.twitter.default, 0.64)};\n  }\n`;\n"
  },
  {
    "path": "src/components/card/index.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport styled from 'styled-components';\nimport { FlexCol } from '../globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst StyledCard = styled(FlexCol)`\n  background: ${theme.bg.default};\n  position: relative;\n  width: 100%;\n  max-width: 100%;\n  background-clip: padding-box;\n  overflow: visible;\n  flex: none;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n    box-shadow: none;\n  }\n`;\n\nconst CardPure = (props: Object): React$Element<any> => (\n  <StyledCard {...props}>{props.children}</StyledCard>\n);\n\nexport const Card = compose()(CardPure);\nexport default Card;\n"
  },
  {
    "path": "src/components/column/index.js",
    "content": "// @flow\nimport React from 'react';\nimport styled, { css } from 'styled-components';\nimport { FlexCol } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst BaseColumn = styled(FlexCol)`\n  margin: 32px 16px;\n  align-items: stretch;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin: 0;\n    max-width: 100%;\n  }\n\n  ${p =>\n    p.hideOnMobile &&\n    css`\n      @media screen and (max-width: ${MEDIA_BREAK}px) {\n        display: none;\n      }\n    `};\n`;\n\nconst PrimaryColumn = styled(BaseColumn)`\n  min-width: 320px;\n  flex: 2 1 60%;\n  max-width: 640px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n    max-width: 100%;\n    margin-top: 2px;\n    ${'' /* flex: auto; */} flex: none;\n  }\n`;\n\nconst SecondaryColumn = styled(BaseColumn)`\n  min-width: 240px;\n  flex: 1 1 30%;\n  max-width: 320px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex: none;\n    align-self: stretch;\n    max-width: 100%;\n  }\n`;\n\nconst OnlyColumn = styled(PrimaryColumn)`\n  max-width: 840px;\n  flex: 0 0 75%;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex: 1;\n    min-width: 100%;\n    width: 100%;\n  }\n`;\n\nexport const Column = (props: Object): React$Element<any> => {\n  if (props.type === 'primary') {\n    return <PrimaryColumn {...props}>{props.children}</PrimaryColumn>;\n  } else if (props.type === 'secondary') {\n    return <SecondaryColumn {...props}>{props.children}</SecondaryColumn>;\n  } else if (props.type === 'only') {\n    return <OnlyColumn {...props}>{props.children}</OnlyColumn>;\n  } else {\n    return <BaseColumn {...props}>{props.children}</BaseColumn>;\n  }\n};\n\nexport default Column;\n"
  },
  {
    "path": "src/components/communitySidebar/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { SidebarSection } from 'src/views/community/style';\nimport { TeamMembersList } from 'src/views/community/components/teamMembersList';\nimport { ChannelsList } from 'src/views/community/components/channelsList';\nimport { CommunityProfileCard } from 'src/components/entities';\nimport { ErrorBoundary } from 'src/components/error';\n\ntype Props = {\n  community: Object,\n};\n\nexport default ({ community }: Props) => (\n  <React.Fragment>\n    <SidebarSection>\n      <CommunityProfileCard community={community} />\n    </SidebarSection>\n\n    <ErrorBoundary>\n      <SidebarSection>\n        <ChannelsList id={community.id} communitySlug={community.slug} />\n      </SidebarSection>\n    </ErrorBoundary>\n\n    <ErrorBoundary>\n      <SidebarSection>\n        <TeamMembersList\n          community={community}\n          id={community.id}\n          first={100}\n          filter={{ isModerator: true, isOwner: true }}\n        />\n      </SidebarSection>\n    </ErrorBoundary>\n  </React.Fragment>\n);\n"
  },
  {
    "path": "src/components/conditionalWrap/index.js",
    "content": "// @flow\n// Conditionally wrap a Component in some more JSX\n//\n// Usage:\n//   <ConditionalWrap\n//     condition={shouldLink}\n//     wrap={children => <TouchableOpacity onPress={this.onPress}>{children}</TouchableOpacity>}\n//   >\n//    <OtherComponent />\n//  </ConditionalWrap>\n\nimport type { Node } from 'react';\n\ntype Props = {\n  condition: boolean,\n  wrap: (children: Node) => *,\n  children: Node,\n};\n\nfunction ConditionalWrap({ condition, wrap, children }: Props) {\n  return condition ? wrap(children) : children;\n}\n\nexport default ConditionalWrap;\n"
  },
  {
    "path": "src/components/editForm/style.js",
    "content": "import styled from 'styled-components';\nimport theme from 'shared/theme';\nimport Card from 'src/components/card';\nimport { FlexRow, FlexCol, Truncate } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const StyledCard = styled(Card)`\n  padding: 16px;\n`;\n\nexport const Form = styled.form`\n  display: inline-block;\n  flex-direction: column;\n  align-self: stretch;\n  flex: none;\n  max-width: 100%;\n`;\n\nexport const FormTitle = styled.h1`\n  font-size: 20px;\n  color: ${theme.text.default};\n  font-weight: 800;\n  line-height: 1.2;\n  flex: 1 0 auto;\n  ${Truncate};\n`;\n\nexport const Subtitle = styled.h4`\n  font-size: 14px;\n  color: ${theme.text.alt};\n  line-height: 1.3;\n  width: 100%;\n  ${Truncate};\n`;\n\nexport const Description = styled.p`\n  font-size: 14px;\n  color: ${theme.text.default};\n  padding: 8px 0 16px;\n  line-height: 1.4;\n\n  a {\n    color: ${theme.brand.default};\n  }\n`;\n\nexport const TertiaryActionContainer = styled(FlexRow)`\n  justify-content: flex-start;\n  flex-grow: 1;\n`;\n\nexport const DeleteCoverWrapper = styled(FlexRow)`\n  justify-content: flex-end;\n  flex-grow: 1;\n  height: 0px;\n`;\n\nexport const DeleteCoverButton = styled.button`\n  position: relative;\n  top: 7px;\n  left: 10px;\n  background-color: ${theme.text.placeholder};\n  color: ${theme.text.reverse};\n  border: none;\n  border-radius: 50%;\n  outline: none;\n  padding: 4px;\n  height: 24px;\n  width: 24px;\n  cursor: pointer;\n  z-index: 8;\n  &:hover {\n    background-color: ${theme.warn.alt};\n  }\n`;\n\nexport const Actions = styled(FlexRow)`\n  margin: 24px -16px 0;\n  width: calc(100% + 32px);\n  padding: 16px 16px 0;\n  justify-content: flex-start;\n  flex-direction: row-reverse;\n  border-top: 1px solid ${theme.bg.border};\n\n  button + button {\n    margin-left: 8px;\n  }\n`;\n\nexport const PhotoPreview = styled.div`\n  position: relative;\n  width: 48px;\n  height: 48px;\n  object-fit: cover;\n  border-radius: 4px;\n  background-image: url('${props => props.src}')\n`;\n\nexport const GeneralNotice = styled.span`\n  padding: 8px 12px;\n  font-size: 12px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  background: ${theme.bg.wash};\n  border-radius: 4px;\n  margin-top: 24px;\n  line-height: 1.4;\n  display: inline-block;\n`;\n\nexport const ImageInputWrapper = styled(FlexCol)`\n  position: relative;\n  flex: 0 0 auto;\n  margin-top: 8px;\n  margin-bottom: 24px;\n  max-width: 342px;\n\n  > label:nth-of-type(2) {\n    position: absolute;\n    bottom: -24px;\n    left: 16px;\n  }\n`;\n\nexport const Location = styled(FlexRow)`\n  font-weight: 500;\n  color: ${theme.text.alt};\n  font-size: 14px;\n  margin-bottom: 8px;\n\n  > div {\n    color: ${theme.text.placeholder};\n  }\n\n  > span {\n    padding: 0 4px;\n    color: ${theme.text.placeholder};\n  }\n\n  > a:hover {\n    color: ${theme.brand.alt};\n    text-decoration: underline;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const Loading = styled.span`\n  display: inline-block;\n  position: absolute;\n  right: 19px;\n  top: 45px;\n`;\n\nexport const GithubSignin = styled.div``;\n"
  },
  {
    "path": "src/components/entities/index.js",
    "content": "// @flow\nimport { UserListItem, CommunityListItem, ChannelListItem } from './listItems';\nimport {\n  ChannelProfileCard,\n  CommunityProfileCard,\n  UserProfileCard,\n} from './profileCards';\n\nexport {\n  UserListItem,\n  CommunityListItem,\n  ChannelListItem,\n  ChannelProfileCard,\n  CommunityProfileCard,\n  UserProfileCard,\n};\n"
  },
  {
    "path": "src/components/entities/listItems/channel.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { Link } from 'react-router-dom';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\nimport { ErrorBoundary } from 'src/components/error';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Icon from 'src/components/icon';\nimport {\n  ChannelRow,\n  ChannelContent,\n  Label,\n  Description,\n  ChannelActions,\n} from './style';\n\ntype Props = {\n  channel: ?ChannelInfoType,\n  id: string,\n  name?: string,\n  description?: ?string,\n  currentUser: ?Object,\n  children?: React$Node,\n  isActive?: boolean,\n};\n\nconst Channel = (props: Props) => {\n  const { channel, name, description, children, isActive = false } = props;\n  if (!channel) return null;\n\n  return (\n    <ErrorBoundary>\n      <ChannelRow isActive={isActive}>\n        <Link to={`/${channel.community.slug}/${channel.slug}?tab=posts`}>\n          <ChannelContent>\n            {name && (\n              <Label title={name}>\n                {channel.isPrivate && (\n                  <Icon glyph=\"private-outline\" size={14} />\n                )}\n                # {name}\n              </Label>\n            )}\n\n            {description && <Description>{description}</Description>}\n          </ChannelContent>\n        </Link>\n\n        <ChannelActions>{children}</ChannelActions>\n      </ChannelRow>\n    </ErrorBoundary>\n  );\n};\n\nexport const ChannelListItem = compose(withCurrentUser)(Channel);\n"
  },
  {
    "path": "src/components/entities/listItems/community.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport Icon from 'src/components/icon';\nimport {\n  RowWithAvatar,\n  CommunityAvatarContainer,\n  Content,\n  Label,\n  Description,\n  Actions,\n} from './style';\n\ntype Props = {\n  communityObject: Object,\n  avatarSize?: number,\n  profilePhoto?: string,\n  name?: string,\n  description?: ?string,\n  children?: React$Node,\n};\n\nexport const CommunityListItem = (props: Props) => {\n  const {\n    communityObject,\n    profilePhoto,\n    name,\n    description,\n    avatarSize = 32,\n    children,\n  } = props;\n\n  return (\n    <Link to={`/${communityObject.slug}`}>\n      <RowWithAvatar>\n        {profilePhoto && (\n          <CommunityAvatarContainer>\n            <CommunityAvatar\n              community={communityObject}\n              size={avatarSize}\n              showHoverProfile={false}\n              isClickable={false}\n            />\n          </CommunityAvatarContainer>\n        )}\n\n        <Content>\n          {name && <Label title={name}>{name}</Label>}\n\n          {description && <Description>{description}</Description>}\n        </Content>\n\n        <Actions>\n          <Icon glyph=\"view-forward\" size={24} />\n\n          {children}\n        </Actions>\n      </RowWithAvatar>\n    </Link>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/listItems/index.js",
    "content": "// @flow\nimport { ChannelListItem } from './channel';\nimport { UserListItem } from './user';\nimport { CommunityListItem } from './community';\n\nexport { ChannelListItem, UserListItem, CommunityListItem };\n"
  },
  {
    "path": "src/components/entities/listItems/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Truncate } from 'src/components/globals';\nimport { Link } from 'react-router-dom';\nimport { hexa } from 'src/components/globals';\n\nexport const CardLink = styled(Link)`\n  display: block;\n  position: relative;\n`;\n\nexport const Row = styled.div`\n  padding: 12px 16px;\n  align-items: center;\n  display: grid;\n  grid-template-rows: auto;\n  grid-template-areas: 'content actions';\n  grid-template-columns: 1fr auto;\n  background: ${props =>\n    props.isActive ? hexa(theme.text.default, 0.04) : theme.bg.default};\n  border-bottom: 1px solid ${theme.bg.divider};\n  grid-gap: 16px;\n\n  &:hover {\n    background: ${theme.bg.wash};\n    cursor: pointer;\n  }\n\n  ${props =>\n    props.isActive &&\n    css`\n      box-shadow: inset 3px 0 0 ${theme.text.default};\n    `}\n`;\n\nexport const RowWithAvatar = styled.div`\n  padding: 12px 16px;\n  align-items: center;\n  display: grid;\n  grid-template-areas: 'avatar content actions';\n  grid-template-columns: min-content 1fr auto;\n  grid-template-rows: auto;\n  background: ${theme.bg.default};\n  border-bottom: 1px solid ${theme.bg.divider};\n  grid-gap: 16px;\n  flex: 1;\n\n  &:hover {\n    background: ${theme.bg.wash};\n    cursor: pointer;\n  }\n`;\n\nexport const UserAvatarContainer = styled.div`\n  height: 40px;\n  grid-area: avatar;\n  align-self: flex-start;\n`;\n\nexport const CommunityAvatarContainer = styled.div`\n  height: 32px;\n  grid-area: avatar;\n  align-self: flex-start;\n`;\n\nexport const Content = styled.div`\n  grid-area: content;\n  display: grid;\n`;\n\nexport const Label = styled.div`\n  color: ${theme.text.default};\n  font-size: 15px;\n  font-weight: 600;\n  line-height: 1.2;\n  display: inline-block;\n  align-items: center;\n  min-width: 0;\n  ${Truncate};\n\n  .icon {\n    color: ${theme.text.secondary};\n    margin-right: 6px;\n    position: relative;\n    top: 1px;\n  }\n`;\n\nexport const Sublabel = styled.span`\n  font-size: 15px;\n  color: ${theme.text.alt};\n  font-weight: 400;\n  line-height: 1.2;\n  display: inline-block;\n  ${Truncate};\n`;\n\nexport const Description = styled.p`\n  font-size: 15px;\n  line-height: 1.3;\n  color: ${theme.text.default};\n  margin-top: 6px;\n  padding-right: 24px;\n  word-break: break-word;\n`;\n\nexport const Actions = styled.div`\n  grid-area: actions;\n  display: flex;\n  flex-direction: column;\n  align-self: flex-start;\n  justify-content: flex-start;\n  position: relative;\n  z-index: 10;\n  color: ${theme.text.alt};\n  flex: 1;\n  padding-top: 4px;\n`;\n\nexport const ChannelActions = styled(Actions)`\n  flex-direction: row;\n  padding: 12px 16px 12px 12px;\n`;\n\nexport const ChannelRow = styled(Row)`\n  padding: 0;\n`;\n\nexport const ChannelContent = styled(Content)`\n  padding: 12px 16px;\n`;\n"
  },
  {
    "path": "src/components/entities/listItems/user.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { withRouter } from 'react-router';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { UserAvatar } from 'src/components/avatar';\nimport Badge from 'src/components/badges';\nimport type { Dispatch } from 'redux';\nimport ConditionalWrap from 'src/components/conditionalWrap';\nimport {\n  RowWithAvatar,\n  UserAvatarContainer,\n  Content,\n  Label,\n  Sublabel,\n  Description,\n  CardLink,\n} from './style';\n\ntype Props = {\n  userObject: UserInfoType,\n  id: string,\n  avatarSize?: number,\n  profilePhoto?: string,\n  name?: string,\n  username?: ?string,\n  description?: ?string,\n  website?: ?string,\n  badges?: Array<string>,\n  isCurrentUser?: boolean,\n  multiAction?: boolean,\n  children?: React$Node,\n  history: Object,\n  dispatch: Dispatch<Object>,\n  showHoverProfile?: boolean,\n  isLink?: boolean,\n  onClick?: (user: UserInfoType) => any,\n};\n\n// eslint-disable-next-line\nconst noop = (user: UserInfoType) => {};\n\nconst User = (props: Props) => {\n  const {\n    userObject,\n    profilePhoto,\n    name,\n    username,\n    description,\n    avatarSize = 40,\n    badges,\n    showHoverProfile = true,\n    isLink = true,\n    onClick = noop,\n  } = props;\n\n  if (!userObject.username) return null;\n\n  return (\n    <ConditionalWrap\n      condition={isLink}\n      wrap={children => (\n        <CardLink to={`/users/${userObject.username}`}>{children}</CardLink>\n      )}\n    >\n      <RowWithAvatar onClick={() => onClick(userObject)}>\n        {profilePhoto && (\n          <UserAvatarContainer>\n            <UserAvatar\n              user={userObject}\n              size={avatarSize}\n              showHoverProfile={showHoverProfile}\n              isClickable={false}\n            />\n          </UserAvatarContainer>\n        )}\n\n        <Content>\n          {name && (\n            <Label title={name}>\n              {name}\n              {badges &&\n                badges.map((b, i) => (\n                  <Badge style={{ marginLeft: '8px' }} key={i} type={b} />\n                ))}\n            </Label>\n          )}\n\n          {username && <Sublabel title={username}>@{username}</Sublabel>}\n\n          {description && <Description>{description}</Description>}\n        </Content>\n      </RowWithAvatar>\n    </ConditionalWrap>\n  );\n};\n\nexport const UserListItem = compose(\n  withRouter,\n  connect()\n)(User);\n"
  },
  {
    "path": "src/components/entities/profileCards/channel.js",
    "content": "// @flow\nimport React from 'react';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\nimport { ChannelActions } from './components/channelActions';\nimport { ChannelMeta } from './components/channelMeta';\nimport { ChannelCommunityMeta } from './components/channelCommunityMeta';\nimport { ProfileContainer } from './style';\n\ntype Props = {\n  channel: ChannelInfoType,\n  hideActions?: boolean,\n  hideCommunityMeta?: boolean,\n};\n\nexport const ChannelProfileCard = (props: Props) => {\n  const { channel, hideActions, hideCommunityMeta } = props;\n\n  return (\n    <ProfileContainer data-cy=\"channel-profile-card\">\n      {!hideCommunityMeta && <ChannelCommunityMeta channel={channel} />}\n      <ChannelMeta channel={channel} />\n      {!hideActions ? (\n        <ChannelActions channel={channel} />\n      ) : (\n        <div style={{ paddingBottom: '12px' }} />\n      )}\n    </ProfileContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/community.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport { CommunityActions } from './components/communityActions';\nimport { CommunityMeta } from './components/communityMeta';\nimport { ProfileContainer, CoverPhoto, ProfileAvatarContainer } from './style';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\n\ntype Props = {\n  community: CommunityInfoType,\n};\n\nexport const CommunityProfileCard = (props: Props) => {\n  const { community } = props;\n\n  return (\n    <ProfileContainer data-cy=\"community-profile-card\">\n      <Link to={`/${community.slug}`}>\n        <CoverPhoto src={community.coverPhoto} />\n      </Link>\n\n      <ProfileAvatarContainer>\n        <CommunityAvatar\n          showHoverProfile={false}\n          size={60}\n          community={community}\n        />\n      </ProfileAvatarContainer>\n\n      <CommunityMeta community={community} />\n\n      <CommunityActions community={community} />\n    </ProfileContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/components/channelActions.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\nimport { OutlineButton } from 'src/components/button';\nimport { ActionsRowContainer } from '../style';\n\ntype Props = {\n  channel: ChannelInfoType,\n};\n\nexport const UnconnectedChannelActions = (props: Props) => {\n  const { channel } = props;\n  const { community } = channel;\n  const { isOwner, isModerator } = community.communityPermissions;\n  const isTeamMember = isOwner || isModerator;\n  const { channelPermissions } = channel;\n\n  if (channelPermissions.isMember) {\n    return (\n      <ActionsRowContainer>\n        {isTeamMember && (\n          <OutlineButton\n            data-cy=\"channel-settings-button\"\n            to={`/${community.slug}/${channel.slug}/settings`}\n          >\n            Settings\n          </OutlineButton>\n        )}\n      </ActionsRowContainer>\n    );\n  }\n\n  return (\n    <ActionsRowContainer>\n      {isTeamMember && (\n        <OutlineButton to={`/${community.slug}/${channel.slug}/settings`}>\n          Settings\n        </OutlineButton>\n      )}\n    </ActionsRowContainer>\n  );\n};\n\nexport const ChannelActions = connect()(UnconnectedChannelActions);\n"
  },
  {
    "path": "src/components/entities/profileCards/components/channelCommunityMeta.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport { ChannelCommunityMetaRow, ChannelCommunityName } from '../style';\n\ntype Props = {\n  channel: ChannelInfoType,\n};\n\nexport const ChannelCommunityMeta = (props: Props) => {\n  const { channel } = props;\n  const { community } = channel;\n\n  return (\n    <Link to={`/${community.slug}`}>\n      <ChannelCommunityMetaRow>\n        <CommunityAvatar isClickable={false} size={24} community={community} />\n        <ChannelCommunityName>{community.name}</ChannelCommunityName>\n      </ChannelCommunityMetaRow>\n    </Link>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/components/channelMeta.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport { MetaContainer, Name, Description, Username } from '../style';\n\ntype Props = {\n  channel: ChannelInfoType,\n};\n\nexport const ChannelMeta = (props: Props) => {\n  const { channel } = props;\n  const { description, community, isArchived } = channel;\n  const formattedDescription = description && renderTextWithLinks(description);\n\n  return (\n    <MetaContainer style={{ marginTop: '20px' }}>\n      <Link to={`/${community.slug}/${channel.slug}`}>\n        <Name># {channel.name}</Name>\n      </Link>\n\n      {isArchived && <Username>Archived</Username>}\n\n      {formattedDescription && (\n        <Description>{formattedDescription}</Description>\n      )}\n    </MetaContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/components/communityActions.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport { OutlineButton } from 'src/components/button';\nimport { ActionsRowContainer } from '../style';\n\ntype Props = {\n  community: CommunityInfoType,\n  dispatch: Dispatch<Object>,\n};\n\nexport const UnconnectedCommunityActions = (props: Props) => {\n  const { community } = props;\n\n  const { isMember, isOwner, isModerator } = community.communityPermissions;\n  const isTeamMember = isOwner || isModerator;\n\n  if (isMember) {\n    return (\n      <ActionsRowContainer>\n        {isTeamMember && (\n          <OutlineButton to={`/${community.slug}/settings`}>\n            Settings\n          </OutlineButton>\n        )}\n      </ActionsRowContainer>\n    );\n  }\n\n  if (community.redirect) {\n    return <div style={{ padding: '8px' }} />;\n  }\n\n  return <div style={{ padding: '8px' }} />;\n};\n\nexport const CommunityActions = connect()(UnconnectedCommunityActions);\n"
  },
  {
    "path": "src/components/entities/profileCards/components/communityMeta.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport addProtocolToString from 'shared/normalize-url';\nimport Icon from 'src/components/icon';\nimport {\n  MetaContainer,\n  Name,\n  Description,\n  MetaLinksContainer,\n  MetaRow,\n} from '../style';\n\ntype Props = {\n  // TODO: Properly type this\n  community: Object,\n};\n\nexport const CommunityMeta = (props: Props) => {\n  const { community } = props;\n  const { description, website } = community;\n  const formattedDescription = description && renderTextWithLinks(description);\n  const formattedWebsite = website && addProtocolToString(website);\n\n  return (\n    <MetaContainer>\n      <Link to={`/${community.slug}`}>\n        <Name>{community.name}</Name>\n      </Link>\n\n      {formattedDescription && (\n        <Description>{formattedDescription}</Description>\n      )}\n\n      <MetaLinksContainer>\n        {formattedWebsite && (\n          <MetaRow>\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={formattedWebsite}\n            >\n              <Icon glyph={'link'} size={20} /> {website}\n            </a>\n          </MetaRow>\n        )}\n      </MetaLinksContainer>\n    </MetaContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/components/userActions.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { openModal } from 'src/actions/modals';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { HoverWarnOutlineButton, OutlineButton } from 'src/components/button';\nimport { ActionsRowContainer } from '../style';\nimport { isAdmin } from 'src/helpers/is-admin';\n\ntype Props = {\n  user: UserInfoType,\n  currentUser: ?UserInfoType,\n  dispatch: Dispatch<Object>,\n};\n\nexport const UnconnectedUserActions = (props: Props) => {\n  const { user, currentUser, dispatch } = props;\n\n  if (!user) return null;\n\n  const initBan = () => {\n    return dispatch(openModal('BAN_USER_MODAL', { user }));\n  };\n\n  return (\n    <ActionsRowContainer>\n      {currentUser && currentUser.id === user.id && (\n        <OutlineButton to={`/users/${user.username}/settings`}>\n          Settings\n        </OutlineButton>\n      )}\n\n      {currentUser && user.id !== currentUser.id && isAdmin(currentUser.id) && (\n        <HoverWarnOutlineButton onClick={initBan}>Ban</HoverWarnOutlineButton>\n      )}\n    </ActionsRowContainer>\n  );\n};\n\nexport const UserActions = compose(\n  withCurrentUser,\n  connect()\n)(UnconnectedUserActions);\n"
  },
  {
    "path": "src/components/entities/profileCards/components/userMeta.js",
    "content": "// @flow\nimport React from 'react';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport addProtocolToString from 'shared/normalize-url';\nimport Icon from 'src/components/icon';\nimport GithubProfile from 'src/components/githubProfile';\nimport {\n  MetaContainer,\n  Name,\n  Description,\n  MetaLinksContainer,\n  MetaRow,\n  Username,\n} from '../style';\n\ntype Props = {\n  user: UserInfoType,\n};\n\nexport const UserMeta = (props: Props) => {\n  const { user } = props;\n  const { description, website } = user;\n  const formattedDescription = description && renderTextWithLinks(description);\n  const formattedWebsite = website && addProtocolToString(website);\n\n  return (\n    <MetaContainer>\n      <Name>{user.name}</Name>\n      {user.username && <Username>@{user.username}</Username>}\n\n      {formattedDescription && (\n        <Description>{formattedDescription}</Description>\n      )}\n\n      <MetaLinksContainer>\n        {formattedWebsite && (\n          <MetaRow>\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={formattedWebsite}\n            >\n              <Icon glyph={'link'} size={20} /> {website}\n            </a>\n          </MetaRow>\n        )}\n\n        <GithubProfile\n          id={user.id}\n          render={profile => {\n            if (!profile) {\n              return null;\n            } else {\n              return (\n                <MetaRow>\n                  <a\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                    href={`https://github.com/${profile.username}`}\n                  >\n                    <Icon glyph={'github'} size={20} /> @{profile.username}\n                  </a>\n                </MetaRow>\n              );\n            }\n          }}\n        />\n      </MetaLinksContainer>\n    </MetaContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/entities/profileCards/index.js",
    "content": "// @flow\nimport { ChannelProfileCard } from './channel';\nimport { UserProfileCard } from './user';\nimport { CommunityProfileCard } from './community';\n\nexport { ChannelProfileCard, CommunityProfileCard, UserProfileCard };\n"
  },
  {
    "path": "src/components/entities/profileCards/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Truncate } from 'src/components/globals';\nimport { MEDIA_BREAK, MAX_SECONDARY_COLUMN_WIDTH } from 'src/components/layout';\n\nexport const ProfileContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  position: relative;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n    margin-top: 0;\n    border: 0;\n  }\n`;\n\nexport const CoverPhoto = styled.div`\n  position: relative;\n  width: 100%;\n  height: 100%;\n  min-height: ${MAX_SECONDARY_COLUMN_WIDTH / 3}px;\n  max-height: ${MAX_SECONDARY_COLUMN_WIDTH / 3}px;\n  background-color: ${theme.text.default};\n  overflow: hidden;\n  background-image: url(${props => props.src});\n  background-size: cover;\n  background-position: center center;\n  border-radius: 4px 4px 0 0;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n  }\n`;\n\nexport const ProfileAvatarContainer = styled.div`\n  position: relative;\n  top: -36px;\n  width: 68px;\n  height: 68px;\n  margin-left: 12px;\n  border-radius: 10px;\n  background: ${theme.bg.default};\n  border: 4px solid ${theme.bg.default};\n  margin-bottom: -44px;\n`;\n\nexport const RoundProfileAvatarContainer = styled.div`\n  position: relative;\n  top: -36px;\n  width: 68px;\n  height: 68px;\n  margin-left: 12px;\n  border-radius: 34px;\n  background: ${theme.bg.default};\n  border: 4px solid ${theme.bg.default};\n  margin-bottom: -48px;\n`;\n\nexport const ActionsRowContainer = styled.div`\n  display: grid;\n  align-items: center;\n  grid-gap: 12px;\n  padding: 16px 16px 20px;\n  margin-top: 8px;\n\n  button {\n    flex: 1;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-bottom: 1px solid ${theme.bg.border};\n    margin-top: 0;\n    padding-bottom: 16px;\n  }\n`;\n\nexport const MetaContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  padding: 0 16px;\n  margin-top: 16px;\n`;\n\nexport const Name = styled.h1`\n  font-size: 24px;\n  font-weight: 800;\n  color: ${theme.text.default};\n  word-break: break-word;\n  line-height: 1.2;\n`;\n\nexport const Description = styled.p`\n  margin-top: 8px;\n  margin-bottom: 4px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n  word-break: break-word;\n\n  a {\n    color: ${theme.text.default};\n    font-weight: 500;\n\n    &:hover {\n      text-decoration: underline;\n    }\n  }\n`;\n\nexport const MetaLinksContainer = styled.div`\n  margin-top: 4px;\n`;\n\nexport const MetaRow = styled.div`\n  display: flex;\n  font-size: 16px;\n  font-weight: 400;\n  color: ${theme.text.secondary};\n  align-items: center;\n  margin-top: 8px;\n  word-break: break-word;\n\n  &:first-of-type {\n    margin-top: 8px;\n  }\n\n  a {\n    display: flex;\n    align-items: center;\n  }\n\n  a:hover {\n    color: ${theme.text.default};\n  }\n\n  .icon {\n    margin-right: 8px;\n  }\n`;\n\nexport const ChannelCommunityMetaRow = styled.div`\n  display: flex;\n  padding: 16px;\n  margin-bottom: -12px;\n  align-items: center;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: transparent;\n\n  &:hover {\n    background: ${theme.bg.wash};\n  }\n`;\n\nexport const ChannelCommunityName = styled.div`\n  font-size: 18px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  margin-left: 16px;\n  ${Truncate};\n`;\n\nexport const Username = styled.div`\n  font-size: 18px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  margin-bottom: 4px;\n  word-break: break-all;\n  margin-top: 2px;\n`;\n"
  },
  {
    "path": "src/components/entities/profileCards/user.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { UserAvatar } from 'src/components/avatar';\nimport { UserActions } from './components/userActions';\nimport { UserMeta } from './components/userMeta';\nimport {\n  ProfileContainer,\n  CoverPhoto,\n  RoundProfileAvatarContainer,\n} from './style';\n\ntype Props = {\n  user: UserInfoType,\n};\n\nexport const UserProfileCard = (props: Props) => {\n  const { user } = props;\n\n  return (\n    <ProfileContainer>\n      <Link to={`/users/${user.username}`}>\n        <CoverPhoto src={user.coverPhoto} />\n      </Link>\n\n      <RoundProfileAvatarContainer>\n        <UserAvatar showHoverProfile={false} size={60} user={user} />\n      </RoundProfileAvatarContainer>\n\n      <UserMeta user={user} />\n\n      <UserActions user={user} />\n    </ProfileContainer>\n  );\n};\n"
  },
  {
    "path": "src/components/error/BlueScreen.js",
    "content": "// @flow\n// This component is shown as a full replacement for the entire app in production whenever an error happens that would otherwise crash the app\nimport React from 'react';\nimport ViewError from '../viewError';\n\nconst BlueScreen = () => {\n  return (\n    <ViewError\n      heading={'Something went wrong'}\n      subheading={\n        'Sorry about the technical issues. Brian and Max have been notified of the problem and should resolve it soon.'\n      }\n      refresh\n    />\n  );\n};\n\nexport default BlueScreen;\n"
  },
  {
    "path": "src/components/error/ErrorBoundary.js",
    "content": "// @flow\nimport * as React from 'react';\nimport BlueScreen from './BlueScreen';\n\ntype State = {\n  error: ?any,\n};\n\ntype Props = {\n  children: any,\n  fallbackComponent?: ?any,\n};\n\nclass ErrorBoundary extends React.Component<Props, State> {\n  state = { error: null };\n\n  componentDidCatch = (error: any, errorInfo: any) => {\n    this.setState({ error });\n    console.error({ error });\n    window.Raven && window.Raven.captureException(error, { extra: errorInfo });\n  };\n\n  render() {\n    const { error } = this.state;\n    const {\n      fallbackComponent: FallbackComponent = null,\n      children,\n    } = this.props;\n\n    if (error) {\n      if (this.props.fallbackComponent) {\n        // $FlowFixMe\n        return <FallbackComponent />;\n      }\n\n      if (!this.props.fallbackComponent) {\n        return null;\n      }\n\n      return <BlueScreen />;\n    }\n\n    return children;\n  }\n}\n\nexport default ErrorBoundary;\n"
  },
  {
    "path": "src/components/error/SettingsFallback.js",
    "content": "// @flow\nimport * as React from 'react';\nimport {\n  SectionCard,\n  SectionTitle,\n  SectionSubtitle,\n  SectionCardFooter,\n} from 'src/components/settingsViews/style';\nimport { PrimaryButton } from 'src/components/button';\n\nclass SettingsFallback extends React.Component<{}> {\n  render() {\n    return (\n      <SectionCard>\n        <SectionTitle>\n          <span\n            role=\"img\"\n            aria-label=\"sad emoji\"\n            style={{ marginRight: '8px' }}\n          >\n            😔\n          </span>{' '}\n          Something has gone wrong\n        </SectionTitle>\n        <SectionSubtitle>\n          There was an error loading this information. Our team has been alerted\n          and will fix this as soon as possible.\n        </SectionSubtitle>\n\n        <SectionCardFooter>\n          <PrimaryButton onClick={() => window.location.reload(true)}>\n            Refresh the page\n          </PrimaryButton>\n        </SectionCardFooter>\n      </SectionCard>\n    );\n  }\n}\n\nexport default SettingsFallback;\n"
  },
  {
    "path": "src/components/error/index.js",
    "content": "// @flow\nimport ErrorBoundary from './ErrorBoundary';\nimport SettingsFallback from './SettingsFallback';\nimport BlueScreen from './BlueScreen';\n\nexport { ErrorBoundary, SettingsFallback };\nexport default BlueScreen;\n"
  },
  {
    "path": "src/components/flyout/index.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { FlexCol, FlexRow, zIndex } from '../globals';\n\nconst StyledFlyout = styled(FlexRow)`\n  background-color: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  border-radius: 4px;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n  position: absolute;\n  flex: 0 0 auto;\n  right: -25%;\n  top: 36px;\n  z-index: ${zIndex.flyout};\n  color: ${theme.text.default};\n  ${props => props.style};\n`;\n\nconst StyledRow = styled(FlexCol)`\n  display: flex;\n  align-items: stretch;\n  position: relative;\n  flex: 1;\n`;\n\nconst Flyout = (props: Object): React$Element<any> => (\n  <StyledFlyout className={'flyout'} {...props}>\n    <StyledRow>{props.children}</StyledRow>\n  </StyledFlyout>\n);\n\nexport default Flyout;\n"
  },
  {
    "path": "src/components/formElements/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Icon from 'src/components/icon';\nimport { WhiteOutlineButton } from 'src/components/button';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\n\nimport {\n  StyledLabel,\n  StyledPrefixLabel,\n  StyledInput,\n  StyledTextArea,\n  StyledUnderlineInput,\n  StyledHiddenInput,\n  StyledCheckboxWrapper,\n  StyledError,\n  StyledSuccess,\n  PhotoInputLabel,\n  CoverInputLabel,\n  InputOverlay,\n  CoverImage,\n  PhotoInputImage,\n} from './style';\n\ntype InputProps = {\n  children?: React$Node,\n  inputType?: string,\n  defaultValue?: ?string,\n  value?: ?any,\n  placeholder?: string,\n  onChange?: Function,\n  autoFocus?: boolean,\n  checked?: boolean,\n  disabled?: boolean,\n  id?: string,\n  dataCy?: string,\n  user?: GetUserType,\n  community?: GetCommunityType,\n  size?: number,\n};\n\nexport const Input = (props: InputProps) => {\n  return (\n    <StyledLabel {...props}>\n      {props.children}\n      <StyledInput\n        id={props.id}\n        type={props.inputType}\n        defaultValue={props.defaultValue}\n        value={props.value}\n        placeholder={props.placeholder}\n        onChange={props.onChange}\n        autoFocus={props.autoFocus}\n        disabled={props.disabled}\n        data-cy={props.dataCy}\n      />\n    </StyledLabel>\n  );\n};\n\ntype PhotoInputProps = {\n  size?: number,\n  type: 'user' | 'community',\n  defaultValue: string,\n  onChange: Function,\n  dataCy?: string,\n};\n\nexport const PhotoInput = (props: PhotoInputProps) => {\n  const { size = 48, type, defaultValue, onChange, dataCy } = props;\n\n  let visible,\n    src = defaultValue;\n  if (!src || src.length === 0) {\n    visible = true;\n    src =\n      type === 'user'\n        ? '/img/default_avatar.svg'\n        : '/img/default_community.svg';\n  }\n\n  return (\n    <PhotoInputLabel type={type} size={size}>\n      <InputOverlay type={type} size={size} visible={visible}>\n        <Icon glyph=\"photo\" />\n      </InputOverlay>\n\n      <PhotoInputImage\n        type={type}\n        alt={'Profile photo'}\n        src={src}\n        size={size}\n      />\n\n      <StyledHiddenInput\n        type=\"file\"\n        id=\"file\"\n        name=\"file\"\n        accept={'.png, .jpg, .jpeg'}\n        multiple={false}\n        onChange={onChange}\n        data-cy={dataCy}\n      />\n    </PhotoInputLabel>\n  );\n};\n\ntype CoverPhotoInputProps = {\n  defaultValue: string,\n  onChange: Function,\n  dataCy?: string,\n};\n\nexport const CoverInput = (props: CoverPhotoInputProps) => {\n  return (\n    <CoverInputLabel>\n      <InputOverlay\n        visible={!props.defaultValue || props.defaultValue.length === 1}\n      >\n        <WhiteOutlineButton as={'div'}>Add Cover Photo</WhiteOutlineButton>\n      </InputOverlay>\n      <CoverImage\n        src={props.defaultValue ? `${props.defaultValue}` : ''}\n        role=\"presentation\"\n      />\n      <StyledHiddenInput\n        type=\"file\"\n        id=\"file\"\n        name=\"file\"\n        accept={\n          props.allowGif ? '.png, .jpg, .jpeg, .gif, .mp4' : '.png, .jpg, .jpeg'\n        }\n        multiple={false}\n        onChange={props.onChange}\n        data-cy={props.dataCy}\n      />\n    </CoverInputLabel>\n  );\n};\n\nexport const Checkbox = (props: InputProps) => {\n  return (\n    <StyledLabel>\n      <StyledCheckboxWrapper\n        disabled={props.disabled || false}\n        align={props.align || 'center'}\n        data-cy={\n          props.dataCy\n            ? `${props.dataCy}-${props.checked ? 'checked' : 'unchecked'}`\n            : null\n        }\n      >\n        {props.checked ? <Icon glyph=\"checkmark\" /> : <Icon glyph=\"checkbox\" />}\n        <StyledHiddenInput\n          type=\"checkbox\"\n          id={props.id}\n          checked={props.checked}\n          disabled={props.disabled || false}\n          onChange={props.onChange}\n          data-cy={props.dataCy}\n        />\n        {props.children}\n      </StyledCheckboxWrapper>\n    </StyledLabel>\n  );\n};\n\nexport const TextArea = (props: InputProps) => {\n  return (\n    <StyledLabel>\n      {props.children}\n      <StyledTextArea\n        id={props.id}\n        placeholder={props.placeholder}\n        defaultValue={props.defaultValue}\n        onChange={props.onChange}\n        autoFocus={props.autoFocus}\n        data-cy={props.dataCy}\n      />\n    </StyledLabel>\n  );\n};\n\nexport class UnderlineInput extends React.Component<InputProps> {\n  render() {\n    return (\n      <StyledPrefixLabel disabled={this.props.disabled}>\n        {this.props.children}\n        <StyledUnderlineInput\n          type=\"text\"\n          id={this.props.id}\n          placeholder={this.props.placeholder}\n          value={this.props.value || this.props.defaultValue}\n          onChange={this.props.onChange}\n          autoFocus={this.props.autoFocus}\n          disabled={this.props.disabled}\n          data-cy={this.props.dataCy}\n        />\n      </StyledPrefixLabel>\n    );\n  }\n}\n\nexport const Error = (props: Object) => {\n  const { children, ...rest } = props;\n  return <StyledError {...rest}>{children}</StyledError>;\n};\n\nexport const Success = (props: Object) => {\n  const { children, ...rest } = props;\n  return <StyledSuccess {...rest}>{children}</StyledSuccess>;\n};\n"
  },
  {
    "path": "src/components/formElements/style.js",
    "content": "import styled, { css } from 'styled-components';\nimport theme from 'shared/theme';\nimport { FlexRow, Transition, hexa, zIndex } from '../globals';\nimport Textarea from 'react-textarea-autosize';\n\nexport const StyledLabel = styled.label`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  margin-top: 12px;\n  font-weight: 500;\n  font-size: 14px;\n  letter-spacing: -0.4px;\n  color: ${theme.text.default};\n  transition: ${Transition.hover.off};\n  position: relative;\n\n  a {\n    text-decoration: underline;\n  }\n\n  &:hover > input,\n  &:hover > textarea {\n    border-color: ${props =>\n      props.disabled ? props.theme.bg.border : props.theme.text.alt};\n    transition: ${Transition.hover.on};\n  }\n\n  &:hover > input:focus,\n  &:hover > textarea:focus {\n    border-color: ${props =>\n      props.disabled ? props.theme.bg.inactive : props.theme.brand.alt};\n  }\n`;\n\nexport const StyledPrefixLabel = styled.label`\n  display: flex;\n  width: 100%;\n  margin-top: 4px;\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.placeholder};\n  white-space: nowrap;\n  text-overflow: ellipsis;\n\n  > input {\n    margin-left: 2px;\n  }\n\n  &:hover > input {\n    border-color: ${props =>\n      props.disabled ? props.theme.bg.inactive : props.theme.text.alt};\n    transition: ${Transition.hover.on};\n  }\n`;\n\nexport const StyledInput = styled.input`\n  flex: 1 0 auto;\n  background: ${props =>\n    props.disabled ? props.theme.bg.wash : props.theme.bg.default};\n  font-weight: 500;\n  width: 100%;\n  font-size: 14px;\n  border: 2px solid\n    ${props =>\n      props.disabled ? props.theme.bg.border : props.theme.bg.inactive};\n  border-radius: 4px;\n  padding: 8px 12px;\n  margin-top: 2px;\n  box-shadow: none;\n  transition: ${Transition.hover.off};\n\n  ${props =>\n    props.type === 'checkbox' &&\n    css`\n      flex: initial;\n      width: initial;\n      margin-right: 0.5em;\n    `} &::placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n\n  &:focus {\n    border-color: ${theme.brand.default};\n    transition: ${Transition.hover.on};\n  }\n\n  &[type='file'] {\n    position: absolute;\n    left: -9999px;\n    top: -9999px;\n    visibility: hidden;\n  }\n`;\n\nexport const StyledTextArea = styled(Textarea)`\n  flex: 1 0 auto;\n  width: 100%;\n  background: ${theme.bg.default};\n  font-weight: 500;\n  font-size: 14px;\n  border: 2px solid ${theme.bg.inactive};\n  border-radius: 4px;\n  padding: 12px;\n  margin-top: 2px;\n  box-shadow: none;\n  transition: ${Transition.hover.off};\n\n  &::placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n\n  &:focus {\n    border-color: ${theme.brand.default};\n    transition: ${Transition.hover.on};\n  }\n`;\n\nexport const StyledUnderlineInput = styled.input`\n  font-size: inherit;\n  font-weight: inherit;\n  color: ${props =>\n    props.disabled ? props.theme.text.alt : props.theme.text.default};\n  border-bottom: ${props =>\n    props.disabled\n      ? '2px solid transparent'\n      : `2px solid ${props.theme.bg.inactive}`};\n  width: 50%;\n  transition: ${Transition.hover.off};\n\n  &:hover {\n    border-color: ${props => (props.disabled ? 'transparent' : 'inherit')};\n    transition: ${Transition.hover.on};\n  }\n\n  &:focus {\n    border-color: ${theme.brand.default};\n    transition: ${Transition.hover.on};\n  }\n`;\n\nexport const StyledHiddenInput = styled.input`\n  visibility: hidden;\n  width: 0;\n  height: 0;\n`;\n\nexport const StyledCheckboxWrapper = styled(FlexRow)`\n  color: ${theme.text.alt};\n  display: flex;\n  align-items: ${props => props.align};\n  line-height: 1.4;\n  cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};\n\n  &:hover {\n    color: ${({ theme, disabled }) =>\n      disabled ? theme.text.alt : theme.brand.alt};\n  }\n\n  > div {\n    margin-left: -6px;\n    margin-right: 6px;\n  }\n\n  > a {\n    text-decoration: none;\n    color: ${theme.brand.alt};\n    font-weight: 600;\n    border-bottom: 2px solid transparent;\n    position: relative;\n    padding-bottom: 0px;\n    transition: ${Transition.hover.off};\n\n    &:hover {\n      border-bottom: 2px solid ${theme.brand.alt};\n      padding-bottom: 2px;\n      transition: ${Transition.hover.on};\n    }\n  }\n`;\n\nexport const StyledError = styled.p`\n  font-size: 14px;\n  color: ${theme.warn.default};\n  padding: 8px 0 16px;\n  line-height: 1.4;\n  font-weight: 600;\n\n  a {\n    text-decoration: underline;\n  }\n`;\n\nexport const StyledSuccess = styled.p`\n  font-size: 14px;\n  color: ${theme.success.default};\n  padding: 8px 0 16px;\n  line-height: 1.4;\n  font-weight: 600;\n`;\n\nexport const PhotoInputLabel = styled.label`\n  position: relative;\n  height: ${props => `${props.size}px`};\n  z-index: ${zIndex.form + 1};\n  width: ${props => `${props.size}px`};\n  border-radius: ${props =>\n    props.type === 'user' ? `${props.size}px` : '8px'};\n  margin-top: 8px;\n  background-color: ${theme.bg.reverse};\n`;\n\nexport const PhotoInputImage = styled.img`\n  width: ${props => `${props.size}px`};\n  height: ${props => `${props.size}px`};\n  border-radius: ${props =>\n    props.type === 'user' ? `${props.size}px` : '8px'};\n  box-shadow: 0 0 0 2px ${theme.bg.default};\n`;\n\nexport const CoverInputLabel = styled.label`\n  position: relative;\n  height: 114px;\n  max-width: 342px;\n  z-index: ${zIndex.form};\n  width: 100%;\n  margin-top: 8px;\n  border-radius: 8px;\n  background-color: ${theme.bg.reverse};\n`;\n\nexport const ProfileImage = styled.img`\n  position: absolute;\n  object-fit: cover;\n  z-index: ${zIndex.form + 1};\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border-radius: ${props =>\n    props.type === 'user' ? `${props.size}px` : '8px'};\n  border: 2px solid ${theme.text.reverse};\n`;\n\nexport const CoverImage = styled.div`\n  background-color: ${theme.brand.default};\n  background-image: url('${props => props.src}');\n  background-position: center;\n  background-size: cover;\n  position: absolute;\n  z-index: ${zIndex.form};\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 114px;\n  border-radius: 8px;\n`;\n\nexport const InputOverlay = styled.div`\n  position: absolute;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: ${zIndex.form + 2};\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  color: ${theme.text.reverse};\n  background-color: ${({ theme }) => hexa(theme.bg.reverse, 0.6)};\n  padding: 8px;\n  border-radius: ${props =>\n    props.type === 'user' ? `${props.size}px` : '8px'};\n  opacity: ${props => (props.visible ? '1' : '0')};\n  transition: ${Transition.hover.off};\n\n  &:hover {\n    opacity: 1;\n    transition: ${Transition.hover.on};\n\n    + img,\n    + div {\n      transition: ${Transition.hover.on};\n      opacity: 0.25;\n    }\n  }\n\n  &:hover div {\n    transition: ${Transition.hover.on};\n  }\n`;\n"
  },
  {
    "path": "src/components/fullscreenView/index.js",
    "content": "// @flow\nimport React, { Component } from 'react';\nimport {\n  ClusterOne,\n  ClusterTwo,\n  ClusterThree,\n  ClusterFour,\n} from 'src/components/illustrations';\nimport Icon from 'src/components/icon';\nimport { FullscreenViewContainer, Illustrations, CloseLink } from './style';\nimport { ESC } from 'src/helpers/keycodes';\n\ntype Props = {\n  closePath: string,\n  children: any,\n};\n\nclass FullscreenView extends Component<Props> {\n  componentDidMount() {\n    document.addEventListener('keydown', this.handleKeyPress, false);\n  }\n\n  componentWillUnmount() {\n    document.removeEventListener('keydown', this.handleKeyPress, false);\n  }\n\n  handleKeyPress = (e: any) => {\n    const { closePath } = this.props;\n    // if person taps esc, close the dialog\n    if (closePath && e.keyCode === ESC) {\n      return (window.location = closePath);\n    }\n  };\n\n  render() {\n    const { closePath, children } = this.props;\n\n    return (\n      <FullscreenViewContainer>\n        <CloseLink href={closePath}>\n          <Icon glyph={'view-close'} size={32} />\n        </CloseLink>\n\n        <Illustrations>\n          <ClusterOne src=\"/img/cluster-2.svg\" role=\"presentation\" />\n          <ClusterTwo src=\"/img/cluster-1.svg\" role=\"presentation\" />\n          <ClusterThree src=\"/img/cluster-5.svg\" role=\"presentation\" />\n          <ClusterFour src=\"/img/cluster-4.svg\" role=\"presentation\" />\n        </Illustrations>\n\n        {children}\n      </FullscreenViewContainer>\n    );\n  }\n}\n\nexport default FullscreenView;\n"
  },
  {
    "path": "src/components/fullscreenView/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { zIndex } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const FullscreenViewContainer = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  width: 100%;\n  height: 100%;\n  background: #fff;\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  flex-direction: column;\n  z-index: ${zIndex.fullscreen};\n  overflow-y: auto;\n  -webkit-transform: translate3d(0, 0, 0);\n`;\n\nexport const Illustrations = styled.span`\n  z-index: ${zIndex.background};\n\n  @media screen and (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const CloseLink = styled.a`\n  color: ${theme.text.default};\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  cursor: pointer;\n`;\n"
  },
  {
    "path": "src/components/gallery/browser.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { closeGallery } from 'src/actions/gallery';\nimport type { GetMediaMessagesForThreadType } from 'shared/graphql/queries/message/getMediaMessagesForThread';\nimport type { Dispatch } from 'redux';\nimport {\n  Overlay,\n  ActiveImage,\n  Minigallery,\n  MiniImg,\n  MiniContainer,\n  CloseButton,\n  GalleryWrapper,\n} from './style';\nimport { ESC, ARROW_LEFT, ARROW_RIGHT } from 'src/helpers/keycodes';\n\ntype State = {\n  images: Array<Object>,\n  activeMessageId: string,\n  index: ?number,\n};\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  data: {\n    messages?: GetMediaMessagesForThreadType,\n  },\n  activeMessageId: string,\n};\n\nclass Browser extends React.Component<Props, State> {\n  constructor(props) {\n    super(props);\n    // if there are no messages found\n    if (!props.data.messages || props.data.messages.length === 0) {\n      this.state = {\n        images: [],\n        activeMessageId: props.activeMessageId,\n        index: null,\n      };\n    }\n\n    let index;\n    props.data.messages.map((message, i) => {\n      if (message.id === props.activeMessageId) {\n        index = i;\n        return message;\n      } else {\n        return message;\n      }\n    });\n\n    this.state = {\n      images: props.data.messages,\n      activeMessageId: props.activeMessageId,\n      index,\n    };\n  }\n\n  componentDidMount() {\n    // $FlowFixMe\n    document.addEventListener('keydown', this.handleKeyPress, false);\n  }\n\n  componentWillUnmount() {\n    // $FlowFixMe\n    document.removeEventListener('keydown', this.handleKeyPress, false);\n  }\n\n  closeGallery = () => {\n    this.props.dispatch(closeGallery());\n  };\n\n  handleKeyPress = e => {\n    const { images } = this.state;\n    // if no media, skip on outta here\n    if (!images) return;\n\n    if (e.keyCode === ESC) {\n      this.closeGallery();\n    }\n\n    if (e.keyCode === ARROW_LEFT) {\n      this.previousImage();\n    }\n\n    if (e.keyCode === ARROW_RIGHT) {\n      this.nextImage();\n    }\n  };\n\n  previousImage = () => {\n    let { index, images } = this.state;\n\n    if (index === null) return;\n\n    if (index === 0) {\n      index = images.length - 1;\n      this.setState({\n        index,\n      });\n    } else {\n      // $FlowFixMe\n      index -= 1;\n\n      this.setState({\n        index,\n      });\n    }\n  };\n\n  nextImage = () => {\n    let { index, images } = this.state;\n    if (index === images.length - 1) {\n      index = 0;\n      this.setState({\n        index,\n      });\n    } else {\n      index += 1;\n\n      this.setState({\n        index,\n      });\n    }\n  };\n\n  setCount = i => {\n    this.setState({\n      index: i,\n    });\n  };\n\n  render() {\n    const { images, index } = this.state;\n    const {\n      data: { messages },\n    } = this.props;\n\n    if (!messages || messages.length === 0) return null;\n\n    // when a user uploads an image, sometimes the resulting image doesn't get updated in the Apollo cache\n    // if it doesn't update in the cache, then the browser component will receive a bad `activeMessageId`\n    // prop. If it's the case that this happens, we just select the *last* image, assuming it's the one that the user just uploaded.\n    let filteredIndex = typeof index === 'number' ? index : messages.length - 1;\n\n    const src = `${images[filteredIndex].content.body}`;\n\n    return (\n      <GalleryWrapper>\n        <CloseButton onClick={this.closeGallery}>✕</CloseButton>\n        <Overlay onClick={this.closeGallery} onKeyDown={this.handleKeyPress} />\n        <ActiveImage onClick={this.nextImage} src={src} />\n        <Minigallery>\n          <MiniContainer>\n            {images.map((image, i) => {\n              return (\n                <MiniImg\n                  src={`${image.content.body}`}\n                  key={i}\n                  onClick={() => this.setCount(i)}\n                  active={i === filteredIndex}\n                />\n              );\n            })}\n          </MiniContainer>\n        </Minigallery>\n      </GalleryWrapper>\n    );\n  }\n}\n\nexport default connect()(Browser);\n"
  },
  {
    "path": "src/components/gallery/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport getMediaMessagesForThread from 'shared/graphql/queries/message/getMediaMessagesForThread';\nimport { displayLoadingGallery } from 'src/components/loading';\nimport Browser from './browser';\n\nconst GalleryWithMedia = compose(\n  getMediaMessagesForThread,\n  displayLoadingGallery\n)(Browser);\n\ntype Props = {\n  isOpen: boolean,\n  threadId: string,\n  activeMessageId: string,\n};\n\nclass Gallery extends React.Component<Props> {\n  render() {\n    const { isOpen, threadId, activeMessageId } = this.props;\n\n    if (isOpen) {\n      return (\n        <GalleryWithMedia\n          threadId={threadId}\n          activeMessageId={activeMessageId}\n        />\n      );\n    } else {\n      return null;\n    }\n  }\n}\n\nconst mapStateToProps = state => ({\n  threadId: state.gallery.threadId,\n  activeMessageId: state.gallery.messageId,\n  isOpen: state.gallery.isOpen,\n});\n\nexport default compose(\n  // $FlowIssue\n  connect(mapStateToProps)\n)(Gallery);\n"
  },
  {
    "path": "src/components/gallery/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Shadow, zIndex } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const GalleryWrapper = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  width: 100%;\n  height: 100%;\n  z-index: ${zIndex.fullscreen};\n`;\n\nexport const Overlay = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: ${theme.bg.reverse};\n  opacity: 0.95;\n  z-index: ${zIndex.fullscreen + 1};\n`;\n\nexport const ActiveImage = styled.img`\n  position: absolute;\n  left: 50%;\n  top: 47%;\n  transform: translate(-50%, -50%);\n  object-fit: cover;\n  max-height: 90%;\n  width: 100%;\n  max-width: ${MEDIA_BREAK}px;\n  margin: auto 0 5rem;\n  box-shadow: ${Shadow.high};\n  z-index: ${zIndex.fullscreen + 2};\n`;\n\nexport const Minigallery = styled.div`\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  width: 100%;\n  padding: 0.25rem;\n  background: #000;\n  max-height: 3rem;\n  z-index: ${zIndex.fullscreen + 1};\n`;\nexport const MiniImg = styled.img`\n  height: 2rem;\n  border-radius: 2px;\n  margin: 0.25rem;\n  opacity: ${props => (props.active ? 1 : 0.5)};\n  transition: opacity 0.2s ease-in-out;\n  max-width: 64px;\n\n  &:hover {\n    transition: opacity 0.2s ease-in-out;\n    cursor: pointer;\n    opacity: ${props => (props.active ? 1 : 0.7)};\n  }\n`;\n\nexport const MiniContainer = styled.div`\n  display: flex;\n  justify-content: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    justify-content: flex-start;\n    overflow-x: scroll;\n  }\n`;\n\nexport const CloseButton = styled.button`\n  position: absolute;\n  -webkit-appearance: none;\n  top: 4px;\n  right: 4px;\n  padding: 8px 12px;\n  border-radius: 23px;\n  background: #000;\n  color: rgba(255, 255, 255, 0.8);\n  font-size: 20px;\n  font-weight: 400;\n  text-transform: uppercase;\n  z-index: ${zIndex.fullscreen + 2};\n  cursor: pointer;\n\n  &:hover {\n    color: #fff;\n  }\n`;\n"
  },
  {
    "path": "src/components/githubProfile/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from '../viewNetworkHandler';\nimport getUserGithubProfile, {\n  type GetUserGithbProfileType,\n} from 'shared/graphql/queries/user/getUserGithubProfile';\n\ntype Props = {\n  id: string,\n  ...$Exact<ViewNetworkHandlerType>,\n  data: {\n    user?: GetUserGithbProfileType,\n  },\n  render: Function,\n};\n\nclass GithubProfile extends React.Component<Props> {\n  render() {\n    const {\n      data: { user },\n      render,\n    } = this.props;\n\n    if (user) {\n      if (!user.githubProfile || !user.githubProfile.id) return render(null);\n      return render(user.githubProfile);\n    }\n\n    return null;\n  }\n}\n\nexport default compose(\n  getUserGithubProfile,\n  viewNetworkHandler\n)(GithubProfile);\n"
  },
  {
    "path": "src/components/globals/index.js",
    "content": "/* eslint no-eval: 0 */\nimport theme from 'shared/theme';\nimport styled, { css, keyframes } from 'styled-components';\n\nexport const Gradient = (g1, g2) =>\n  css`radial-gradient(ellipse farthest-corner at top left, ${g1} 0%, ${g2} 100%)`;\n\nexport const Truncate = () => css`\n  text-overflow: ellipsis;\n  overflow: hidden;\n  white-space: nowrap;\n  min-width: 0;\n`;\n\nexport const tint = (hex: string, amount: number) => {\n  let R = parseInt(hex.substring(1, 3), 16);\n  let G = parseInt(hex.substring(3, 5), 16);\n  let B = parseInt(hex.substring(5, 7), 16);\n\n  const getSingle = (number: number) =>\n    parseInt((number * (100 + amount)) / 100, 10);\n\n  R = getSingle(R);\n  G = getSingle(G);\n  B = getSingle(B);\n\n  R = R < 255 ? R : 255;\n  G = G < 255 ? G : 255;\n  B = B < 255 ? B : 255;\n\n  const getDouble = (number: number) =>\n    number.toString(16).length === 1\n      ? `0${number.toString(16)}`\n      : number.toString(16);\n\n  const RR = getDouble(R);\n  const GG = getDouble(G);\n  const BB = getDouble(B);\n\n  return `#${RR}${GG}${BB}`;\n};\n\nexport const hexa = (hex, alpha) => {\n  var r = parseInt(hex.slice(1, 3), 16),\n    g = parseInt(hex.slice(3, 5), 16),\n    b = parseInt(hex.slice(5, 7), 16);\n\n  if (alpha >= 0) {\n    return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n  } else {\n    return `rgb(${r}, ${g}, ${b})`;\n  }\n};\n\nexport const Shadow = {\n  low: '0 2px 8px',\n  mid: '0 4px 12px',\n  high: '0 8px 16px',\n};\n\nexport const Transition = {\n  hover: {\n    on: 'all 0.2s ease-in',\n    off: 'all 0.2s ease-out',\n  },\n  reaction: {\n    on: 'all 0.15s ease-in',\n    off: 'all 0.1s ease-out',\n  },\n  dropdown: {\n    off: 'all 0.35s ease-out',\n  },\n};\n\nexport const zIndex = new function() {\n  // Write down a camel-cased element descriptor as the name (e.g. modal or chatInput).\n  // Define at a component level here, then use math to handle order at a local level.\n  // (e.g. const ModalInput = styled.input`z-index: zIndex.modal + 1`;)\n  // This uses constructor syntax because that allows self-referential math\n\n  this.base = 1; // z-index: auto content will go here or inherit z-index from a parent\n\n  this.background = this.base - 1; // content that should always be behind other things (e.g. textures/illos)\n  this.hidden = this.base - 2; // this content should be hidden completely (USE ADD'L MEANS OF HIDING)\n\n  this.card = this.base + 1; // all cards should default to one layer above the base content\n  this.loading = this.card + 1; // loading elements should never appear behind cards\n  this.avatar = this.card + 1; // avatars should never appear behind cards\n  this.form = this.card + 1; // form elements should never appear behind cards\n  this.search = this.form; // search is a type of form and should appear at the same level\n  this.dmInput = this.form;\n\n  this.composerToolbar = 2000; // composer toolbar - should sit in between most elements\n\n  this.chrome = 3000; // chrome should be visible in modal contexts\n  this.navBar = this.chrome; // navBar is chrome and should appear at the same level\n  this.mobileInput = this.chrome + 1; // the chatInput on mobile should appear above the navBar\n  this.dropDown = this.chrome + 1; // dropDowns shouldn't appear behind the navBar\n\n  this.slider = window.innerWidth < 768 ? this.chrome + 1 : this.chrome; // slider should appear significantly above the base to leave room for other elements\n  this.composer = 4000; // should cover all screen except toasts\n  this.chatInput = this.slider + 1; // the slider chatInput should always appear above the slider\n  this.flyout = this.chatInput + 3; // flyout may overlap with chatInput and should take precedence\n\n  this.fullscreen = 4000; // fullscreen elements should cover all screen content except toasts\n\n  this.modal = 5000; // modals should completely cover base content and slider as well\n  this.gallery = this.modal + 1; // gallery should never appear behind a modal\n\n  this.toast = 6000; // toasts should be visible in every context\n  this.tooltip = this.toast + 1; // tooltips should always be on top\n}();\n\nexport const fontStack = css`\n  font-family: -apple-system, BlinkMacSystemFont, 'Helvetica', 'Segoe',\n    sans-serif;\n`;\n\nexport const monoStack = css`\n  font-family: 'Input Mono', 'Menlo', 'Inconsolata', 'Roboto Mono', monospace;\n`;\n\nconst spin = keyframes`\n  to {transform: rotate(360deg);}\n`;\n\nexport const Spinner = styled.span`\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n\n  &:before {\n    content: '';\n    box-sizing: border-box;\n    display: inline-block;\n    position: ${props => (props.inline ? 'relative' : 'absolute')};\n    top: ${props => (props.inline ? '0' : '50%')};\n    left: ${props => (props.inline ? '0' : '50%')};\n    width: ${props => (props.size !== undefined ? `${props.size}px` : '16px')};\n    height: ${props => (props.size !== undefined ? `${props.size}px` : '16px')};\n    margin-top: ${props =>\n      props.size !== undefined ? `-${props.size / 2}px` : '-8px'};\n    margin-left: ${props =>\n      props.size !== undefined ? `-${props.size / 2}px` : '-8px'};\n    border-radius: 50%;\n    border: 2px solid\n      ${props =>\n        props.color\n          ? eval(`props.theme.${props.color}`)\n          : props.theme.brand.alt};\n    border-top-color: transparent;\n    border-right-color: ${props =>\n      props.color ? eval(`props.theme.${props.color}`) : props.theme.brand.alt};\n    border-bottom-color: transparent;\n    animation: ${spin} 2s linear infinite;\n  }\n`;\n\nexport const Label = styled.label`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  margin-top: 0.5rem;\n  font-weight: 500;\n  font-size: 0.875rem;\n  letter-spacing: -0.4px;\n  color: ${theme.text.default};\n\n  &:not(:first-of-type) {\n    margin-top: 1.5rem;\n  }\n\n  a {\n    text-decoration: underline;\n  }\n`;\n\nexport const PrefixLabel = styled.label`\n  display: flex;\n  width: 100%;\n  margin-top: 0.25rem;\n  padding-left: 0.875rem;\n  font-size: 0.875rem;\n  font-weight: 500;\n  color: ${theme.text.placeholder};\n\n  > input {\n    margin-left: 2px;\n  }\n`;\n\nexport const Input = styled.input`\n  flex: 1 0 auto;\n  background: ${theme.bg.default};\n  font-weight: 500;\n  width: 100%;\n  font-size: 0.875rem;\n  border: 0.125rem solid ${theme.bg.inactive};\n  border-radius: 0.25rem;\n  padding: 0.5rem 0.75rem;\n  margin-top: 0.125rem;\n  box-shadow: none;\n\n  ${props =>\n    props.type === 'checkbox' &&\n    css`\n      flex: initial;\n      width: initial;\n      margin-right: 0.5rem;\n    `} &::placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n\n  &:focus {\n    border-color: ${theme.brand.default};\n  }\n`;\n\nexport const TextArea = styled.textarea`\n  flex: 1 0 auto;\n  width: 100%;\n  background: ${theme.bg.default};\n  font-weight: 500;\n  font-size: 0.875rem;\n  border: 0.125rem solid ${theme.bg.inactive};\n  border-radius: 0.25rem;\n  padding: 0.75rem;\n  margin-top: 0.125rem;\n  box-shadow: none;\n\n  &::placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n\n  &:focus {\n    border-color: ${theme.brand.default};\n  }\n`;\n\nexport const UnderlineInput = styled.input`\n  font-size: inherit;\n  font-weight: inherit;\n  color: ${theme.text.default};\n  border-bottom: 0.125rem solid ${theme.bg.inactive};\n\n  &:focus {\n    border-color: ${theme.brand.default};\n  }\n`;\n\nexport const H1 = styled.h1`\n  ${fontStack};\n  color: ${theme.text.default};\n  font-weight: 900;\n  font-size: 1.5rem;\n  line-height: 1.3;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const H2 = styled.h2`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 700;\n  font-size: 1.25rem;\n  line-height: 1.3;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const H3 = styled.h3`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const H4 = styled.h4`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1.4;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const H5 = styled.h5`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 500;\n  font-size: 0.75rem;\n  line-height: 1.4;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const H6 = styled.h6`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 600;\n  text-transform: uppercase;\n  font-size: 0.675rem;\n  line-height: 1.5;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const P = styled.p`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 400;\n  font-size: 0.875rem;\n  line-height: 1.4;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const Span = styled.span`\n  color: ${theme.text.default};\n  ${fontStack};\n  font-weight: 400;\n  font-size: 0.875rem;\n  line-height: 1.4;\n  margin: 0;\n  padding: 0;\n`;\n\nexport const FlexRow = styled.div`\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-start;\n  align-items: center;\n`;\n\nexport const FlexCol = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: stretch;\n`;\n\nexport const Onboarding = props => css`\n  position: relative;\n\n  &:after,\n  &:before {\n    line-height: 1;\n    user-select: none;\n    pointer-events: none;\n    position: absolute;\n    opacity: 0;\n    display: block;\n  }\n\n  &:before {\n    content: '';\n    z-index: ${zIndex.tooltip + 1};\n    border: 5px solid transparent;\n  }\n\n  &:after {\n    content: ${props.onboarding ? `'${props.onboarding}'` : \"''\"};\n    z-index: ${zIndex.tooltip};\n    ${fontStack};\n    text-align: left;\n    line-height: 20px;\n    font-size: 14px;\n    font-weight: 500;\n    width: 300px;\n    white-space: normal;\n    overflow: hidden;\n    padding: 16px;\n    padding-left: 20px;\n    border-radius: 12px;\n    background-color: ${props.theme.bg.default};\n    background: ${props.theme.bg.default} url(/img/goopy-top.svg) center top\n      no-repeat;\n    background-size: 100%;\n    color: ${props.theme.text.default};\n    box-shadow: 0 8px 32px rgba(23, 26, 33, 0.35);\n  }\n\n  &:after,\n  &:before {\n    opacity: 1;\n    transition: opacity 0.1s ease-in 0.1s;\n  }\n`;\n\nexport const HorizontalRule = styled(FlexRow)`\n  position: relative;\n  justify-content: center;\n  align-items: center;\n  align-self: stretch;\n  color: ${theme.bg.border};\n\n  hr {\n    display: inline-block;\n    flex: 1 0 auto;\n    border-top: 1px solid ${theme.bg.border};\n  }\n\n  div {\n    margin: 0 16px;\n  }\n`;\n"
  },
  {
    "path": "src/components/goop/index.js",
    "content": "// @flow\nimport React from 'react';\nimport styled from 'styled-components';\nimport { zIndex } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\n/* eslint no-eval: 0 */\n\nexport const InlineSvg = styled.svg`\n  position: absolute;\n  top: auto;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  color: inherit;\n  fill: currentColor;\n  pointer-events: none;\n\n  > g {\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    top: auto;\n  }\n`;\n\nexport const SvgWrapper = styled.div`\n  position: absolute;\n  flex: none;\n  z-index: ${zIndex.base};\n  height: 80px;\n  width: 110%;\n  bottom: -4px;\n  left: -5%;\n  right: -5%;\n  display: ${props => (props.goop === 0 ? 'none' : 'inline-block')};\n  color: ${props => eval(`props.theme.${props.color}`)};\n  pointer-events: none;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 150%;\n    left: -25%;\n    right: -25%;\n  }\n`;\n\ntype Props = {\n  color: string,\n  goop: number,\n  goopHeight: number,\n};\n\nclass Goop extends React.Component<Props> {\n  returnGoop() {\n    switch (this.props.goop) {\n      default:\n      case 0:\n        return null;\n      case 1:\n        return (\n          <g>\n            <path d=\"M1920,111.904l0,128.096l-1920,0l0,-132.536c390.745,104.115 1168.02,146.399 1763,34.536c60.63,-11.399 112.59,-21.405 157,-30.096Z\" />\n          </g>\n        );\n      case 2:\n        return (\n          <g>\n            <path d=\"M1920,144.5l0,95.5l-1920,0l0,-65.5c196,-36 452.146,-15.726 657.5,8.5c229.698,27.098 870,57 1262.5,-38.5Z\" />\n          </g>\n        );\n      case 3:\n        return (\n          <g>\n            <path d=\"M1920,180.5l0,59.5l-1920,0l0,-89.895c9.045,-1.833 86,-4.97 226.5,16.895c140.5,21.865 310.5,50 510,50c199.5,0 697.91,-33.156 816,-50c118.09,-16.844 308.05,-10.446 367.5,13.5Z\" />\n          </g>\n        );\n      case 4:\n        return (\n          <g>\n            <path d=\"M1920,146l0,94l-1920,0l0,-77.034c93,94.034 759,60.034 983.5,21.534c224.5,-38.5 456,13.5 594,13.5c138,0 152.14,-11.31 342.5,-52Z\" />\n          </g>\n        );\n      case 5:\n        return (\n          <g>\n            <path d=\"M1920,170.408l0,69.59l-1920,0l0,-70.108c16.912,-0.457 41.496,5.326 78.75,14.089c34.06,8.012 78.712,18.516 137.771,29.019c97.689,17.373 151.251,-7.434 204.304,-32.005c40.085,-18.565 79.879,-36.995 138.196,-36.995c42.888,0 96.297,12.473 159.528,27.24c136.535,31.888 318.871,74.47 539.971,25.26c240.59,-53.548 479.8,-56.485 661.48,-26.09Z\" />\n            <path d=\"M567.439,130.592c-0.66,3.489 7.503,4.22 19.289,5.275c7.461,0.668 16.373,1.466 25.419,3.176c7.616,1.44 14.477,3.149 20.302,4.599c12.022,2.995 19.63,4.889 20.356,1.051c1.077,-5.698 -17.179,-15.46 -40.514,-19.871c-23.335,-4.411 -43.775,0.072 -44.852,5.77Z\" />\n          </g>\n        );\n      case 6:\n        return (\n          <g>\n            <path d=\"M1920,144.532l0,95.468l-1920,0l0,-84c90.5,58 780,52.5 980,52.5c200,0 547.69,-52.5 634,-52.5c86.31,0 152,52.5 306,-11.468Z\" />\n            <path d=\"M1485.5,159.333c18.37,-1.773 39.53,-7.468 38.5,-11.193c-1.03,-3.726 -15.25,-3.812 -39.5,-1.64c-24.25,2.172 -37.8,5.5 -36,12c1.8,6.5 18.63,2.607 37,0.833Z\" />\n            <path d=\"M1549.19,145.713c0.34,1.34 -1.57,2.969 -4.24,3.639c-2.68,0.67 -5.13,0.127 -5.46,-1.212c-0.34,-1.34 1.56,-2.969 4.24,-3.639c2.68,-0.67 5.13,-0.127 5.46,1.212Z\" />\n          </g>\n        );\n      case 7:\n        return (\n          <g>\n            <path d=\"M1920,157.624l0,82.231l-1920,0l0,-106.045c54.693,-9.327 89,45.297 242,56.045c153,10.748 265.5,-30.5 411,-30.5c145.5,0 603,131.5 1267,-1.731Z\" />\n            <path d=\"M83.5,131.354c-2.5,12.5 68.5,37 148,44.5c79.5,7.5 108.103,0.808 107,-5c-1.537,-8.094 -89.5,-14.365 -136.5,-22.5c-47,-8.135 -116,-29.5 -118.5,-17Z\" />\n          </g>\n        );\n    }\n  }\n\n  render() {\n    const { color = 'bg.default', goopHeight, goop } = this.props;\n    return (\n      <SvgWrapper\n        className={'goop'}\n        goopHeight={goopHeight}\n        goop={goop}\n        color={color}\n      >\n        <InlineSvg\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          aria-labelledby=\"title\"\n          viewBox=\"0 0 1920 240\"\n          id={'goop'}\n        >\n          <title id=\"title\">goop</title>\n          {this.returnGoop()}\n        </InlineSvg>\n      </SvgWrapper>\n    );\n  }\n}\n\nexport default Goop;\n"
  },
  {
    "path": "src/components/head/index.js",
    "content": "import React from 'react';\nimport Helmet from 'react-helmet-async';\n\ntype Props = {\n  title?: string,\n  description?: string,\n  image?: string,\n  children?: any,\n  type?: 'article',\n};\n\nexport default ({ title, description, image, type, children }: Props) => {\n  return (\n    <Helmet>\n      <title>{title}</title>\n      <meta name=\"description\" content={description} />\n      <meta name=\"twitter:title\" content={title} />\n      <meta name=\"twitter:description\" content={description} />\n      <meta\n        name=\"twitter:image\"\n        content={\n          image\n            ? image\n            : 'https://spectrum.chat/img/apple-icon-144x144-precomposed.png'\n        }\n      />\n      <meta property=\"og:title\" content={title} />\n      <meta property=\"og:description\" content={description} />\n      <meta property=\"og:type\" content={type || 'website'} />\n      <meta\n        property=\"og:image\"\n        content={\n          image\n            ? image\n            : 'https://spectrum.chat/img/apple-icon-144x144-precomposed.png'\n        }\n      />\n      {children}\n    </Helmet>\n  );\n};\n"
  },
  {
    "path": "src/components/hoverProfile/channelProfile.js",
    "content": "// @flow\nimport React, { Component } from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport AvatarImage from 'src/components/avatar/image';\nimport { Link } from 'react-router-dom';\nimport { Button, OutlineButton } from 'src/components/button';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport type { GetChannelType } from 'shared/graphql/queries/channel/getChannel';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  HoverWrapper,\n  ProfileCard,\n  ChannelCommunityRow,\n  ChannelCommunityLabel,\n  Content,\n  Title,\n  Description,\n  Actions,\n} from './style';\n\ntype ProfileProps = {\n  channel: GetChannelType,\n  dispatch: Dispatch<Object>,\n  currentUser: ?Object,\n  ref: (?HTMLElement) => void,\n  style: CSSStyleDeclaration,\n};\n\nclass HoverProfile extends Component<ProfileProps> {\n  render() {\n    const { channel, ref, style } = this.props;\n\n    const {\n      isOwner: isChannelOwner,\n      isMember: isChannelMember,\n    } = channel.channelPermissions;\n    const { communityPermissions } = channel.community;\n    const {\n      isOwner: isCommunityOwner,\n      isModerator: isCommunityModerator,\n    } = communityPermissions;\n    const isGlobalOwner = isChannelOwner || isCommunityOwner;\n    const isGlobalModerator = isCommunityModerator;\n\n    return (\n      <HoverWrapper popperStyle={style} ref={ref}>\n        <ProfileCard>\n          <ChannelCommunityRow to={`/${channel.community.slug}`}>\n            <AvatarImage\n              size={24}\n              src={channel.community.profilePhoto}\n              type={'community'}\n              alt={channel.community.name}\n            />\n            <ChannelCommunityLabel>\n              {channel.community.name}\n            </ChannelCommunityLabel>\n          </ChannelCommunityRow>\n\n          <Content>\n            <Link to={`/${channel.community.slug}/${channel.slug}`}>\n              <Title>{channel.name}</Title>\n            </Link>\n            {channel.description && (\n              <Description>\n                {renderTextWithLinks(channel.description)}\n              </Description>\n            )}\n          </Content>\n\n          <Actions>\n            {(isGlobalModerator || isGlobalOwner) && (\n              <Link to={`/${channel.community.slug}/${channel.slug}/settings`}>\n                <OutlineButton icon={'settings'}>Settings</OutlineButton>\n              </Link>\n            )}\n          </Actions>\n        </ProfileCard>\n      </HoverWrapper>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  withRouter,\n  connect()\n)(HoverProfile);\n"
  },
  {
    "path": "src/components/hoverProfile/communityProfile.js",
    "content": "// @flow\nimport React, { Component } from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport AvatarImage from 'src/components/avatar/image';\nimport { Link } from 'react-router-dom';\nimport { Button, OutlineButton } from 'src/components/button';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  HoverWrapper,\n  ProfileCard,\n  CoverContainer,\n  CoverPhoto,\n  ProfilePhotoContainer,\n  Content,\n  Title,\n  Description,\n  Actions,\n} from './style';\n\ntype ProfileProps = {\n  community: GetCommunityType,\n  dispatch: Dispatch<Object>,\n  currentUser: ?Object,\n  ref: (?HTMLElement) => void,\n  style: CSSStyleDeclaration,\n};\n\nclass HoverProfile extends Component<ProfileProps> {\n  render() {\n    const { community, ref, style } = this.props;\n\n    const { communityPermissions } = community;\n    const { isOwner, isModerator } = communityPermissions;\n\n    return (\n      <HoverWrapper popperStyle={style} ref={ref}>\n        <ProfileCard>\n          <Link to={`/${community.slug}`}>\n            <CoverContainer>\n              <CoverPhoto src={community.coverPhoto} />\n              <ProfilePhotoContainer>\n                <AvatarImage\n                  src={community.profilePhoto}\n                  type={'community'}\n                  size={40}\n                  isClickable={false}\n                  alt={community.name}\n                />\n              </ProfilePhotoContainer>\n            </CoverContainer>\n          </Link>\n\n          <Content>\n            <Link to={`/${community.slug}`}>\n              <Title>{community.name}</Title>\n            </Link>\n            {community.description && (\n              <Description>\n                {renderTextWithLinks(community.description)}\n              </Description>\n            )}\n          </Content>\n\n          <Actions>\n            {(isModerator || isOwner) && (\n              <Link to={`/${community.slug}/settings`}>\n                <OutlineButton icon={'settings'}>Settings</OutlineButton>\n              </Link>\n            )}\n          </Actions>\n        </ProfileCard>\n      </HoverWrapper>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  withRouter,\n  connect()\n)(HoverProfile);\n"
  },
  {
    "path": "src/components/hoverProfile/index.js",
    "content": "// @flow\nimport UserHoverProfile from './userContainer';\n\nexport { UserHoverProfile };\n"
  },
  {
    "path": "src/components/hoverProfile/loadingHoverProfile.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Loading } from 'src/components/loading';\nimport { HoverWrapper, ProfileCard } from './style';\n\ntype Props = {\n  ref?: (?HTMLElement) => void,\n  style: CSSStyleDeclaration,\n};\n\nexport default class LoadingHoverProfile extends React.Component<Props> {\n  render() {\n    const { ref, style } = this.props;\n\n    return (\n      <HoverWrapper popperStyle={style} ref={ref}>\n        <ProfileCard style={{ display: 'flex', alignItems: 'center' }}>\n          <Loading />\n        </ProfileCard>\n      </HoverWrapper>\n    );\n  }\n}\n"
  },
  {
    "path": "src/components/hoverProfile/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { zIndex } from 'src/components/globals';\nimport { Link } from 'react-router-dom';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const HoverWrapper = styled.div`\n  padding: 12px;\n  margin-left: -12px;\n  z-index: ${zIndex.tooltip};\n  width: 256px;\n  ${props => props.popperStyle};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n    pointer-events: none;\n  }\n\n  &:hover {\n    display: inline-block;\n  }\n`;\n\nexport const Span = styled.span`\n  display: flex;\n  flex: none;\n  align-items: center;\n  position: relative;\n`;\n\nexport const PopperWrapper = styled.div`\n  z-index: 6001;\n  ${props => props.popperStyle};\n`;\n\nexport const ProfileCard = styled.div`\n  width: 256px;\n  background: ${theme.bg.default};\n  border-radius: 4px;\n  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.16);\n  min-height: 128px;\n  overflow: hidden;\n`;\n\nexport const Content = styled.div`\n  padding: 0 12px;\n`;\n\nexport const Title = styled.h2`\n  font-size: 20px;\n  font-weight: 700;\n  color: ${theme.text.default};\n  line-height: 1.2;\n`;\n\nexport const Username = styled.h3`\n  font-size: 16px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n  line-height: 1.2;\n  margin-top: 4px;\n`;\n\nexport const Description = styled.div`\n  font-size: 14px;\n  font-weight: 400;\n  color: ${theme.text.secondary};\n  margin-top: 8px;\n  line-height: 1.4;\n  white-space: pre-wrap;\n\n  a {\n    font-weight: 500;\n    color: ${theme.text.default};\n  }\n\n  a:hover {\n    text-decoration: none;\n  }\n`;\n\nexport const Actions = styled.div`\n  padding: 16px 12px 12px;\n  display: flex;\n  flex: 1 0 auto;\n\n  > div {\n    display: flex;\n    flex: 1;\n  }\n\n  a,\n  button {\n    display: flex;\n    flex: 1;\n    justify-content: center;\n  }\n`;\n\nexport const CoverContainer = styled.div`\n  width: 100%;\n  position: relative;\n`;\n\nexport const CoverPhoto = styled.div`\n  width: 100%;\n  height: 88px;\n  background-color: ${props =>\n    props.src ? props.theme.text.default : props.theme.brand.alt};\n  background-image: ${props => (props.src ? `url(\"${props.src}\")` : 'none')};\n  background-repeat: no-repeat;\n  background-size: cover;\n`;\n\nexport const ProfilePhotoContainer = styled.div`\n  position: relative;\n  left: 12px;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-bottom: -16px;\n\n  img {\n    box-shadow: 0 0 0 2px ${theme.bg.default};\n  }\n`;\n\n/*\n\nCHANNEL SPECIFIC\n\n*/\nexport const ChannelCommunityLabel = styled.h5`\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n`;\n\nexport const ChannelCommunityRow = styled(Link)`\n  display: flex;\n  flex: 1;\n  align-items: center;\n  padding: 8px;\n\n  img {\n    margin-right: 8px;\n  }\n\n  &:hover {\n    ${ChannelCommunityLabel} {\n      color: ${theme.text.secondary};\n    }\n  }\n`;\n"
  },
  {
    "path": "src/components/hoverProfile/userContainer.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withApollo, type Client } from 'react-apollo';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport { createPortal } from 'react-dom';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport LoadingHoverProfile from './loadingHoverProfile';\nimport UserProfile from './userProfile';\nimport { Span, PopperWrapper } from './style';\nimport {\n  getUserByUsername,\n  getUserByUsernameQuery,\n} from 'shared/graphql/queries/user/getUser';\n\nconst MentionHoverProfile = getUserByUsername(props => {\n  if (props.data && props.data.user) {\n    return (\n      <UserProfile ref={props.ref} user={props.data.user} style={props.style} />\n    );\n  }\n\n  if (props.data && props.data.loading) {\n    return <LoadingHoverProfile style={props.style} ref={props.ref} />;\n  }\n\n  return null;\n});\n\ntype Props = {\n  children: any,\n  username: string,\n  currentUser: ?Object,\n  style?: Object,\n  client: Client,\n};\n\ntype State = {\n  visible: boolean,\n};\n\nclass UserHoverProfileWrapper extends React.Component<Props, State> {\n  ref: ?any;\n  ref = null;\n  state = { visible: false };\n  _isMounted = false;\n\n  componentDidMount() {\n    this._isMounted = true;\n  }\n\n  componentWillUnmount() {\n    this._isMounted = false;\n  }\n\n  handleMouseEnter = () => {\n    const { username, client } = this.props;\n\n    if (!this._isMounted) return;\n\n    client\n      .query({\n        query: getUserByUsernameQuery,\n        variables: { username },\n      })\n      .then(() => {\n        if (!this._isMounted) return;\n      });\n\n    const ref = setTimeout(() => {\n      if (this._isMounted) {\n        return this.setState({ visible: true });\n      }\n    }, 500);\n    this.ref = ref;\n  };\n\n  handleMouseLeave = () => {\n    if (this.ref) {\n      clearTimeout(this.ref);\n    }\n\n    if (this._isMounted && this.state.visible) {\n      this.setState({ visible: false });\n    }\n  };\n\n  render() {\n    const { children, currentUser, username, style = {} } = this.props;\n    const { visible } = this.state;\n    const me = currentUser && currentUser.username === username;\n\n    return (\n      <Span\n        onMouseEnter={this.handleMouseEnter}\n        onMouseLeave={this.handleMouseLeave}\n        style={style}\n      >\n        <Manager tag={false}>\n          <Reference>\n            {({ ref }) => (\n              <div ref={ref} style={style}>\n                {children}\n              </div>\n            )}\n          </Reference>\n          {visible &&\n            document.body &&\n            createPortal(\n              <Popper\n                placement=\"bottom-start\"\n                modifiers={{\n                  flip: {\n                    enabled: true,\n                  },\n                  preventOverflow: {\n                    enabled: true,\n                    padding: 25,\n                  },\n                }}\n              >\n                {({ style, ref, placement }) => (\n                  <PopperWrapper\n                    ref={ref}\n                    popperStyle={style}\n                    data-placement={placement}\n                  >\n                    <MentionHoverProfile username={username} me={me} />\n                  </PopperWrapper>\n                )}\n              </Popper>,\n              document.body\n            )}\n        </Manager>\n      </Span>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  withApollo,\n  connect()\n)(UserHoverProfileWrapper);\n"
  },
  {
    "path": "src/components/hoverProfile/userProfile.js",
    "content": "// @flow\nimport React, { Component } from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport AvatarImage from 'src/components/avatar/image';\nimport { Link } from 'react-router-dom';\nimport Badge from 'src/components/badges';\nimport { OutlineButton } from 'src/components/button';\nimport ConditionalWrap from 'src/components/conditionalWrap';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport type { Dispatch } from 'redux';\nimport renderTextWithLinks from 'src/helpers/render-text-with-markdown-links';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  HoverWrapper,\n  ProfileCard,\n  CoverContainer,\n  CoverPhoto,\n  ProfilePhotoContainer,\n  Content,\n  Title,\n  Username,\n  Description,\n  Actions,\n} from './style';\n\ntype ProfileProps = {\n  user: GetUserType,\n  dispatch: Dispatch<Object>,\n  currentUser: ?Object,\n  ref: (?HTMLElement) => void,\n  style: CSSStyleDeclaration,\n};\n\nclass HoverProfile extends Component<ProfileProps> {\n  render() {\n    const { user, currentUser, ref, style } = this.props;\n    const me = currentUser && currentUser.id === user.id;\n\n    return (\n      <HoverWrapper popperStyle={style} ref={ref}>\n        <ProfileCard>\n          <ConditionalWrap\n            condition={!!user.username}\n            wrap={children => (\n              <Link to={`/users/${user.username}`}>{children}</Link>\n            )}\n          >\n            <CoverContainer>\n              <CoverPhoto src={user.coverPhoto ? user.coverPhoto : null} />\n              <ProfilePhotoContainer>\n                <AvatarImage\n                  src={user.profilePhoto}\n                  alt={user.name}\n                  type={'user'}\n                  size={40}\n                />\n              </ProfilePhotoContainer>\n            </CoverContainer>\n          </ConditionalWrap>\n\n          <Content>\n            <ConditionalWrap\n              condition={!!user.username}\n              wrap={children => (\n                <Link to={`/users/${user.username}`}>{children}</Link>\n              )}\n            >\n              <Title>{user.name}</Title>\n              <Username>@{user.username}</Username>\n            </ConditionalWrap>\n\n            {user.betaSupporter && (\n              <span style={{ display: 'inline-block', marginBottom: '4px' }}>\n                <Badge type=\"beta-supporter\" />\n              </span>\n            )}\n\n            {user.description && (\n              <Description>{renderTextWithLinks(user.description)}</Description>\n            )}\n          </Content>\n\n          <Actions>\n            {me && <OutlineButton to={'/me'}>My profile</OutlineButton>}\n          </Actions>\n        </ProfileCard>\n      </HoverWrapper>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  withRouter,\n  connect()\n)(HoverProfile);\n"
  },
  {
    "path": "src/components/icon/index.js",
    "content": "//@flow\nimport theme from 'shared/theme';\nimport React from 'react';\nimport styled, { css } from 'styled-components';\n\ntype Props = {\n  glyph: string,\n  size?: number | string,\n  count?: ?string,\n  onClick?: Function,\n  onboarding?: string,\n  dataCy?: string,\n};\n\nexport const InlineSvg = styled.svg`\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  color: inherit;\n  fill: currentColor;\n`;\n\nexport const SvgWrapper = styled.div`\n  display: inline-block;\n  flex: 0 0 ${props => (props.size ? `${props.size}px` : '32px')};\n  width: ${props => (props.size ? `${props.size}px` : '32px')};\n  height: ${props => (props.size ? `${props.size}px` : '32px')};\n  min-width: ${props => (props.size ? `${props.size}px` : '32px')};\n  min-height: ${props => (props.size ? `${props.size}px` : '32px')};\n  position: relative;\n  color: inherit;\n\n  ${props =>\n    props.count &&\n    css`\n      background-color: transparent;\n      &:after {\n        content: ${props.count ? `'${props.count}'` : `''`};\n        position: absolute;\n        left: calc(100% - 12px);\n        top: -2px;\n        font-size: 14px;\n        font-weight: 600;\n        background: ${theme.bg.default};\n        color: ${({ theme }) =>\n          process.env.NODE_ENV === 'production'\n            ? theme.text.default\n            : theme.warn.alt};\n        border-radius: 8px;\n        padding: 2px 4px;\n        border: 2px solid\n          ${({ theme }) =>\n            process.env.NODE_ENV === 'production'\n              ? theme.text.default\n              : theme.warn.alt};\n      }\n    `};\n`;\n\ntype GlyphProps = {\n  glyph: string,\n};\n\nexport const Glyph = ({ glyph }: GlyphProps) => {\n  switch (glyph) {\n    case 'analytics':\n      return (\n        <g transform=\"translate(9 9)\">\n          <path d=\"M 8 1C 8 0.447693 8.44772 0 9 0C 9.55228 0 10 0.447693 10 1L 10 13C 10 13.5523 9.55228 14 9 14C 8.44772 14 8 13.5523 8 13L 8 1ZM 5 4C 4.44772 4 4 4.44769 4 5L 4 13C 4 13.5523 4.44772 14 5 14C 5.55228 14 6 13.5523 6 13L 6 5C 6 4.44769 5.55228 4 5 4ZM 1 8C 0.447716 8 0 8.44769 0 9L 0 13C 0 13.5523 0.447716 14 1 14C 1.55228 14 2 13.5523 2 13L 2 9C 2 8.44769 1.55228 8 1 8ZM 13 6C 12.4477 6 12 6.44769 12 7L 12 13C 12 13.5523 12.4477 14 13 14C 13.5523 14 14 13.5523 14 13L 14 7C 14 6.44769 13.5523 6 13 6Z\" />\n        </g>\n      );\n    case 'attachment':\n      return (\n        <g>\n          <path d=\"M7.17,21.67c-1.381,2.392 -0.562,5.45 1.83,6.83c2.391,1.381 5.449,0.562 6.83,-1.83l4,-6.928l1,-1.732l4,-6.928c1.381,-2.392 0.561,-5.45 -1.83,-6.83c-2.392,-1.381 -5.45,-0.562 -6.83,1.83l-0.5,0.866c-0.276,0.478 -0.113,1.09 0.366,1.366c0.478,0.276 1.09,0.112 1.366,-0.366l0.5,-0.866c0.828,-1.435 2.663,-1.927 4.098,-1.098c1.435,0.828 1.926,2.663 1.098,4.098l-0.5,0.866l-3.5,6.062l-1,1.732l-4,6.928c-0.829,1.435 -2.663,1.927 -4.098,1.098c-1.435,-0.828 -1.927,-2.663 -1.098,-4.098l2,-3.464l4,-6.928c0.276,-0.478 0.887,-0.642 1.366,-0.366c0.478,0.276 0.642,0.888 0.366,1.366l-4,6.928c-0.276,0.479 -0.112,1.09 0.366,1.366c0.478,0.276 1.09,0.113 1.366,-0.366l4,-6.928c0.828,-1.435 0.337,-3.27 -1.098,-4.098c-1.435,-0.829 -3.27,-0.337 -4.098,1.098l-4,6.928l-2,3.464Z\" />\n        </g>\n      );\n    case 'bug':\n      return (\n        <g>\n          <path d=\"M12.121,4.693c-0.39,-0.391 -1.023,-0.391 -1.414,0c-0.39,0.39 -0.39,1.024 0,1.414l1.414,1.414c0.036,0.036 0.074,0.069 0.113,0.098c-0.245,0.672 -0.15,1.34 0.495,1.824c0.585,0.439 1.624,0.726 3.271,0.726c1.647,0 2.685,-0.287 3.271,-0.726c0.639,-0.479 0.738,-1.139 0.502,-1.805c0.049,-0.034 0.096,-0.073 0.14,-0.117l1.414,-1.414c0.391,-0.39 0.391,-1.024 0,-1.414c-0.39,-0.391 -1.024,-0.391 -1.414,0l-1.346,1.346c-0.745,-0.618 -1.698,-1.053 -2.567,-1.053c-0.862,0 -1.806,0.427 -2.548,1.037l-1.331,-1.33Zm3.879,3.476c-0.761,0 -1.289,-0.072 -1.638,-0.161c-0.021,-0.005 -0.041,-0.01 -0.06,-0.016c0.133,-0.17 0.331,-0.371 0.602,-0.563c0.465,-0.329 0.881,-0.443 1.096,-0.443c0.215,0 0.631,0.114 1.096,0.443c0.271,0.192 0.47,0.393 0.602,0.563c-0.019,0.006 -0.039,0.011 -0.06,0.016c-0.349,0.089 -0.877,0.161 -1.638,0.161Z\" />\n          <path d=\"M6.866,10.669c-0.478,-0.276 -1.09,-0.113 -1.366,0.366c-0.276,0.478 -0.112,1.09 0.366,1.366l2.993,1.728c-0.469,0.878 -0.689,1.911 -0.787,3.04l-3.072,0c-0.552,0 -1,0.447 -1,1c0,0.552 0.448,1 1,1l3,0c0,1.04 0.198,2.033 0.559,2.945l-2.693,1.555c-0.478,0.276 -0.642,0.888 -0.366,1.366c0.276,0.478 0.888,0.642 1.366,0.366l2.658,-1.535c1.454,2.002 3.813,3.303 6.476,3.303c2.663,0 5.022,-1.301 6.476,-3.303l2.658,1.535c0.478,0.276 1.09,0.112 1.366,-0.366c0.276,-0.478 0.112,-1.09 -0.366,-1.366l-2.694,-1.555c0.362,-0.912 0.56,-1.905 0.56,-2.945l3,0c0.552,0 1,-0.448 1,-1c0,-0.553 -0.448,-1 -1,-1l-3.072,0c-0.098,-1.129 -0.318,-2.162 -0.787,-3.04l2.993,-1.728c0.478,-0.276 0.642,-0.888 0.366,-1.366c-0.276,-0.479 -0.888,-0.642 -1.366,-0.366l-3.315,1.914c-0.581,-0.436 -1.314,-0.783 -2.238,-1.024c-0.969,-0.253 -2.148,-0.39 -3.581,-0.39c-1.433,0 -2.612,0.137 -3.581,0.39c-0.924,0.241 -1.657,0.588 -2.238,1.024l-3.315,-1.914Zm15.134,8.5c0,3.313 -2.686,6 -6,6c-3.314,0 -6,-2.687 -6,-6c0,-2.245 0.211,-3.603 0.851,-4.459c0.532,-0.71 1.75,-1.541 5.149,-1.541c3.399,0 4.617,0.831 5.149,1.541c0.64,0.856 0.851,2.214 0.851,4.459Z\" />\n        </g>\n      );\n    case 'bug-fill':\n      return (\n        <g>\n          <path d=\"M10.707,4.693c0.391,-0.391 1.024,-0.391 1.414,0l1.331,1.33c0.742,-0.61 1.686,-1.037 2.548,-1.037c0.869,0 1.822,0.435 2.567,1.053l1.346,-1.346c0.39,-0.391 1.024,-0.391 1.414,0c0.391,0.39 0.391,1.024 0,1.414l-1.414,1.414c-0.044,0.044 -0.091,0.083 -0.14,0.117c0.453,1.275 -0.328,2.531 -3.773,2.531c-3.463,0 -4.234,-1.268 -3.766,-2.55c-0.039,-0.029 -0.077,-0.062 -0.113,-0.098l-1.414,-1.414c-0.39,-0.39 -0.39,-1.024 0,-1.414Z\" />\n          <path d=\"M23.441,22.114c0.361,-0.912 0.559,-1.905 0.559,-2.945l3,0c0.552,0 1,-0.448 1,-1c0,-0.553 -0.448,-1 -1,-1l-3.072,0c-0.098,-1.129 -0.318,-2.162 -0.787,-3.04l2.993,-1.728c0.478,-0.276 0.642,-0.888 0.366,-1.366c-0.276,-0.479 -0.888,-0.642 -1.366,-0.366l-3.315,1.914c-1.19,-0.892 -3.019,-1.414 -5.819,-1.414c-2.8,0 -4.629,0.522 -5.819,1.414l-3.315,-1.914c-0.478,-0.276 -1.09,-0.113 -1.366,0.366c-0.276,0.478 -0.112,1.09 0.366,1.366l2.993,1.728c-0.469,0.878 -0.689,1.911 -0.787,3.04l-3.072,0c-0.552,0 -1,0.447 -1,1c0,0.552 0.448,1 1,1l3,0c0,1.04 0.198,2.033 0.559,2.945l-2.693,1.555c-0.478,0.276 -0.642,0.887 -0.366,1.366c0.276,0.478 0.888,0.642 1.366,0.366l2.658,-1.535c1.454,2.002 3.813,3.303 6.476,3.303c2.663,0 5.022,-1.301 6.476,-3.303l2.658,1.535c0.478,0.276 1.09,0.112 1.366,-0.366c0.276,-0.479 0.112,-1.09 -0.366,-1.366l-2.694,-1.555Z\" />\n        </g>\n      );\n    case 'channel':\n      return (\n        <g>\n          <path d=\"M14.287,10.941c0.143,-0.533 0.692,-0.85 1.225,-0.707c0.534,0.143 0.85,0.692 0.707,1.225l-0.406,1.517l2.052,0l0.545,-2.035c0.143,-0.533 0.691,-0.85 1.225,-0.707c0.533,0.143 0.85,0.692 0.707,1.225l-0.407,1.517l1.085,0c0.553,0 1,0.447 1,1c0,0.552 -0.447,1 -1,1l-1.62,0l-0.536,2l1.156,0c0.553,0 1,0.447 1,1c0,0.552 -0.447,1 -1,1l-1.692,0l-0.574,2.142c-0.143,0.534 -0.692,0.85 -1.225,0.707c-0.534,-0.143 -0.85,-0.691 -0.707,-1.224l0.435,-1.625l-2.052,0l-0.574,2.142c-0.143,0.534 -0.691,0.85 -1.225,0.707c-0.533,-0.143 -0.85,-0.691 -0.707,-1.224l0.436,-1.625l-1.115,0c-0.552,0 -1,-0.448 -1,-1c0,-0.553 0.448,-1 1,-1l1.651,0l0.535,-2l-1.186,0c-0.552,0 -1,-0.448 -1,-1c0,-0.553 0.448,-1 1,-1l1.722,0l0.545,-2.035Zm2.506,6.035l0.536,-2l-2.052,0l-0.536,2l2.052,0Z\" />\n        </g>\n      );\n    case 'channel-private':\n      return (\n        <g>\n          <path d=\"M18.186,9.144c-0.502,-0.122 -1.139,-0.145 -2.186,-0.144c-1.047,-0.001 -1.684,0.022 -2.186,0.144l-0.013,0.002c-0.207,0.044 -0.226,0.048 -0.324,0.111c-0.017,0.007 -0.027,0.011 -0.034,0.012c-0.001,0.005 -0.005,0.013 -0.012,0.024c-0.034,0.043 -0.179,0.265 -0.285,1.008c-0.072,0.487 -0.111,1.06 -0.13,1.773c0.818,-0.057 1.802,-0.074 2.984,-0.074c1.182,0 2.166,0.017 2.984,0.074c-0.019,-0.713 -0.058,-1.286 -0.13,-1.773c-0.106,-0.743 -0.251,-0.965 -0.285,-1.008c-0.007,-0.011 -0.011,-0.019 -0.012,-0.024c-0.007,-0.001 -0.017,-0.005 -0.034,-0.012c-0.098,-0.063 -0.117,-0.067 -0.324,-0.111l-0.013,-0.002Zm2.805,3.252c-0.091,-4.83 -0.908,-5.396 -4.991,-5.396c-4.083,0 -4.9,0.566 -4.991,5.396c-1.808,0.57 -2.009,1.931 -2.009,5.104c0,5 0.5,5.5 7,5.5c6.5,0 7,-0.5 7,-5.5c0,-3.173 -0.201,-4.534 -2.009,-5.104Zm-9.991,5.104c0,-1.218 0.018,-1.992 0.142,-2.58c0.048,-0.261 0.059,-0.309 0.13,-0.428c0.009,-0.022 0.013,-0.035 0.014,-0.043c0.005,-0.001 0.013,-0.005 0.026,-0.012c0.041,-0.033 0.275,-0.189 1.11,-0.297c0.857,-0.115 1.978,-0.14 3.578,-0.14c1.6,0 2.721,0.025 3.578,0.14c0.835,0.108 1.069,0.264 1.11,0.297c0.013,0.007 0.021,0.011 0.026,0.012c0.001,0.008 0.005,0.021 0.014,0.043c0.071,0.119 0.082,0.167 0.13,0.428c0.124,0.588 0.142,1.362 0.142,2.58c0,1.218 -0.018,1.992 -0.142,2.58c-0.048,0.261 -0.059,0.309 -0.13,0.428c-0.009,0.022 -0.013,0.035 -0.014,0.043c-0.005,0.001 -0.013,0.005 -0.026,0.012c-0.041,0.033 -0.275,0.189 -1.11,0.297c-0.857,0.115 -1.978,0.14 -3.578,0.14c-1.6,0 -2.721,-0.025 -3.578,-0.14c-0.835,-0.108 -1.069,-0.264 -1.11,-0.297c-0.013,-0.007 -0.021,-0.011 -0.026,-0.012c-0.001,-0.008 -0.005,-0.021 -0.014,-0.043c-0.071,-0.119 -0.082,-0.167 -0.13,-0.428c-0.124,-0.588 -0.142,-1.362 -0.142,-2.58Z\" />\n        </g>\n      );\n    case 'checkbox':\n      return (\n        <g>\n          <path d=\"M22.586,22.586c0.864,-0.864 1.414,-2.572 1.414,-6.586c0,-4.014 -0.55,-5.722 -1.414,-6.586c-0.864,-0.864 -2.572,-1.414 -6.586,-1.414c-4.014,0 -5.722,0.55 -6.586,1.414c-0.864,0.864 -1.414,2.572 -1.414,6.586c0,4.014 0.55,5.722 1.414,6.586c0.864,0.864 2.572,1.414 6.586,1.414c4.014,0 5.722,-0.55 6.586,-1.414Zm-6.586,3.414c8,0 10,-2 10,-10c0,-8 -2,-10 -10,-10c-8,0 -10,2 -10,10c0,8 2,10 10,10Z\" />\n        </g>\n      );\n    case 'checkmark':\n      return (\n        <g>\n          <path d=\"M16,8c2.476,0 4.074,0.209 5.138,0.572c0.414,0.141 0.886,0.076 1.195,-0.234l0.509,-0.508c0.222,-0.222 0.186,-0.593 -0.092,-0.739c-1.527,-0.801 -3.704,-1.091 -6.75,-1.091c-8,0 -10,2 -10,10c0,8 2,10 10,10c8,0 10,-2 10,-10c0,-0.346 -0.004,-0.68 -0.012,-1.004c-0.01,-0.431 -0.526,-0.629 -0.831,-0.324l-0.863,0.862c-0.188,0.189 -0.294,0.444 -0.291,0.711c0.02,2.029 0.074,4.85 -1.417,6.341c-0.864,0.864 -2.572,1.414 -6.586,1.414c-4.014,0 -5.722,-0.55 -6.586,-1.414c-0.864,-0.864 -1.414,-2.572 -1.414,-6.586c0,-4.014 0.55,-5.722 1.414,-6.586c0.864,-0.864 2.572,-1.414 6.586,-1.414Z\" />\n          <path d=\"M10.707,14.293c-0.39,0.39 -0.39,1.024 0,1.414l4.586,4.586c0.39,0.39 1.024,0.39 1.414,0l11.586,-11.586c0.39,-0.39 0.39,-1.024 0,-1.414l-0.336,-0.336c-0.39,-0.39 -1.024,-0.39 -1.414,0l-10.543,10.543l-3.543,-3.543c-0.39,-0.39 -1.024,-0.39 -1.414,0l-0.336,0.336Z\" />\n        </g>\n      );\n    case 'code':\n      return (\n        <g>\n          <path d=\"M18.634,9.438c0.276,-0.478 0.888,-0.642 1.366,-0.366c0.478,0.276 0.642,0.888 0.366,1.366l-7,12.124c-0.276,0.478 -0.888,0.642 -1.366,0.366c-0.478,-0.276 -0.642,-0.888 -0.366,-1.366l7,-12.124Zm4.348,11.452c-0.354,-0.424 -0.296,-1.055 0.128,-1.408l0.245,-0.205c1.478,-1.236 2.216,-1.854 3.529,-3.277c-1.338,-1.451 -2.052,-2.045 -3.612,-3.347l-0.162,-0.135c-0.424,-0.353 -0.482,-0.984 -0.128,-1.408c0.353,-0.424 0.942,-0.423 1.409,-0.128c1.609,1.018 2.609,2.018 4.2,3.964c0.219,0.312 0.409,0.664 0.409,1.054c0,0.39 -0.19,0.742 -0.409,1.053c-1.591,1.947 -2.591,2.947 -4.2,3.964l-0.001,0.001c-0.424,0.354 -1.055,0.296 -1.408,-0.128Zm-14.092,-1.408c0.424,0.353 0.482,0.984 0.128,1.408c-0.353,0.424 -0.984,0.482 -1.408,0.128l-0.001,-0.001c-1.609,-1.017 -2.609,-2.017 -4.2,-3.964c-0.219,-0.311 -0.409,-0.663 -0.409,-1.053c0,-0.39 0.19,-0.742 0.409,-1.054c1.591,-1.946 2.591,-2.946 4.2,-3.964c0.467,-0.295 1.056,-0.296 1.409,0.128c0.354,0.424 0.296,1.055 -0.128,1.408l-0.162,0.135c-1.56,1.302 -2.274,1.896 -3.612,3.347c1.313,1.423 2.051,2.041 3.529,3.277l0.245,0.205Z\" />\n        </g>\n      );\n    case 'community':\n      return (\n        <g fillRule=\"non-zero\">\n          <path d=\"M14.821,15c0,-3 -1,-5 1,-5c2,0 1,2 1,5l0,2c0,3 1,5 -1,5c-2,0 -1,-2 -1,-5l0,-2Z\" />\n          <path d=\"M16.187,14.634c2.598,-1.5 3.83,-3.367 4.83,-1.634c1,1.732 -1.232,1.866 -3.83,3.366l-1.732,1c-2.598,1.5 -3.83,3.366 -4.83,1.634c-1,-1.733 1.232,-1.866 3.83,-3.366l1.732,-1Z\" />\n          <path d=\"M17.187,15.634c2.598,1.5 4.83,1.633 3.83,3.366c-1,1.732 -2.232,-0.134 -4.83,-1.634l-1.732,-1c-2.598,-1.5 -4.83,-1.634 -3.83,-3.366c1,-1.733 2.232,0.134 4.83,1.634l1.732,1Z\" />\n        </g>\n      );\n    case 'controls':\n      return (\n        <path\n          d=\"M 3 15.7325C 3.5978 15.3867 4 14.7403 4 14C 4 13.2597 3.5978 12.6133 3 12.2675C 2.98457 12.2586 2.96901 12.2499 2.95332 12.2414C 2.66993 12.0875 2.34518 12 2 12C 1.63581 12 1.29436 12.0974 1.00024 12.2674L 1 12.2675C 0.402199 12.6133 0 13.2597 0 14C 0 14.7403 0.402199 15.3867 1 15.7325C 1.01543 15.7414 1.03099 15.7501 1.04668 15.7586C 1.33007 15.9125 1.65482 16 2 16C 2.36419 16 2.70564 15.9026 2.99976 15.7326L 3 15.7325ZM 3 1L 3 11.1707C 2.68722 11.0602 2.35064 11 2 11C 1.64936 11 1.31278 11.0602 1 11.1707L 1 1C 1 0.447723 1.44771 0 2 0C 2.55228 0 3 0.447723 3 1ZM 3 16.8293C 2.68722 16.9398 2.35064 17 2 17C 1.64936 17 1.31278 16.9398 1 16.8293L 1 19C 1 19.5523 1.44771 20 2 20C 2.55228 20 3 19.5523 3 19L 3 16.8293ZM 11 7.73245C 11.5978 7.38666 12 6.7403 12 6C 12 5.2597 11.5978 4.61334 11 4.26755C 10.9846 4.25864 10.969 4.24991 10.9533 4.24139C 10.6699 4.08746 10.3452 4 10 4C 9.63581 4 9.29436 4.09735 9.00024 4.26743L 9 4.26755C 8.4022 4.61334 8 5.2597 8 6C 8 6.7403 8.4022 7.38666 9 7.73245C 9.01543 7.74136 9.03099 7.75009 9.04668 7.75861C 9.33007 7.91254 9.65482 8 10 8C 10.3642 8 10.7056 7.90265 10.9998 7.73257L 11 7.73245ZM 11 1L 11 3.17072C 10.6872 3.06015 10.3506 3 10 3C 9.64936 3 9.31278 3.06015 9 3.17072L 9 1C 9 0.447723 9.44772 0 10 0C 10.5523 0 11 0.447723 11 1ZM 11 8.82928C 10.6872 8.93985 10.3506 9 10 9C 9.64936 9 9.31278 8.93985 9 8.82928L 9 19C 9 19.5523 9.44772 20 10 20C 10.5523 20 11 19.5523 11 19L 11 8.82928ZM 20 10C 20 10.7403 19.5978 11.3867 19 11.7325L 18.9998 11.7326C 18.7056 11.9026 18.3642 12 18 12C 17.6548 12 17.3301 11.9125 17.0467 11.7586C 17.031 11.7501 17.0154 11.7414 17 11.7325C 16.4022 11.3867 16 10.7403 16 10C 16 9.2597 16.4022 8.61334 17 8.26755L 17.0002 8.26743C 17.2944 8.09735 17.6358 8 18 8C 18.3452 8 18.6699 8.08746 18.9533 8.24139C 18.969 8.24991 18.9846 8.25861 19 8.26755C 19.5978 8.61334 20 9.2597 20 10ZM 19 7.17072L 19 1C 19 0.447723 18.5523 0 18 0C 17.4477 0 17 0.447723 17 1L 17 7.17072C 17.3128 7.06015 17.6494 7 18 7C 18.3506 7 18.6872 7.06015 19 7.17072ZM 18 13C 18.3506 13 18.6872 12.9398 19 12.8293L 19 19C 19 19.5523 18.5523 20 18 20C 17.4477 20 17 19.5523 17 19L 17 12.8293C 17.3128 12.9398 17.6494 13 18 13Z\"\n          transform=\"matrix(0 1 -1 0 26 6)\"\n        />\n      );\n    case 'delete':\n      return (\n        <g>\n          <path d=\"M8.391 12.32c-.636-.131-1.248.368-1.213 1.016.808 14.714 1.271 14.711 7.681 14.669C15.22 28.003 15.6 28 16 28s.78.003 1.141.005c6.41.042 6.873.045 7.681-14.669.035-.648-.577-1.147-1.212-1.016a.975.975 0 0 0-.784.896c-.17 3.094-.323 5.51-.519 7.407-.266 2.584-.588 3.883-.95 4.566-.225.426-.422.586-1.067.701-.716.128-1.615.123-3.019.115h-.002a161.358 161.358 0 0 0-2.538 0h-.001c-1.405.008-2.304.013-3.02-.115-.645-.115-.842-.275-1.067-.701-.362-.683-.684-1.982-.95-4.566-.196-1.897-.349-4.313-.519-7.407a.975.975 0 0 0-.783-.896z\" />\n          <path\n            d=\"M6 10a1 1 0 0 1 1-1h18a1 1 0 0 1 0 2H7a1 1 0 0 1-1-1z\"\n            fillRule=\"nonzero\"\n          />\n          <path d=\"M12.25 7.973C12.112 8.185 12 8.5 12 9h-2c0-.81.186-1.525.576-2.121.366-.536.963-1.006 1.525-1.271C13.24 5.087 14.687 5 16 5c1.313 0 2.76.087 3.899.608.562.265 1.158.735 1.525 1.271C21.814 7.475 22 8.19 22 9h-2c0-.5-.112-.815-.25-1.027-.161-.272-.324-.388-.684-.546C18.36 7.103 17.306 7 16 7c-1.306 0-2.36.103-3.066.427-.36.158-.523.274-.684.546z\" />\n          <path\n            d=\"M12.044 14.086a1 1 0 1 1 1.998-.087l.349 7.992a1 1 0 0 1-1.998.087l-.349-7.992zM17.956 13.999a1 1 0 0 1 1.998.087l-.348 7.993a1 1 0 0 1-1.999-.088l.349-7.992z\"\n            fillRule=\"nonzero\"\n          />\n        </g>\n      );\n    case 'door-enter':\n      return (\n        <g>\n          <path d=\"M13.707,15.293c0.391,0.39 0.391,1.024 0,1.414l-4,4c-0.39,0.391 -1.024,0.391 -1.414,0c-0.391,-0.39 -0.391,-1.024 0,-1.414l2.293,-2.293l-7.586,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l7.586,0l-2.293,-2.293c-0.391,-0.39 -0.391,-1.024 0,-1.414c0.39,-0.391 1.024,-0.391 1.414,0l4,4Z\" />\n          <path d=\"M19.884,8c0,0 -0.001,0 -0.001,0c-1.7,-0.001 -2.86,0.045 -3.77,0.25c-0.005,0.001 -0.01,0.002 -0.015,0.003c-0.79,0.173 -1.104,0.409 -1.292,0.638c0,0 0,0.001 0,0.001c-0.23,0.282 -0.498,0.834 -0.679,2.043c0,0.001 0,0.002 0,0.003c-0.007,0.048 -0.015,0.097 -0.022,0.147c-0.072,0.516 -0.501,0.915 -1.022,0.915c-0.584,0 -1.049,-0.501 -0.973,-1.08c0.566,-4.332 2.406,-4.92 7.773,-4.92c7,0 8,1 8,10c0,9 -1,10 -8,10c-5.367,0 -7.207,-0.588 -7.773,-4.92c-0.076,-0.579 0.389,-1.08 0.973,-1.08c0.521,0 0.95,0.399 1.022,0.915c0.007,0.05 0.015,0.099 0.022,0.147c0,0.001 0,0.002 0,0.003c0.181,1.209 0.449,1.762 0.679,2.044l0,0c0.188,0.229 0.502,0.465 1.292,0.638c0.005,0.001 0.01,0.002 0.015,0.003c0.91,0.204 2.07,0.25 3.77,0.25c0,0 0.001,0 0.001,0c1.7,0 2.86,-0.046 3.77,-0.25c0.005,-0.001 0.01,-0.002 0.015,-0.003c0.79,-0.173 1.104,-0.409 1.291,-0.638l0.001,0c0.23,-0.282 0.498,-0.835 0.678,-2.043c0.001,-0.001 0.001,-0.003 0.001,-0.005c0.189,-1.247 0.244,-2.848 0.243,-5.061c0,0 0,0 0,0c0.001,-2.213 -0.054,-3.814 -0.243,-5.061c0,-0.002 0,-0.004 -0.001,-0.005c-0.18,-1.208 -0.448,-1.76 -0.678,-2.042c0,0 0,-0.001 -0.001,-0.001c-0.187,-0.229 -0.501,-0.465 -1.291,-0.638c-0.005,-0.001 -0.01,-0.002 -0.015,-0.003c-0.91,-0.205 -2.07,-0.251 -3.77,-0.25Z\" />\n        </g>\n      );\n    case 'door-leave':\n      return (\n        <g>\n          <path d=\"M27.708,15.293c0.39,0.39 0.39,1.024 0,1.414l-4,4c-0.391,0.391 -1.024,0.391 -1.415,0c-0.39,-0.39 -0.39,-1.024 0,-1.414l2.293,-2.293l-11.586,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l11.586,0l-2.293,-2.293c-0.39,-0.39 -0.39,-1.024 0,-1.414c0.391,-0.391 1.024,-0.391 1.415,0l4,4Z\" />\n          <path d=\"M11.999,8c0.001,0 0.001,0 0.002,0c1.699,-0.001 2.859,0.045 3.77,0.25c0.005,0.001 0.01,0.002 0.015,0.003c0.789,0.173 1.103,0.409 1.291,0.638c0,0 0,0.001 0,0.001c0.231,0.282 0.498,0.834 0.679,2.043c0,0.001 0,0.002 0.001,0.003c0.007,0.048 0.014,0.097 0.021,0.147c0.072,0.516 0.501,0.915 1.022,0.915c0.584,0 1.049,-0.501 0.973,-1.08c-0.566,-4.332 -2.405,-4.92 -7.773,-4.92c-7,0 -8,1 -8,10c0,9 1,10 8,10c5.368,0 7.207,-0.588 7.773,-4.92c0.076,-0.579 -0.389,-1.08 -0.973,-1.08c-0.521,0 -0.95,0.399 -1.022,0.915c-0.007,0.05 -0.014,0.099 -0.021,0.147c-0.001,0.001 -0.001,0.002 -0.001,0.003c-0.181,1.209 -0.448,1.762 -0.679,2.044l0,0c-0.188,0.229 -0.502,0.465 -1.291,0.638c-0.005,0.001 -0.01,0.002 -0.015,0.003c-0.911,0.204 -2.071,0.25 -3.77,0.25c-0.001,0 -0.001,0 -0.002,0c-1.699,0 -2.859,-0.046 -3.77,-0.25c-0.005,-0.001 -0.01,-0.002 -0.015,-0.003c-0.789,-0.173 -1.103,-0.409 -1.291,-0.638l0,0c-0.231,-0.282 -0.498,-0.835 -0.679,-2.043c0,-0.001 0,-0.003 -0.001,-0.005c-0.189,-1.247 -0.243,-2.848 -0.243,-5.061c0,0 0,0 0,0c0,-2.213 0.054,-3.814 0.243,-5.061c0.001,-0.002 0.001,-0.004 0.001,-0.005c0.181,-1.208 0.448,-1.76 0.679,-2.042c0,0 0,-0.001 0,-0.001c0.188,-0.229 0.502,-0.465 1.291,-0.638c0.005,-0.001 0.01,-0.002 0.015,-0.003c0.911,-0.205 2.071,-0.251 3.77,-0.25Z\" />\n        </g>\n      );\n    case 'down':\n      return (\n        <g>\n          <path d=\"M21.934,25.636c-1.478,0.284 -3.354,0.365 -5.934,0.364c-2.58,0.001 -4.456,-0.08 -5.934,-0.364c-1.402,-0.264 -2.137,-0.66 -2.589,-1.113c-0.453,-0.452 -0.849,-1.187 -1.113,-2.589c-0.284,-1.478 -0.365,-3.354 -0.364,-5.934c-0.001,-2.58 0.08,-4.456 0.364,-5.934c0.264,-1.402 0.66,-2.137 1.113,-2.589c0.452,-0.453 1.187,-0.849 2.589,-1.113c1.478,-0.284 3.354,-0.364 5.934,-0.364c2.58,0 4.456,0.08 5.934,0.364c1.402,0.264 2.137,0.66 2.589,1.113c0.453,0.452 0.849,1.187 1.113,2.589c0.284,1.478 0.364,3.354 0.364,5.934c0,2.58 -0.08,4.456 -0.364,5.934c-0.264,1.402 -0.66,2.137 -1.113,2.589c-0.452,0.453 -1.187,0.849 -2.589,1.113Zm6.066,-9.636c0,10.5 -1.5,12 -12,12c-10.5,0 -12,-1.5 -12,-12c0,-10.5 1.5,-12 12,-12c10.5,0 12,1.5 12,12Z\" />\n          <path d=\"M10.11,12.982c0.424,-0.354 1.055,-0.297 1.408,0.128c1.391,1.636 2.76,3.464 4.482,4.774c1.749,-1.331 3.085,-3.1 4.482,-4.774c0.353,-0.425 0.984,-0.482 1.408,-0.128c0.42,0.349 0.476,0.99 0.127,1.409c-1.505,1.799 -3.031,3.827 -4.964,5.2c-0.311,0.219 -0.663,0.409 -1.053,0.409c-0.39,0 -0.742,-0.19 -1.053,-0.409c-1.914,-1.359 -3.471,-3.41 -4.965,-5.201c-0.354,-0.424 -0.296,-1.055 0.128,-1.408Z\" />\n        </g>\n      );\n    case 'down-caret':\n      return (\n        <g>\n          <path\n            d=\"M 0.359841 9.01822C 0.784113 9.37178 1.41467 9.31446 1.76823 8.8902C 3.14518 7.2451 6.52975 3.42464 8.25002 2.11557C 9.99919 3.44663 13.335 7.21555 14.7318 8.8902C 15.0854 9.31446 15.7159 9.37178 16.1402 9.01822C 16.5645 8.66466 16.6215 8.03371 16.2679 7.60943C 14.7363 5.76983 11.2749 1.80977 9.30351 0.408618C 8.99227 0.190441 8.64018 0 8.25002 0C 7.85987 0 7.50778 0.190441 7.19654 0.408618C 5.26486 1.78153 1.73514 5.80788 0.232849 7.60856L 0.231804 7.60982C -0.12176 8.03409 -0.0644362 8.66466 0.359841 9.01822Z\"\n            transform=\"translate(7.12506 20.6251) scale(1 -1)\"\n          />\n        </g>\n      );\n    case 'download':\n      return (\n        <g>\n          <path\n            id=\"Union\"\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M17 7C19.4194 7 21.4374 8.71837 21.9002 11.0012C24.1171 10.9472 26 12.7809 26 15C26 17.2091 24.2091 19 22 19C21.4477 19 21 18.5523 21 18C21 17.4477 21.4477 17 22 17C23.1046 17 24 16.1046 24 15C24 13.8954 23.1046 13 22 13C21.7137 13 21.4301 13.0367 21.1499 13.0962C20.6068 13.2113 20 12.5551 20 12C20 10.3432 18.6569 9 17 9C15.2449 9 14.1626 10.151 13.7245 11.534C13.5099 12.2114 12.7936 12.6737 12.1486 12.3754C11.6937 12.1651 11.282 12 11 12C10.4477 12 10 12.4477 10 13C10.254 14.0159 9.48563 15 8.43845 15H8C7.44772 15 7 15.4477 7 16C7 16.5523 7.44772 17 8 17H10C10.5523 17 11 17.4477 11 18C11 18.5523 10.5523 19 10 19H8C6.34314 19 5 17.6569 5 16C5 14.3431 6.34314 13 8 13C8 11.3431 9.34314 10 11 10C11.4651 10 11.9055 10.1058 12.2983 10.2947C12.9955 8.37292 14.8374 7 17 7ZM19.7071 22.7071L16.7071 25.7071C16.3166 26.0976 15.6834 26.0976 15.2929 25.7071L12.2929 22.7071C11.9024 22.3166 11.9024 21.6834 12.2929 21.2929C12.6834 20.9024 13.3166 20.9024 13.7071 21.2929L15 22.5858V17C15 16.4477 15.4477 16 16 16C16.5523 16 17 16.4477 17 17V22.5858L18.2929 21.2929C18.6834 20.9024 19.3166 20.9024 19.7071 21.2929C20.0976 21.6834 20.0976 22.3166 19.7071 22.7071Z\"\n          />\n        </g>\n      );\n    case 'up-caret':\n      return (\n        <g>\n          <path\n            id=\"Vector\"\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M7.4849 20.3931C7.90917 20.7467 8.53973 20.6894 8.8933 20.2651C10.2702 18.62 13.6548 14.7995 15.3751 13.4905C17.1243 14.8215 20.46 18.5905 21.8569 20.2651C22.2104 20.6894 22.841 20.7467 23.2653 20.3931C23.6895 20.0396 23.7465 19.4086 23.393 18.9843C21.8613 17.1447 18.4 13.1847 16.4286 11.7835C16.1173 11.5653 15.7652 11.3749 15.3751 11.3749C14.9849 11.3749 14.6328 11.5653 14.3216 11.7835C12.3899 13.1564 8.8602 17.1828 7.35791 18.9835L7.35686 18.9847C7.0033 19.409 7.06062 20.0396 7.4849 20.3931Z\"\n          />\n        </g>\n      );\n    case 'down-fill':\n      return (\n        <g>\n          <path d=\"M16,28c10.5,0 12,-1.5 12,-12c0,-10.5 -1.5,-12 -12,-12c-10.5,0 -12,1.5 -12,12c0,10.5 1.5,12 12,12Zm-4.482,-14.89c-0.353,-0.424 -0.984,-0.482 -1.408,-0.128c-0.424,0.353 -0.482,0.984 -0.128,1.408l0.001,0.001c0.216,0.26 0.433,0.524 0.652,0.79c1.299,1.581 2.658,3.235 4.312,4.41c0.311,0.219 0.663,0.409 1.053,0.409c0.39,0 0.742,-0.19 1.053,-0.409c1.679,-1.192 2.988,-2.79 4.285,-4.374c0.226,-0.277 0.452,-0.553 0.68,-0.826c0.354,-0.425 0.296,-1.056 -0.128,-1.409c-0.424,-0.354 -1.055,-0.296 -1.408,0.128c-0.212,0.254 -0.423,0.511 -0.634,0.768c-1.178,1.434 -2.365,2.878 -3.848,4.006c-1.457,-1.108 -2.673,-2.584 -3.848,-4.009c-0.212,-0.257 -0.423,-0.513 -0.634,-0.765Z\" />\n        </g>\n      );\n    case 'edit':\n      return (\n        <g>\n          <path d=\"M11.878,8.479c0.132,-0.242 0.346,-0.479 0.622,-0.479l1.5,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-1,0c-0.552,0 -1,0.448 -1,1l0,10c0,0.552 0.448,1 1,1l1,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-1.5,0c-0.276,0 -0.49,-0.237 -0.622,-0.48c-0.17,-0.31 -0.499,-0.52 -0.878,-0.52c-0.379,0 -0.708,0.21 -0.878,0.52c-0.132,0.243 -0.346,0.48 -0.622,0.48l-1.5,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l1,0c0.552,0 1,-0.448 1,-1l0,-10c0,-0.552 -0.448,-1 -1,-1l-1,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l1.5,0c0.276,0 0.49,0.237 0.622,0.479c0.17,0.311 0.499,0.521 0.878,0.521c0.379,0 0.708,-0.21 0.878,-0.521Zm-3.878,17.521c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l16,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1l-16,0Z\" />\n        </g>\n      );\n    case 'email':\n      return (\n        <g>\n          <path d=\"M25.709,21.048c0.241,-1.212 0.291,-2.792 0.291,-5.048c0,-2.256 -0.05,-3.836 -0.291,-5.048c-0.216,-1.11 -0.533,-1.577 -0.864,-1.853c-0.384,-0.32 -1.094,-0.641 -2.597,-0.844c-1.531,-0.209 -3.522,-0.255 -6.248,-0.255c-2.725,0 -4.717,0.046 -6.248,0.255c-1.503,0.203 -2.213,0.524 -2.597,0.844c-0.331,0.276 -0.648,0.743 -0.864,1.853c-0.241,1.212 -0.291,2.792 -0.291,5.048c0,2.256 0.05,3.836 0.291,5.048c0.216,1.11 0.533,1.577 0.864,1.853c0.384,0.32 1.094,0.641 2.597,0.843c1.531,0.21 3.523,0.256 6.248,0.256c2.726,0 4.717,-0.046 6.248,-0.256c1.503,-0.202 2.213,-0.523 2.597,-0.843c0.331,-0.276 0.648,-0.743 0.864,-1.853Zm-9.709,4.952c11,0 12,-0.833 12,-10c0,-9.167 -1,-10 -12,-10c-11,0 -12,0.833 -12,10c0,9.167 1,10 12,10Zm-8.651,-14.774c0.411,-0.344 1.023,-0.289 1.366,0.124c1.335,1.601 5.617,5.318 7.285,6.592c1.696,-1.296 5.931,-4.963 7.285,-6.592c0.343,-0.413 0.955,-0.468 1.366,-0.124c0.412,0.344 0.467,0.957 0.124,1.37c-0.695,0.838 -2.02,2.129 -3.429,3.404c1.409,1.275 2.734,2.566 3.429,3.404c0.343,0.412 0.288,1.026 -0.124,1.37c-0.411,0.344 -1.023,0.289 -1.366,-0.124c-0.662,-0.798 -2.015,-2.083 -3.422,-3.339c-1.102,0.95 -2.137,1.789 -2.841,2.291c-0.302,0.213 -0.644,0.398 -1.022,0.398c-0.378,0 -0.72,-0.185 -1.021,-0.398c-0.691,-0.492 -1.728,-1.335 -2.835,-2.292c-1.414,1.264 -2.775,2.556 -3.429,3.34c-0.343,0.413 -0.955,0.468 -1.366,0.124c-0.411,-0.344 -0.467,-0.957 -0.124,-1.37l0.001,-0.001c0.683,-0.822 2.018,-2.119 3.436,-3.403c-1.418,-1.284 -2.753,-2.582 -3.436,-3.403l-0.001,-0.001c-0.343,-0.413 -0.287,-1.026 0.124,-1.37Z\" />\n        </g>\n      );\n    case 'email-fill':\n      return (\n        <g>\n          <path d=\"M16,26c11,0 12,-0.833 12,-10c0,-9.167 -1,-10 -12,-10c-11,0 -12,0.833 -12,10c0,9.167 1,10 12,10Zm-8.651,-14.774c0.411,-0.344 1.023,-0.289 1.366,0.124c1.335,1.601 5.617,5.318 7.285,6.592c1.696,-1.296 5.931,-4.963 7.285,-6.592c0.343,-0.413 0.955,-0.468 1.366,-0.124c0.412,0.344 0.467,0.957 0.124,1.37c-0.695,0.838 -2.02,2.129 -3.429,3.404c1.409,1.275 2.734,2.566 3.429,3.404c0.343,0.412 0.288,1.026 -0.124,1.37c-0.411,0.344 -1.023,0.289 -1.366,-0.124c-0.662,-0.798 -2.015,-2.083 -3.422,-3.339c-1.102,0.95 -2.137,1.789 -2.841,2.291c-0.302,0.213 -0.644,0.398 -1.022,0.398c-0.378,0 -0.72,-0.185 -1.021,-0.398c-0.691,-0.492 -1.728,-1.335 -2.835,-2.292c-1.414,1.264 -2.775,2.556 -3.429,3.34c-0.343,0.413 -0.955,0.468 -1.366,0.124c-0.411,-0.344 -0.467,-0.957 -0.124,-1.37l0.001,-0.001c0.683,-0.822 2.018,-2.119 3.436,-3.403c-1.418,-1.284 -2.753,-2.582 -3.436,-3.403l-0.001,-0.001c-0.343,-0.413 -0.287,-1.026 0.124,-1.37Z\" />\n        </g>\n      );\n    case 'embed':\n      return (\n        <g>\n          <path d=\"M16,6.033c5.1,0 7.247,0.576 8.336,1.665c1.089,1.089 1.664,3.235 1.664,8.335c0,5.1 -0.575,7.247 -1.664,8.336c-1.089,1.089 -3.236,1.664 -8.336,1.664c-5.1,0 -7.247,-0.575 -8.336,-1.664c-1.089,-1.089 -1.664,-3.236 -1.664,-8.336c0,-5.1 0.575,-7.247 1.664,-8.335c1.089,-1.089 3.236,-1.665 8.336,-1.665Zm12,10c0,-10 -2,-12 -12,-12c-10,0 -12,2 -12,12c0,10 2,12 12,12c10,0 12,-2 12,-12Zm-19.25,0c0,0.336 0.175,0.617 0.332,0.825l0.001,0.002c0.836,1.087 2.004,1.978 3.102,2.816c0.09,0.068 0.179,0.137 0.268,0.205l0.079,0.06c0.061,0.047 0.122,0.094 0.183,0.141l0.001,0.001c0.394,0.305 0.977,0.258 1.31,-0.113c0.343,-0.382 0.284,-0.953 -0.121,-1.266c-0.178,-0.138 -0.359,-0.276 -0.54,-0.415c-0.92,-0.703 -1.854,-1.417 -2.579,-2.256c0.734,-0.851 1.651,-1.55 2.576,-2.255c0.181,-0.138 0.363,-0.276 0.543,-0.415c0.404,-0.313 0.464,-0.884 0.121,-1.266c-0.333,-0.372 -0.917,-0.417 -1.31,-0.113c-0.181,0.139 -0.363,0.278 -0.546,0.418l-0.01,0.007c-1.099,0.836 -2.228,1.695 -3.077,2.798l-0.001,0.001c-0.157,0.208 -0.332,0.49 -0.332,0.825Zm14.5,0c0,0.336 -0.175,0.617 -0.332,0.825l-0.001,0.002c-0.836,1.087 -2.004,1.978 -3.102,2.816c-0.179,0.136 -0.356,0.272 -0.53,0.406l-0.001,0.001c-0.394,0.305 -0.977,0.258 -1.31,-0.113c-0.343,-0.382 -0.284,-0.953 0.121,-1.266c0.178,-0.138 0.359,-0.276 0.54,-0.415c0.92,-0.703 1.854,-1.417 2.579,-2.256c-0.734,-0.851 -1.651,-1.55 -2.576,-2.255l-0.002,-0.001c-0.18,-0.137 -0.361,-0.275 -0.541,-0.414c-0.404,-0.313 -0.464,-0.884 -0.121,-1.266c0.333,-0.372 0.917,-0.417 1.31,-0.113c0.184,0.142 0.369,0.283 0.556,0.425c1.099,0.836 2.228,1.695 3.077,2.798l0.001,0.001c0.157,0.208 0.332,0.49 0.332,0.825Z\" />\n        </g>\n      );\n    case 'emoji':\n      return (\n        <g>\n          <path d=\"M26,16c0,5.523 -4.477,10 -10,10c-5.523,0 -10,-4.477 -10,-10c0,-5.523 4.477,-10 10,-10c5.523,0 10,4.477 10,10Zm2,0c0,6.627 -5.373,12 -12,12c-6.627,0 -12,-5.373 -12,-12c0,-6.627 5.373,-12 12,-12c6.627,0 12,5.373 12,12Zm-17.5,0c0.829,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.671,-1.5 -1.5,-1.5c-0.829,0 -1.5,0.672 -1.5,1.5c0,0.828 0.671,1.5 1.5,1.5Zm12.5,-1.5c0,0.828 -0.671,1.5 -1.5,1.5c-0.829,0 -1.5,-0.672 -1.5,-1.5c0,-0.828 0.671,-1.5 1.5,-1.5c0.829,0 1.5,0.672 1.5,1.5Zm-6.999,8c2.45,0 4.534,-1.715 5,-4c0.232,-1.14 -3,-1.5 -5,-1.5c-2,0 -5.259,0.231 -5,1.5c0.466,2.285 2.549,4 5,4Zm2,-2c0,0 -0.896,0.5 -2,0.5c-1.105,0 -2,-0.5 -2,-0.5c0,0 0.895,-1 2,-1c1.104,0 2,1 2,1Z\" />\n        </g>\n      );\n    case 'enter':\n      return (\n        <g>\n          <path d=\"M18.496,10.132c-0.479,-0.274 -1.09,-0.108 -1.364,0.372c-0.274,0.479 -0.108,1.09 0.372,1.364c1.554,0.886 3.031,1.929 4.357,3.132l-13.861,0c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l13.861,0c-1.326,1.203 -2.803,2.246 -4.357,3.132c-0.48,0.274 -0.646,0.885 -0.372,1.364c0.274,0.48 0.885,0.646 1.364,0.372c2.16,-1.237 4.859,-2.886 6.237,-5.061c0.076,-0.12 0.267,-0.431 0.267,-0.807c0,-0.376 -0.191,-0.687 -0.267,-0.807c-1.403,-2.215 -4.021,-3.792 -6.237,-5.061Z\" />\n        </g>\n      );\n    case 'everything':\n      return (\n        <g>\n          <path d=\"M16,14.591c-0.394,-0.376 -0.939,-0.875 -1.539,-1.365c-0.632,-0.516 -1.383,-1.066 -2.101,-1.472c-0.709,-0.399 -1.545,-0.754 -2.36,-0.754c-2.761,0 -5,2.239 -5,5c0,2.761 2.239,5 5,5c0.815,0 1.651,-0.355 2.36,-0.754c0.718,-0.406 1.469,-0.956 2.101,-1.472c0.6,-0.49 1.145,-0.989 1.539,-1.365c0.394,0.376 0.939,0.875 1.539,1.365c0.632,0.516 1.383,1.066 2.101,1.472c0.709,0.399 1.545,0.754 2.36,0.754c2.761,0 5,-2.239 5,-5c0,-2.761 -2.239,-5 -5,-5c-0.815,0 -1.651,0.355 -2.36,0.754c-0.718,0.406 -1.469,0.956 -2.101,1.472c-0.6,0.491 -1.145,0.989 -1.539,1.365Zm-9,1.409c0,-1.657 1.343,-3 3,-3c0.289,0 0.755,0.145 1.379,0.496c0.614,0.344 1.225,0.794 1.817,1.278c0.539,0.441 1.014,0.874 1.384,1.226c-0.37,0.352 -0.845,0.785 -1.384,1.226c-0.592,0.484 -1.203,0.934 -1.817,1.278c-0.624,0.351 -1.09,0.496 -1.379,0.496c-1.657,0 -3,-1.343 -3,-3Zm18,0c0,-1.657 -1.343,-3 -3,-3c-0.289,0 -0.756,0.145 -1.379,0.496c-0.614,0.344 -1.225,0.794 -1.817,1.278c-0.539,0.441 -1.014,0.874 -1.384,1.226c0.37,0.352 0.845,0.786 1.384,1.226c0.592,0.484 1.203,0.934 1.817,1.278c0.623,0.351 1.09,0.496 1.379,0.496c1.657,0 3,-1.343 3,-3Z\" />\n        </g>\n      );\n    case 'expand':\n      return (\n        <g>\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M13.4261 23.4929C13.9761 23.4429 14.4625 23.8483 14.5125 24.3983C14.5625 24.9483 14.1572 25.4347 13.6072 25.4847L13.6055 25.4848C11.7489 25.903 10.3347 25.903 7.83297 25.6519C7.45861 25.5861 7.07499 25.4718 6.7991 25.1959C6.52322 24.92 6.40892 24.5364 6.34311 24.162C6.09202 21.6604 6.09202 20.2462 6.51027 18.3884C6.63158 17.8496 7.04673 17.4325 7.59675 17.4825C8.14676 17.5325 8.5521 18.0189 8.50211 18.5689C8.49565 18.6403 8.48931 18.7102 8.48309 18.779C8.34826 20.2675 8.26727 21.1616 8.26533 22.3155L22.3035 8.27736C21.1495 8.2793 20.2555 8.36029 18.7669 8.49512L18.5569 8.51413C18.0069 8.56413 17.5205 8.15879 17.4705 7.60878C17.4205 7.05876 17.8375 6.64361 18.3763 6.5223C20.2342 6.10404 21.6484 6.10404 24.15 6.35514C24.5244 6.42095 24.908 6.53525 25.1839 6.81113C25.4598 7.08702 25.5741 7.47064 25.6399 7.845C25.891 10.3467 25.891 11.7609 25.4728 13.6176L25.4727 13.6192C25.4227 14.1692 24.9363 14.5745 24.3862 14.5245C23.8362 14.4745 23.4309 13.9881 23.4809 13.4381L23.5092 13.1202C23.6342 11.7164 23.7135 10.8267 23.7167 9.69262L9.68059 23.7287C10.8147 23.7255 11.7044 23.6463 13.1082 23.5212C13.2113 23.512 13.3171 23.5026 13.4261 23.4929Z\"\n          />\n        </g>\n      );\n    case 'explore':\n      return (\n        <g>\n          <path d=\"M25.915,15.946c-1.251,0.722 -2.043,1.179 -3.002,0.579l-0.529,0.305l-2.598,1.5c-2.165,1.25 -3.373,1.658 -4.289,1.321l-0.541,0.313l-1.299,0.75c-3.464,2 -5.103,0.286 -5.897,-1.214c-0.795,-1.5 -1.567,-3.715 1.897,-5.715l1.299,-0.75l0.541,-0.312c0.166,-0.962 1.124,-1.804 3.289,-3.054l2.598,-1.5l0.655,-0.378c0.02,-1.166 0.833,-1.636 1.876,-2.238c1.894,-1.093 3.031,-1.75 6.031,3.447c3,5.196 2.242,5.633 -0.031,6.946Zm-2.573,-1.771c-0.471,-0.592 -1.001,-1.418 -1.726,-2.675c-1.412,-2.447 -1.581,-3.388 -1.579,-3.653c0.136,-0.136 0.335,-0.25 0.681,-0.448l0.012,-0.007c0.057,-0.033 0.119,-0.068 0.185,-0.107c0.071,-0.04 0.136,-0.078 0.197,-0.114c0.344,-0.2 0.542,-0.315 0.728,-0.365c0.231,0.131 0.962,0.747 2.374,3.194c0.726,1.256 1.177,2.128 1.454,2.832c0.143,0.347 0.192,0.632 0.215,0.789c-0.16,0.128 -0.392,0.262 -0.753,0.469l-0.001,0.001c-0.067,0.038 -0.138,0.079 -0.214,0.123c-0.076,0.043 -0.147,0.085 -0.213,0.123c-0.361,0.21 -0.593,0.344 -0.784,0.418c-0.124,-0.097 -0.347,-0.283 -0.576,-0.58Zm-1.958,0.923l0.103,-0.06c-0.461,-0.634 -0.984,-1.467 -1.603,-2.538c-0.619,-1.072 -1.062,-1.951 -1.358,-2.68l-0.142,0.081l-2.598,1.5c-1.026,0.591 -1.627,0.989 -2.042,1.377c-0.158,0.133 -0.225,0.228 -0.253,0.28l0,0.001c0.004,0.054 0.015,0.205 0.136,0.475c0.201,0.476 0.528,1.043 0.99,1.843l0.141,0.245c0.463,0.801 0.789,1.367 1.101,1.779c0.174,0.24 0.299,0.325 0.344,0.356l0.001,0c0.059,0.002 0.174,-0.009 0.369,-0.079c0.544,-0.165 1.189,-0.488 2.213,-1.08l2.598,-1.5Zm-9.397,-0.349l-0.031,0.018l-1.299,0.751c-1.398,0.806 -1.539,1.405 -1.566,1.593c-0.045,0.323 0.071,0.763 0.436,1.453c0.306,0.578 0.62,0.88 0.904,0.991c0.196,0.076 0.823,0.236 2.226,-0.573l1.299,-0.75l0.031,-0.019c-0.313,-0.469 -0.643,-1.042 -1.03,-1.711l-0.001,-0.002c-0.387,-0.671 -0.718,-1.244 -0.969,-1.751Z\" />\n          <path d=\"M7.027,22.232c-0.478,0.276 -1.089,0.112 -1.366,-0.366l-1,-1.732c-0.276,-0.479 -0.112,-1.09 0.366,-1.367c0.479,-0.276 1.09,-0.112 1.367,0.367l1,1.732c0.276,0.478 0.112,1.089 -0.367,1.366Z\" />\n          <path d=\"M19.52,20.258c-0.534,0.143 -0.85,0.692 -0.707,1.225l1.279,4.775c0.117,0.438 0.513,0.742 0.966,0.742c0.658,0 1.136,-0.624 0.966,-1.259l-1.28,-4.775c-0.142,-0.534 -0.691,-0.851 -1.224,-0.708Z\" />\n          <path d=\"M16.554,26c0,0.552 -0.448,1 -1,1c-0.553,0 -1,-0.448 -1,-1l0,-3c0,-0.553 0.447,-1 1,-1c0.552,0 1,0.447 1,1l0,3Z\" />\n          <path d=\"M11.822,26.258c-0.117,0.438 -0.514,0.742 -0.966,0.742c-0.658,0 -1.136,-0.624 -0.966,-1.259l0.475,-1.775c0.143,-0.534 0.692,-0.851 1.225,-0.708c0.534,0.143 0.85,0.692 0.707,1.225l-0.475,1.775Z\" />\n        </g>\n      );\n    case 'facebook':\n      return (\n        <g>\n          <path d=\"M19.491,27.944c7.731,-0.319 8.509,-2.242 8.509,-11.944c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,10.985 0.997,11.997 11.956,12l0,-7.667l-2.956,0l0,-3.377l2.956,0l0,-2.491c0,-2.891 1.789,-4.465 4.403,-4.465c1.251,0 2.327,0.092 2.641,0.133l0,3.021l-1.813,0.001c-1.421,0 -1.696,0.666 -1.696,1.644l0,2.157l3.39,0l-0.442,3.377l-2.948,0l0,7.611Z\" />\n        </g>\n      );\n    case 'flag':\n      return (\n        <g>\n          <path d=\"M10.953 5.034a1 1 0 0 0-1.225.707L4.034 26.992a1 1 0 1 0 1.932.517l5.694-21.25a1 1 0 0 0-.707-1.225zm2.107 9.005c.425-1.703.798-3.036 1.225-4.079.429-1.058.766-1.43.912-1.532a.216.216 0 0 0 .022-.023l.017.003c.131-.022.133-.021.353.073l.065.028c.584.23 1.492.826 2.826 2.076 1.584 1.462 3.173 2.338 4.36 2.738a9.906 9.906 0 0 0 2.045.4c-.312 1.161-.627 2.297-1.028 3.334-.405 1.061-.756 1.774-1.284 2.307-.385.41-.719.542-1.131.527-.519-.018-1.447-.289-2.901-1.37-1.746-1.291-3.25-2.073-4.327-2.514a17.61 17.61 0 0 0-1.498-.524c.08-.375.193-.838.344-1.444zm12.104-1.615a.522.522 0 0 1 0 0zm-13.21 2.816l.017.008a.08.08 0 0 1-.017-.008zm-.834-1.685c1.727-6.93 3.174-9.634 8.727-4.43 2.833 2.655 4.933 2.646 6.14 2.641 1.16-.005 1.494-.007.86 2.359-1.294 4.83-3.053 10.796-9.5 6-2.638-1.962-4.392-2.486-5.449-2.801-1.526-.456-1.599-.478-.778-3.769z\" />\n        </g>\n      );\n    case 'flag-fill':\n      return (\n        <g>\n          <path d=\"M11.153,4.434c-0.533,-0.143 -1.082,0.174 -1.225,0.707l-5.694,21.251c-0.143,0.533 0.174,1.082 0.707,1.224c0.534,0.143 1.082,-0.173 1.225,-0.707l2.745,-10.242c0.059,0.019 0.122,0.037 0.187,0.057c1.057,0.315 2.811,0.839 5.449,2.801c6.447,4.796 8.206,-1.17 9.5,-6c0.634,-2.366 0.3,-2.364 -0.86,-2.359c-1.207,0.005 -3.307,0.014 -6.14,-2.641c-2.401,-2.25 -4.034,-3.022 -5.255,-2.612l0.068,-0.254c0.143,-0.533 -0.173,-1.082 -0.707,-1.225Z\" />\n        </g>\n      );\n    case 'freeze':\n      return (\n        <g>\n          <path d=\"M17,4.923c0,-0.51 -0.448,-0.923 -1,-0.923c-0.552,0 -1,0.413 -1,0.923l0,2.414c-0.471,-0.313 -0.871,-0.673 -1.482,-1.227c-0.354,-0.424 -0.984,-0.482 -1.408,-0.128c-0.425,0.353 -0.482,0.984 -0.128,1.409c0.628,0.685 1.864,1.859 3.018,2.365l0,12.488c-1.154,0.506 -2.39,1.68 -3.018,2.365c-0.354,0.425 -0.297,1.056 0.128,1.409c0.424,0.354 1.054,0.296 1.408,-0.128c0.611,-0.554 1.011,-0.914 1.482,-1.227l0,2.414c0,0.51 0.448,0.923 1,0.923c0.552,0 1,-0.413 1,-0.923l0,-2.414c0.471,0.313 0.87,0.673 1.482,1.227c0.353,0.424 0.984,0.482 1.408,0.128c0.424,-0.353 0.481,-0.984 0.128,-1.409c-0.629,-0.685 -1.864,-1.859 -3.018,-2.365l0,-12.488c1.154,-0.506 2.389,-1.68 3.018,-2.365c0.353,-0.425 0.296,-1.056 -0.128,-1.409c-0.424,-0.354 -1.055,-0.296 -1.408,0.128c-0.612,0.554 -1.011,0.914 -1.482,1.227l0,-2.414Z\" />\n          <path d=\"M26.092,11.328c0.442,-0.255 0.576,-0.849 0.3,-1.328c-0.276,-0.478 -0.858,-0.659 -1.3,-0.404l-2.09,1.207c0.035,-0.564 0.148,-1.091 0.322,-1.897c0.191,-0.518 -0.075,-1.093 -0.593,-1.284c-0.519,-0.19 -1.094,0.076 -1.284,0.594c-0.279,0.887 -0.679,2.544 -0.54,3.796l-10.815,6.244c-1.015,-0.746 -2.65,-1.229 -3.557,-1.43c-0.545,-0.094 -1.062,0.27 -1.156,0.815c-0.094,0.544 0.27,1.061 0.815,1.155c0.785,0.252 1.297,0.418 1.803,0.67l-2.09,1.207c-0.442,0.255 -0.576,0.849 -0.3,1.327c0.276,0.479 0.858,0.66 1.3,0.405l2.09,-1.207c-0.035,0.564 -0.147,1.091 -0.322,1.897c-0.19,0.518 0.075,1.093 0.594,1.284c0.518,0.19 1.093,-0.076 1.284,-0.594c0.279,-0.887 0.678,-2.544 0.539,-3.797l10.815,-6.244c1.015,0.747 2.65,1.23 3.558,1.431c0.544,0.094 1.062,-0.27 1.156,-0.815c0.094,-0.544 -0.271,-1.061 -0.815,-1.155c-0.786,-0.253 -1.298,-0.418 -1.804,-0.67l2.09,-1.207Z\" />\n          <path d=\"M25.093,22.405c0.441,0.255 1.023,0.074 1.299,-0.405c0.276,-0.478 0.142,-1.072 -0.299,-1.327l-2.091,-1.207c0.507,-0.252 1.018,-0.418 1.804,-0.67c0.544,-0.094 0.909,-0.611 0.815,-1.155c-0.094,-0.545 -0.612,-0.909 -1.156,-0.815c-0.908,0.201 -2.542,0.684 -3.558,1.43l-10.815,-6.244c0.139,-1.252 -0.26,-2.909 -0.539,-3.796c-0.191,-0.518 -0.766,-0.784 -1.284,-0.594c-0.518,0.191 -0.784,0.766 -0.593,1.284c0.174,0.806 0.286,1.333 0.321,1.897l-2.09,-1.207c-0.442,-0.255 -1.023,-0.074 -1.3,0.404c-0.276,0.479 -0.142,1.073 0.3,1.328l2.09,1.207c-0.506,0.252 -1.018,0.417 -1.803,0.67c-0.544,0.094 -0.909,0.611 -0.815,1.155c0.094,0.545 0.612,0.909 1.156,0.815c0.907,-0.201 2.542,-0.684 3.557,-1.43l10.815,6.243c-0.138,1.253 0.261,2.91 0.54,3.797c0.19,0.518 0.765,0.784 1.284,0.594c0.518,-0.191 0.784,-0.766 0.593,-1.284c-0.174,-0.806 -0.287,-1.333 -0.322,-1.897l2.091,1.207Z\" />\n        </g>\n      );\n    case 'friend':\n      return (\n        <g>\n          <path\n            d=\"M 11.4912 8.97717C 12.3703 8.17303 12.6567 6.87286 12.6567 5C 12.6567 2.23859 10.4181 0 7.65668 0C 4.89526 0 2.65668 2.23859 2.65668 5C 2.65668 6.87286 2.94302 8.17303 3.82211 8.97717C 2.19708 9.86633 0.914429 11.3031 0.222412 13.0393C 0.0597229 13.4474 0.0085144 13.9776 0.38324 14.207C 1.17523 14.692 2.01566 13.7498 2.48837 12.9504C 3.53268 11.1844 5.45636 10 7.65668 10C 7.76151 10 7.86569 10.0027 7.96918 10.008C 9.10062 10.066 10.3418 9.95276 11.209 9.22382C 11.3059 9.14246 11.4006 9.06012 11.4912 8.97717ZM 10.6567 5C 10.6567 6.68262 10.3854 7.24109 10.1871 7.45593C 10.0244 7.63208 9.50742 8 7.65668 8C 5.80594 8 5.28891 7.63208 5.12628 7.45593C 4.92798 7.24109 4.65668 6.68262 4.65668 5C 4.65668 3.34314 5.99982 2 7.65668 2C 9.31354 2 10.6567 3.34314 10.6567 5ZM 12.6567 11.88C 13.9552 10.6 15.2537 10.92 15.9029 11.56C 18.4999 14.12 13.4531 17.5 12.6567 17.5C 11.8602 17.5 6.81342 14.12 9.41043 11.56C 10.0597 10.92 11.3582 10.6 12.6567 11.88Z\"\n            transform=\"translate(8.34332 8)\"\n          />\n        </g>\n      );\n    case 'github':\n      return (\n        <g>\n          <path d=\"M18.837,27.966c8.342,-0.241 9.163,-1.997 9.163,-11.966c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,9.995 0.826,11.734 9.228,11.968c0.073,-0.091 0.1,-0.205 0.1,-0.321c0,-0.25 -0.01,-2.816 -0.015,-3.699c-3.037,0.639 -3.678,-1.419 -3.678,-1.419c-0.497,-1.222 -1.213,-1.548 -1.213,-1.548c-0.991,-0.656 0.075,-0.643 0.075,-0.643c1.096,0.075 1.673,1.091 1.673,1.091c0.974,1.617 2.556,1.15 3.178,0.879c0.099,-0.683 0.381,-1.15 0.693,-1.414c-2.425,-0.267 -4.974,-1.175 -4.974,-5.23c0,-1.155 0.426,-2.099 1.124,-2.839c-0.113,-0.268 -0.487,-1.344 0.107,-2.8c0,0 0.917,-0.285 3.003,1.084c0.871,-0.235 1.805,-0.352 2.734,-0.356c0.927,0.004 1.861,0.121 2.734,0.356c2.085,-1.369 3,-1.084 3,-1.084c0.596,1.456 0.221,2.532 0.108,2.8c0.7,0.74 1.123,1.684 1.123,2.839c0,4.065 -2.553,4.96 -4.986,5.221c0.392,0.327 0.741,0.973 0.741,1.96c0,0.946 -0.006,2.619 -0.01,3.728c-0.002,0.549 -0.003,0.959 -0.003,1.074c0,0.109 0.029,0.224 0.095,0.319Z\" />\n        </g>\n      );\n    case 'google':\n      return (\n        <g>\n          <path d=\"M16,28c11,0 12,-1 12,-12c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,11 1,12 12,12Zm0.142,-10.558l0,-2.675l6.731,0.01c0.588,2.728 -0.735,8.223 -6.731,8.223c-3.944,0 -7.142,-3.134 -7.142,-7c0,-3.866 3.198,-7 7.142,-7c1.852,0 3.54,0.691 4.81,1.825l-2.01,1.97c-0.754,-0.633 -1.73,-1.017 -2.8,-1.017c-2.379,0 -4.308,1.89 -4.308,4.222c0,2.332 1.929,4.222 4.308,4.222c1.998,0 3.38,-1.159 3.888,-2.78l-3.888,0Z\" />\n        </g>\n      );\n    case 'home':\n      return (\n        <g>\n          <path d=\"M16,5c-0.358,0 -0.736,0.149 -0.997,0.264c-0.297,0.13 -0.676,0.326 -1.077,0.555c-0.789,0.451 -1.798,1.102 -2.878,1.864c-2.149,1.518 -4.715,3.572 -6.755,5.61c-0.391,0.39 -0.391,1.024 0,1.414c0.39,0.391 1.024,0.391 1.414,0c1.96,-1.962 4.394,-3.908 6.495,-5.39c1.045,-0.738 1.974,-1.337 2.716,-1.761c0.365,-0.209 0.649,-0.357 0.887,-0.46c0.091,-0.04 0.154,-0.064 0.195,-0.078c0.041,0.014 0.104,0.038 0.194,0.078c0.239,0.103 0.523,0.251 0.888,0.46c0.742,0.424 1.671,1.023 2.716,1.761c2.101,1.482 4.535,3.428 6.495,5.39c0.39,0.391 1.024,0.391 1.414,0c0.391,-0.39 0.391,-1.024 0,-1.414c-2.04,-2.038 -4.606,-4.092 -6.755,-5.61c-1.08,-0.762 -2.089,-1.413 -2.878,-1.864c-0.401,-0.229 -0.78,-0.425 -1.077,-0.555c-0.262,-0.115 -0.639,-0.264 -0.997,-0.264Zm3.934,19.816c0.184,-0.028 0.358,-0.061 0.524,-0.098l0.014,-0.003c0.923,-0.2 1.291,-0.482 1.522,-0.79c0.292,-0.39 0.589,-1.123 0.774,-2.649l0.001,-0.003c0.165,-1.347 0.218,-3.047 0.229,-5.273c0.002,-0.552 0.45,-1 1.002,-1c0.552,0 1,0.448 0.998,1c-0.052,10.061 -1.005,11 -8.998,11c-7.993,0 -8.946,-0.939 -8.998,-11c-0.002,-0.552 0.446,-1 0.998,-1c0.552,0 1,0.448 1.002,1c0.011,2.226 0.064,3.926 0.229,5.273l0.001,0.003c0.185,1.526 0.482,2.259 0.774,2.649c0.231,0.308 0.599,0.59 1.523,0.79l0.013,0.003c0.166,0.037 0.34,0.07 0.524,0.098c-0.049,-0.788 -0.066,-1.718 -0.066,-2.816c0,-5.133 0.4,-6 4,-6c3.6,0 4,0.867 4,6c0,1.098 -0.017,2.028 -0.066,2.816Zm-2.015,0.16c0.062,-0.782 0.081,-1.74 0.081,-2.976c0,-1.258 -0.02,-2.159 -0.105,-2.87l0,-0.002c-0.081,-0.688 -0.196,-0.921 -0.228,-0.973c-0.001,-0.001 -0.001,-0.002 -0.001,-0.003c-0.002,-0.005 -0.007,-0.009 -0.012,-0.009c-0.019,-0.001 -0.042,-0.003 -0.073,-0.009c-0.004,-0.001 -0.009,-0.002 -0.012,-0.003c-0.338,-0.11 -0.751,-0.133 -1.568,-0.131l-0.002,0c-0.817,-0.002 -1.23,0.021 -1.568,0.131c-0.004,0.001 -0.008,0.002 -0.012,0.003c-0.031,0.006 -0.055,0.008 -0.073,0.009c-0.005,0 -0.01,0.004 -0.012,0.009c0,0.002 0,0.002 -0.001,0.003c-0.032,0.052 -0.147,0.285 -0.228,0.973l0,0.002c-0.085,0.711 -0.105,1.612 -0.105,2.87c0,1.236 0.019,2.194 0.08,2.976c0.569,0.018 1.204,0.024 1.92,0.024l0,0c0.715,0 1.35,-0.006 1.919,-0.024Z\" />\n        </g>\n      );\n    case 'idea':\n      return (\n        <g>\n          <path d=\"M15,4c0,-0.552 0.448,-1 1,-1c0.552,0 1,0.448 1,1l0,2c0,0.552 -0.448,1 -1,1c-0.552,0 -1,-0.448 -1,-1l0,-2Zm-5.879,2.707c-0.39,-0.39 -1.023,-0.39 -1.414,0c-0.39,0.391 -0.39,1.024 0,1.414l1.414,1.415c0.391,0.39 1.024,0.39 1.415,0c0.39,-0.391 0.39,-1.024 0,-1.415l-1.415,-1.414Zm9.688,11.72c0.732,-0.786 1.191,-1.881 1.191,-3.251c0,-2.361 -1.845,-4.176 -4,-4.176c-2.155,0 -4,1.815 -4,4.176c0,1.537 0.335,2.397 1.168,3.224c0.86,0.854 1.674,2.086 1.812,3.6l2.046,0c0.158,-1.539 1.024,-2.757 1.783,-3.573Zm1.464,1.363c-0.703,0.754 -1.273,1.677 -1.273,2.708c0,0.829 -0.672,1.502 -1.502,1.502l-2.95,0c-0.855,0 -1.548,-0.693 -1.548,-1.548c0,-1.009 -0.525,-1.922 -1.241,-2.633c-1.295,-1.286 -1.759,-2.704 -1.759,-4.643c0,-3.411 2.686,-6.176 6,-6.176c3.314,0 6,2.765 6,6.176c0,1.841 -0.628,3.433 -1.727,4.614Zm-3.509,5.21c0.758,0 0.777,0.126 0.046,0.327l-3.45,0.949c-0.182,0.049 -0.36,-0.088 -0.36,-0.276c0,-0.218 0.07,-0.42 0.189,-0.585c0.089,-0.123 0.232,-0.19 0.378,-0.23l0.565,-0.151c0.084,-0.023 0.171,-0.034 0.258,-0.034l2.374,0Zm-3.762,2.534c0.027,0.386 0.474,0.514 0.847,0.414l4.603,-1.234c0.323,-0.086 0.548,-0.379 0.548,-0.714c0,-0.265 -0.287,-0.391 -0.543,-0.322l-5.143,1.378c-0.185,0.049 -0.314,0.217 -0.314,0.409c0,0.023 0.001,0.046 0.002,0.069Zm3.515,1.466c0.088,0 0.175,-0.012 0.259,-0.034l1.137,-0.305c0.105,-0.028 0.205,-0.073 0.296,-0.134l0.346,-0.23c0.278,-0.186 0.445,-0.498 0.445,-0.832c0,-0.066 -0.062,-0.114 -0.126,-0.097l-4.587,1.23c-0.109,0.029 -0.132,0.172 -0.039,0.234c0.164,0.11 0.357,0.168 0.555,0.168l1.714,0Zm8.018,-22.293c-0.39,-0.39 -1.023,-0.39 -1.414,0l-1.414,1.414c-0.39,0.391 -0.39,1.024 0,1.415c0.391,0.39 1.024,0.39 1.414,0l1.415,-1.415c0.39,-0.39 0.39,-1.023 0,-1.414Zm2.464,7.293c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-2,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l2,0Zm-19,1c0,-0.552 -0.448,-1 -1,-1l-2,0c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l2,0c0.552,0 1,-0.448 1,-1Z\" />\n        </g>\n      );\n    case 'info':\n      return (\n        <g id=\"info\">\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M24.3358 7.66423C23.2469 6.57538 21.1 6.00001 16 6C10.9 5.99999 8.75306 6.57537 7.66421 7.66421C6.57537 8.75305 6 10.9 6 16C6 21.1 6.57538 23.247 7.66422 24.3358C8.75306 25.4246 10.9 26 16 26C21.1 26 23.2469 25.4246 24.3358 24.3358C25.4246 23.2469 26 21.1 26 16C26 10.9 25.4246 8.75307 24.3358 7.66423ZM16 4C26 4.00001 28 6.00002 28 16C28 26 26 28 16 28C6 28 4.00001 26 4 16C3.99999 6 6.00001 3.99999 16 4Z\"\n          />\n          <circle cx=\"15.5\" cy=\"10.5\" r=\"1.5\" />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M15 14C14.4477 14 14 14.4477 14 15C14 15.5523 14.4477 16 15 16V21C15 21.5523 15.4477 22 16 22C16.5523 22 17 21.5523 17 21V15C17 14.4477 16.5523 14 16 14H15Z\"\n          />\n        </g>\n      );\n    case 'inserter':\n      return (\n        <g>\n          <path d=\"M28,16c0,-10.5 -1.5,-12 -12,-12c-10.5,0 -12,1.5 -12,12c0,10.5 1.5,12 12,12c10.5,0 12,-1.5 12,-12Zm-14.89,4.482c-0.424,0.353 -0.482,0.984 -0.128,1.408c0.353,0.424 0.984,0.482 1.408,0.128l0.001,-0.001c0.26,-0.216 0.524,-0.433 0.79,-0.652c1.581,-1.299 3.235,-2.658 4.41,-4.311c0.219,-0.312 0.409,-0.664 0.409,-1.054c0,-0.39 -0.19,-0.742 -0.409,-1.053c-1.192,-1.679 -2.79,-2.988 -4.374,-4.285c-0.277,-0.226 -0.553,-0.452 -0.826,-0.68c-0.425,-0.353 -1.056,-0.296 -1.409,0.128c-0.354,0.424 -0.296,1.055 0.128,1.408c0.254,0.213 0.511,0.423 0.768,0.635c1.434,1.178 2.878,2.364 4.007,3.847c-1.109,1.457 -2.584,2.673 -4.009,3.847c-0.258,0.213 -0.514,0.424 -0.766,0.635Z\" />\n        </g>\n      );\n    case 'like':\n      return (\n        <g>\n          <path d=\"M15.982 13.578l-1.414-1.414C12.876 10.473 11.364 10 10.232 10c-1.17 0-2.175.503-2.836 1.164-1.592 1.592-1.887 3.022-1.676 4.288.235 1.407 1.152 2.928 2.579 4.412 1.432 1.501 3.108 2.703 4.719 3.616.789.451 1.453.769 2.062 1.001.344.134.65.199.809.233l.093.02.092-.02c.159-.034.466-.099.81-.233.608-.232 1.273-.55 2.062-1.001 1.611-.913 3.287-2.115 4.719-3.616 1.427-1.484 2.344-3.005 2.578-4.412.211-1.266-.083-2.696-1.675-4.288A4.035 4.035 0 0 0 21.732 10c-1.132 0-2.644.473-4.336 2.164l-1.414 1.414zm0-2.828c4-4 8-3 10-1 8 8-7 17-10 17s-18-9-10-17c2-2 6-3 10 1z\" />\n        </g>\n      );\n    case 'like-fill':\n      return (\n        <g>\n          <path\n            d=\"M25.982 9.75c-2-2-6-3-10 1-4-4-8-3-10-1-8 8 7 17 10 17s18-9 10-17z\"\n            fillRule=\"nonzero\"\n          />\n        </g>\n      );\n    case 'link':\n      return (\n        <g>\n          <path d=\"M16.693,16.664c0.376,-0.375 1.001,-0.413 1.377,-0.038l0.083,0.084c0.358,0.357 0.386,0.93 0.032,1.291c-0.026,0.026 -0.051,0.052 -0.077,0.078c-0.867,0.866 -1.671,1.438 -2.514,1.655c0,0 -0.001,0 -0.001,0c-0.078,0.02 -0.157,0.037 -0.236,0.051c0,0 0,0 0,0c-0.802,0.142 -1.646,-0.036 -2.616,-0.582l0,0c-0.907,-0.511 -1.923,-1.343 -3.119,-2.539c-3.959,-3.959 -3.939,-5.959 -1.414,-8.485c2.526,-2.525 4.526,-2.545 8.485,1.414c0.439,0.439 0.828,0.853 1.171,1.247c0.102,0.117 -0.009,0.3 -0.162,0.28c0,0 0,0 -0.001,0c-0.559,-0.074 -1.083,-0.035 -1.58,0.094c-0.299,0.078 -0.624,0.012 -0.842,-0.206c-1.958,-1.958 -3.035,-2.492 -3.63,-2.571c-0.366,-0.049 -0.902,0.032 -2.027,1.156c-1.124,1.125 -1.205,1.661 -1.156,2.027c0.079,0.595 0.613,1.672 2.571,3.63c0.432,0.433 0.822,0.796 1.173,1.1c0,0 0,0 0,0c0.046,0.04 0.091,0.079 0.136,0.117c0,0 0,0 0,0c0.841,0.712 1.45,1.073 1.891,1.24c0,0 0,0 0,0c0.166,0.062 0.308,0.098 0.429,0.114c0,0 0,0 0,0c0.367,0.049 0.903,-0.032 2.027,-1.157Zm3.07,-1.099c-0.912,-0.79 -1.563,-1.181 -2.027,-1.357c0,0 0,0 0,0c-0.166,-0.063 -0.308,-0.098 -0.43,-0.114c0,0 0,0 0,0c-0.367,-0.049 -0.902,0.032 -2.027,1.156c-0.375,0.376 -1.001,0.414 -1.376,0.038l-0.083,-0.083c-0.358,-0.358 -0.387,-0.931 -0.032,-1.291c0.025,-0.026 0.051,-0.052 0.077,-0.078c0.866,-0.866 1.671,-1.438 2.514,-1.655l0,0c0.873,-0.225 1.786,-0.07 2.853,0.531c0,0 0,0 0,0c0.906,0.51 1.923,1.343 3.118,2.538c3.96,3.96 3.94,5.96 1.414,8.486c-2.525,2.525 -4.525,2.545 -8.485,-1.415c-0.438,-0.438 -0.828,-0.852 -1.171,-1.246c-0.102,-0.117 0.009,-0.301 0.163,-0.28c0.559,0.074 1.083,0.035 1.581,-0.094c0.299,-0.078 0.623,-0.012 0.841,0.206c1.958,1.958 3.035,2.492 3.63,2.571c0.367,0.049 0.903,-0.032 2.027,-1.157c1.125,-1.124 1.206,-1.66 1.157,-2.027c-0.079,-0.595 -0.613,-1.672 -2.571,-3.63c-0.433,-0.432 -0.822,-0.795 -1.173,-1.099Z\" />\n        </g>\n      );\n    case 'logo':\n      return (\n        <g>\n          <path d=\"M6,14.5c0,0.828 0.672,1.5 1.5,1.5l1.5,0c3.866,0 7,3.134 7,7l0,1.5c0,0.828 0.672,1.5 1.5,1.5l7,0c0.828,0 1.5,-0.672 1.5,-1.5l0,-1.5c0,-9.389 -7.611,-17 -17,-17l-1.5,0c-0.828,0 -1.5,0.672 -1.5,1.5l0,7Z\" />\n        </g>\n      );\n    case 'markdown':\n      return (\n        <g>\n          <path\n            d=\"M 12 0C 22.5 0 24 1 24 8C 24 15 22.5 16 12 16C 1.5 16 0 15 0 8C 0 1 1.5 0 12 0ZM 4 12L 6 12L 6 7.61032L 7.14252 9.5145L 8 10.9436L 8.85748 9.5145L 10 7.61032L 10 12L 12 12L 12 4L 9.83383 4L 8 7.05635L 6.16617 4L 4 4L 4 12ZM 17 12L 13.5 8L 16 8L 16 4L 18 4L 18 8L 20.5 8L 17 12Z\"\n            transform=\"translate(4 8)\"\n          />\n        </g>\n      );\n    case 'member-add':\n      return (\n        <g>\n          <path d=\"M23.981,7c-0.552,0 -1,0.448 -1,1l0,2l-2,0c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l2,0l0,2c0,0.552 0.448,1 1,1c0.553,0 1,-0.448 1,-1l0,-2l2,0c0.553,0 1,-0.448 1,-1c0,-0.552 -0.447,-1 -1,-1l-2,0l0,-2c0,-0.552 -0.447,-1 -1,-1Z\" />\n          <path d=\"M16.981,17c0,1.683 -0.271,2.241 -0.469,2.456c-0.163,0.176 -0.68,0.544 -2.531,0.544c-1.85,0 -2.367,-0.368 -2.53,-0.544c-0.198,-0.215 -0.47,-0.773 -0.47,-2.456c0,-1.657 1.343,-3 3,-3c1.657,0 3,1.343 3,3Zm0.835,3.977c0.879,-0.804 1.165,-2.104 1.165,-3.977c0,-2.761 -2.238,-5 -5,-5c-2.761,0 -5,2.239 -5,5c0,1.873 0.287,3.173 1.166,3.977c-1.665,0.911 -2.97,2.396 -3.649,4.189c-0.124,0.328 -0.154,0.708 0.051,0.993c0.569,0.789 1.674,-0.111 2.13,-0.97c1.008,-1.897 3.004,-3.189 5.302,-3.189c2.298,0 4.295,1.292 5.303,3.189c0.456,0.859 1.561,1.759 2.129,0.97c0.205,-0.285 0.176,-0.665 0.052,-0.993c-0.68,-1.793 -1.985,-3.278 -3.649,-4.189Z\" />\n        </g>\n      );\n    case 'member-remove':\n      return (\n        <g>\n          <path d=\"M21.981,9c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1c1.648,0 5,0 6,0c0.553,0 1,-0.448 1,-1c0,-0.552 -0.447,-1 -1,-1c-3.173,0 -2.219,0 -6,0Z\" />\n          <path d=\"M16.981,16c0,1.683 -0.271,2.241 -0.469,2.456c-0.163,0.176 -0.68,0.544 -2.531,0.544c-1.85,0 -2.367,-0.368 -2.53,-0.544c-0.198,-0.215 -0.47,-0.773 -0.47,-2.456c0,-1.657 1.343,-3 3,-3c1.657,0 3,1.343 3,3Zm0.835,3.977c0.879,-0.804 1.165,-2.104 1.165,-3.977c0,-2.761 -2.238,-5 -5,-5c-2.761,0 -5,2.239 -5,5c0,1.873 0.287,3.173 1.166,3.977c-1.665,0.911 -2.97,2.396 -3.649,4.189c-0.124,0.328 -0.154,0.708 0.051,0.993c0.569,0.789 1.674,-0.111 2.13,-0.97c1.008,-1.897 3.004,-3.189 5.302,-3.189c2.298,0 4.295,1.292 5.303,3.189c0.456,0.859 1.561,1.759 2.129,0.97c0.205,-0.285 0.176,-0.665 0.052,-0.993c-0.679,-1.793 -1.985,-3.278 -3.649,-4.189Z\" />\n        </g>\n      );\n    case 'mention':\n      return (\n        <g>\n          <path d=\"M22.586,9.414c0.864,0.864 1.414,2.572 1.414,6.586l0,1.5c0,0.828 -0.672,1.5 -1.5,1.5c-0.828,0 -1.5,-0.672 -1.5,-1.5l0,-0.5l0,-1l0,-4c0,-0.552 -0.448,-1 -1,-1c-0.552,0 -1,0.448 -1,1c-0.836,-0.628 -1.874,-1 -3,-1c-2.761,0 -5,2.239 -5,5c0,2.761 2.239,5 5,5c1.416,0 2.694,-0.588 3.604,-1.534c0.63,0.926 1.692,1.534 2.896,1.534c1.933,0 3.5,-1.567 3.5,-3.5l0,-0.5l0,-1c0,-8 -2,-10 -10,-10c-8,0 -10,2 -10,10c0,8 2,10 10,10l6,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1l-6,0c-4.014,0 -5.722,-0.55 -6.586,-1.414c-0.864,-0.864 -1.414,-2.572 -1.414,-6.586c0,-4.014 0.55,-5.722 1.414,-6.586c0.864,-0.864 2.572,-1.414 6.586,-1.414c4.014,0 5.722,0.55 6.586,1.414Zm-3.586,6.586c0,1.657 -1.343,3 -3,3c-1.657,0 -3,-1.343 -3,-3c0,-1.657 1.343,-3 3,-3c1.657,0 3,1.343 3,3Z\" />\n        </g>\n      );\n    case 'menu':\n      return (\n        <g>\n          <path d=\"M9,10c0,-0.552 0.448,-1 1,-1l12,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-12,0c-0.552,0 -1,-0.448 -1,-1Z\" />\n          <path d=\"M9,15c0,-0.552 0.448,-1 1,-1l12,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-12,0c-0.552,0 -1,-0.448 -1,-1Z\" />\n          <path d=\"M9,20c0,-0.552 0.448,-1 1,-1l12,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-12,0c-0.552,0 -1,-0.448 -1,-1Z\" />\n        </g>\n      );\n    case 'message':\n      return (\n        <g>\n          <path d=\"M14.5,7.021c0.625,-0.014 1.291,-0.021 2,-0.021c10.542,0 11.5,1.5 11.5,8c0,6.5 -0.958,8 -11.5,8c-0.517,0 -1.01,-0.004 -1.482,-0.011c-0.001,0 -0.002,0 -0.002,0.001l-4.461,2.974c-0.665,0.443 -1.555,-0.034 -1.555,-0.833l0,-2.713c0,-0.002 -0.002,-0.004 -0.004,-0.005c-2.969,-0.754 -3.765,-2.347 -3.948,-5.413c-0.036,-0.607 -0.048,-1.272 -0.048,-2c0,-6.063 0.834,-7.776 9.5,-7.979Zm-7.023,12.153c-0.341,-0.732 -0.477,-1.923 -0.477,-4.174c-0.001,-1.579 0.04,-2.656 0.259,-3.523c0.171,-0.791 0.268,-1.008 0.751,-1.324c0.394,-0.301 1.12,-0.62 2.55,-0.84c1.458,-0.228 3.327,-0.312 5.892,-0.313l0.048,0c2.589,-0.001 4.473,0.084 5.94,0.313c1.43,0.22 2.156,0.539 2.55,0.84c0.483,0.316 0.58,0.533 0.751,1.324c0.219,0.867 0.259,1.944 0.259,3.523c0,1.579 -0.04,2.656 -0.259,3.523c-0.171,0.791 -0.268,1.007 -0.751,1.324c-0.394,0.301 -1.12,0.62 -2.55,0.84c-1.467,0.229 -3.351,0.313 -5.94,0.313c-0.509,0 -0.987,-0.004 -1.449,-0.011c-0.303,0.018 -0.882,0.188 -1.145,0.337l-2.906,1.937l0,-0.845c0,-0.96 -0.664,-1.728 -1.512,-1.943c-1.389,-0.353 -1.784,-0.813 -2.011,-1.301Zm4.023,-2.174c0.828,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.672,-1.5 -1.5,-1.5c-0.828,0 -1.5,0.672 -1.5,1.5c0,0.828 0.672,1.5 1.5,1.5Zm6.5,-1.5c0,0.828 -0.672,1.5 -1.5,1.5c-0.828,0 -1.5,-0.672 -1.5,-1.5c0,-0.828 0.672,-1.5 1.5,-1.5c0.828,0 1.5,0.672 1.5,1.5Zm3.5,1.5c0.828,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.672,-1.5 -1.5,-1.5c-0.828,0 -1.5,0.672 -1.5,1.5c0,0.828 0.672,1.5 1.5,1.5Z\" />\n        </g>\n      );\n    case 'message-simple':\n      return (\n        <g>\n          <path\n            d=\"M20.7414 11.5229C20.96 10.656 21.0005 9.5794 21 8C21.0005 6.4206 20.96 5.344 20.7414 4.47706C20.57 3.68581 20.4733 3.46948 19.9904 3.15288C19.5963 2.85234 18.8701 2.53297 17.4397 2.31262C15.9734 2.08387 14.0894 1.99947 11.5 2C8.91059 1.99947 7.02664 2.08387 5.56035 2.31262C4.12987 2.53297 3.40373 2.85234 3.00961 3.15288C2.52669 3.46948 2.42997 3.68581 2.25863 4.47706C2.03999 5.344 1.99948 6.4206 2 8C2 10.2512 2.13638 11.4423 2.47725 12.174C2.70449 12.6618 3.09917 13.122 4.48824 13.4746C5.33561 13.6897 6 14.4583 6 15.418V16.263L8.90618 14.3255C9.16948 14.1773 9.74784 14.007 10.0507 13.9891C10.5134 13.9965 10.9908 14 11.5 14C14.0894 14.0005 15.9734 13.9161 17.4397 13.6874C18.8701 13.467 19.5963 13.1477 19.9904 12.8471C20.4733 12.5305 20.57 12.3142 20.7414 11.5229ZM23 8C23 14.5 22.0417 16 11.5 16C10.9835 16 10.4899 15.9964 10.0184 15.9888C10.0174 15.9888 10.0164 15.9891 10.0156 15.9896L5.55469 18.9636C4.89014 19.4066 4 18.9302 4 18.1315V15.418C4 15.4157 3.99836 15.4137 3.99614 15.4131C0.43941 14.5103 0 12.4014 0 8C0 1.5 0.958344 0 11.5 0C22.0417 0 23 1.5 23 8Z\"\n            transform=\"translate(5 7)\"\n          />\n        </g>\n      );\n    case 'message-simple-new':\n      return (\n        <g>\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M25 15C25 15.4463 24.9951 15.8531 24.9839 16.2251C25.2924 16.0807 25.6368 16 26 16C26.3512 16 26.6847 16.0754 26.9853 16.2109C26.9959 15.828 27 15.4247 27 15C27 8.5 26.0417 7 15.5 7C4.95833 7 4 8.5 4 15C4 19.4014 4.43941 21.5102 7.99614 22.4131C7.99836 22.4137 8 22.4157 8 22.418V25.1315C8 25.9302 8.89015 26.4066 9.5547 25.9635L14.0156 22.9896C14.0164 22.9891 14.0174 22.9888 14.0184 22.9888C14.4899 22.9964 14.9835 23 15.5 23C17.323 23 18.8594 22.9551 20.1539 22.8473C20.0544 22.5838 20 22.2983 20 22C20 21.5735 20.1113 21.173 20.3063 20.8259C19.0438 20.9462 17.4706 21 15.5 21C14.9927 21 14.51 20.9965 14.0507 20.989C13.643 20.9825 13.2439 21.1003 12.9062 21.3255L10 23.263V22.418C10 21.4583 9.3356 20.6897 8.48825 20.4746C7.09917 20.122 6.7045 19.6618 6.47725 19.174C6.13639 18.4422 6 17.2512 6 15C6 13.3784 6.06527 12.2782 6.25863 11.4771C6.43399 10.7505 6.68274 10.4021 7.0096 10.1529C7.40373 9.85234 8.12986 9.53297 9.56034 9.31262C10.9773 9.09436 12.8903 9 15.5 9C18.1097 9 20.0227 9.09436 21.4397 9.31262C22.8701 9.53297 23.5963 9.85234 23.9904 10.1529C24.3173 10.4021 24.566 10.7505 24.7414 11.4771C24.9347 12.2782 25 13.3784 25 15ZM25 19C25 18.4477 25.4477 18 26 18C26.5523 18 27 18.4477 27 19V21H29C29.5523 21 30 21.4477 30 22C30 22.5523 29.5523 23 29 23H27V25C27 25.5523 26.5523 26 26 26C25.4477 26 25 25.5523 25 25V23H23C22.4477 23 22 22.5523 22 22C22 21.4477 22.4477 21 23 21H25V19Z\"\n          />\n        </g>\n      );\n    case 'message-fill':\n      return (\n        <g>\n          <path d=\"M28,15c0,6.5 -0.958,8 -11.5,8c-0.517,0 -1.01,-0.004 -1.482,-0.011c-0.001,0 -0.002,0 -0.002,0.001l-4.461,2.974c-0.665,0.443 -1.555,-0.034 -1.555,-0.833l0,-2.713c0,-0.002 -0.002,-0.004 -0.004,-0.005c-3.557,-0.903 -3.996,-3.012 -3.996,-7.413c0,-6.5 0.958,-8 11.5,-8c10.542,0 11.5,1.5 11.5,8Zm-16.5,2c0.828,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.672,-1.5 -1.5,-1.5c-0.828,0 -1.5,0.672 -1.5,1.5c0,0.828 0.672,1.5 1.5,1.5Zm10,0c0.828,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.672,-1.5 -1.5,-1.5c-0.828,0 -1.5,0.672 -1.5,1.5c0,0.828 0.672,1.5 1.5,1.5Zm-3.5,-1.5c0,0.828 -0.672,1.5 -1.5,1.5c-0.828,0 -1.5,-0.672 -1.5,-1.5c0,-0.828 0.672,-1.5 1.5,-1.5c0.828,0 1.5,0.672 1.5,1.5Z\" />\n        </g>\n      );\n    case 'message-new':\n      return (\n        <g>\n          <path d=\"M15.5,7c-0.709,0 -1.375,0.007 -2,0.021c-8.666,0.203 -9.5,1.916 -9.5,7.979c0,0.728 0.012,1.393 0.048,2c0.183,3.066 0.979,4.66 3.948,5.413c0.002,0.001 0.004,0.003 0.004,0.005l0,2.713c0,0.799 0.89,1.276 1.555,0.833l4.461,-2.974c0,-0.001 0.001,-0.001 0.002,-0.001c0.472,0.007 0.965,0.011 1.482,0.011c2.312,0 4.163,-0.072 5.644,-0.253c-0.093,-0.231 -0.144,-0.483 -0.144,-0.747c0,-0.507 0.189,-0.969 0.499,-1.322l-0.059,0.009c-1.467,0.229 -3.351,0.314 -5.94,0.313c-0.509,0 -0.987,-0.003 -1.449,-0.011c-0.303,0.018 -0.882,0.188 -1.145,0.337l-2.906,1.937l0,-0.845c0,-0.96 -0.664,-1.728 -1.512,-1.943c-1.389,-0.353 -1.784,-0.813 -2.011,-1.301c-0.341,-0.732 -0.477,-1.923 -0.477,-4.174c-0.001,-1.579 0.04,-2.656 0.259,-3.523c0.171,-0.791 0.268,-1.008 0.751,-1.324c0.394,-0.301 1.12,-0.62 2.55,-0.84c1.458,-0.228 3.327,-0.312 5.892,-0.313l0.048,0c2.589,-0.001 4.473,0.084 5.94,0.313c1.43,0.22 2.156,0.539 2.55,0.84c0.483,0.316 0.58,0.533 0.751,1.324c0.219,0.867 0.259,1.944 0.259,3.523c0,0.921 -0.013,1.672 -0.068,2.309c0.309,-0.196 0.675,-0.309 1.068,-0.309c0.338,0 0.657,0.084 0.937,0.232c0.048,-0.669 0.063,-1.41 0.063,-2.232c0,-6.5 -0.958,-8 -11.5,-8Zm-3.5,8.5c0,0.828 -0.672,1.5 -1.5,1.5c-0.828,0 -1.5,-0.672 -1.5,-1.5c0,-0.828 0.672,-1.5 1.5,-1.5c0.828,0 1.5,0.672 1.5,1.5Zm5,0c0,0.828 -0.672,1.5 -1.5,1.5c-0.828,0 -1.5,-0.672 -1.5,-1.5c0,-0.828 0.672,-1.5 1.5,-1.5c0.828,0 1.5,0.672 1.5,1.5Zm3.5,1.5c0.828,0 1.5,-0.672 1.5,-1.5c0,-0.828 -0.672,-1.5 -1.5,-1.5c-0.828,0 -1.5,0.672 -1.5,1.5c0,0.828 0.672,1.5 1.5,1.5Zm5.5,1c-0.552,0 -1,0.448 -1,1l0,2l-2,0c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l2,0l0,2c0,0.552 0.448,1 1,1c0.552,0 1,-0.448 1,-1l0,-2l2,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1l-2,0l0,-2c0,-0.552 -0.448,-1 -1,-1Z\" />\n        </g>\n      );\n    case 'minus':\n      return (\n        <g>\n          <path d=\"M16,6c5.1,0 7.247,0.575 8.336,1.664c1.089,1.089 1.664,3.236 1.664,8.336c0,5.1 -0.575,7.247 -1.664,8.336c-1.089,1.089 -3.236,1.664 -8.336,1.664c-5.1,0 -7.247,-0.575 -8.336,-1.664c-1.089,-1.089 -1.664,-3.236 -1.664,-8.336c0,-5.1 0.575,-7.247 1.664,-8.336c1.089,-1.089 3.236,-1.664 8.336,-1.664Zm12,10c0,-10 -2,-12 -12,-12c-10,0 -12,2 -12,12c0,10 2,12 12,12c10,0 12,-2 12,-12Zm-16,-1c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l8,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1l-8,0Z\" />\n        </g>\n      );\n    case 'minus-fill':\n      return (\n        <g>\n          <path d=\"M16,4c10,0 12,2 12,12c0,10 -2,12 -12,12c-10,0 -12,-2 -12,-12c0,-10 2,-12 12,-12Zm-4,11c-0.552,0 -1,0.448 -1,1c0,0.552 0.448,1 1,1l8,0c0.552,0 1,-0.448 1,-1c0,-0.552 -0.448,-1 -1,-1l-8,0Z\" />\n        </g>\n      );\n    case 'mute':\n      return (\n        <g>\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M17.9187 5.61612C17.9187 5.61612 17.9187 5.61612 17.9187 5.61612C17.9777 5.90533 17.7002 6.1181 17.4074 6.08069C17.4074 6.08069 17.4074 6.08069 17.4074 6.08069C16.4521 5.95862 15.4647 5.95859 14.5093 6.08066C14.5093 6.08066 14.5093 6.08066 14.5093 6.08066C14.2165 6.11807 13.939 5.90531 13.9981 5.61609C13.9981 5.61609 13.9981 5.61609 13.9981 5.61608C14.1827 4.71219 14.9928 4 15.9584 4C16.9239 4 17.7341 4.71222 17.9187 5.61612ZM12.0814 25.7795C12.0814 25.7795 12.0814 25.7795 12.0814 25.7795C11.9115 25.2815 12.3963 24.8765 12.9214 24.9111C12.9214 24.9111 12.9214 24.9111 12.9214 24.9111C13.2715 24.9342 13.6248 25.1646 13.9659 25.3871C13.9659 25.3871 13.9659 25.3871 13.9659 25.3871C14.1654 25.5172 14.3608 25.6446 14.549 25.7264C14.5491 25.7264 14.5491 25.7264 14.5491 25.7264C15.0237 25.9324 15.6573 26 15.9584 26C16.2103 26 16.8495 25.9176 17.3386 25.7064C17.5216 25.6273 17.7149 25.5075 17.9133 25.3845C17.9134 25.3844 17.9135 25.3844 17.9135 25.3843C17.9136 25.3843 17.9137 25.3842 17.9138 25.3842C18.2686 25.1643 18.6392 24.9345 18.995 24.911C18.995 24.911 18.995 24.911 18.995 24.911C19.5202 24.8763 20.0052 25.2814 19.8351 25.7795C19.8351 25.7795 19.8351 25.7795 19.8351 25.7795C19.335 27.2447 17.423 28 15.9584 28C14.4941 28 12.5815 27.2447 12.0814 25.7795ZM20.9584 14.4879C20.9584 14.4958 20.9586 14.5041 20.959 14.512C21.0393 16.1501 21.5785 17.2785 22.0494 18.264C22.0494 18.264 22.0494 18.264 22.0494 18.264C22.1524 18.4797 22.2522 18.6886 22.3432 18.8945C22.3437 18.8956 22.3443 18.8968 22.3448 18.898C22.9429 20.2247 22.9444 20.8614 22.8999 21.0825C22.8992 21.0861 22.8985 21.0895 22.8978 21.0932L22.8973 21.0961C22.897 21.0977 22.8967 21.0992 22.8964 21.1008C22.8862 21.1578 22.8618 21.269 22.4903 21.4372C22.4903 21.4372 22.4903 21.4372 22.4903 21.4372C22.0024 21.6581 21.2014 21.8246 20.0018 21.9128C20.0016 21.9128 20.0014 21.9128 20.0012 21.9128C18.8324 22 17.4983 22 16.0247 22C16.0247 22 16.0247 22 16.0247 22H15.9583H15.892C15.892 22 15.892 22 15.892 22C14.4185 22 13.0843 22 11.9156 21.9128C11.9154 21.9128 11.9152 21.9128 11.915 21.9128C10.7154 21.8246 9.91433 21.6582 9.42646 21.4374C9.42645 21.4374 9.42645 21.4374 9.42644 21.4374C9.05569 21.2696 9.03061 21.1585 9.02046 21.1017C9.02013 21.0998 9.01981 21.0981 9.01946 21.0962L9.01895 21.0935C9.0183 21.09 9.01764 21.0868 9.01693 21.0833C8.97245 20.8627 8.97353 20.226 9.5724 18.8983C9.5724 18.8983 9.5724 18.8983 9.5724 18.8983C9.6779 18.6643 9.79385 18.4306 9.91235 18.1918C9.91264 18.1912 9.91292 18.1906 9.9132 18.19C9.91349 18.1894 9.91378 18.1889 9.91406 18.1883C10.4137 17.1812 10.9584 16.083 10.9584 14.5C10.9584 11.7762 11.8638 10.5501 12.7004 9.92774C12.7066 9.92308 12.7127 9.91831 12.7188 9.9134C13.7234 9.10035 14.852 8.99512 15.9561 8.99999C15.9576 9 15.9591 9 15.9606 8.99999C17.0647 8.99512 18.1933 9.10035 19.1979 9.91343C19.204 9.91834 19.2101 9.92311 19.2164 9.92777C20.0517 10.5492 20.9557 11.7726 20.9584 14.4879ZM23.7809 17.2641C23.7808 17.264 23.7808 17.2639 23.7808 17.2639C23.7807 17.2638 23.7807 17.2637 23.7806 17.2636C23.3321 16.3506 22.9584 15.5899 22.9584 14.5C22.9584 8 18.4583 7 15.9583 7C13.4584 7 8.95837 8 8.95837 14.5C8.95837 15.576 8.66201 16.1819 8.20036 17.1257C8.20036 17.1257 8.20036 17.1257 8.20036 17.1257C8.0634 17.4057 7.9119 17.7154 7.74927 18.076C7.74927 18.076 7.74926 18.076 7.74926 18.076C5.07736 24 9.95837 24 15.9583 24C21.9583 24 26.8401 24 24.1671 18.0739C24.1671 18.0739 24.1671 18.0739 24.1671 18.0739C24.0369 17.7851 23.906 17.5187 23.7809 17.2641Z\"\n          />\n          <g>\n            <rect\n              x=\"9.85554\"\n              y=\"4.76389\"\n              width=\"26.4285\"\n              height=\"3\"\n              rx=\"1.5\"\n              transform=\"rotate(51.0892 9.85554 4.76389)\"\n              stroke=\"white\"\n            />\n          </g>\n        </g>\n      );\n    case 'notification':\n      return (\n        <g>\n          <path d=\"M22.217,19.476c-0.512,-1.149 -1.201,-2.759 -1.201,-4.487c0,-3.12 -0.878,-4.452 -1.642,-5.077c-0.84,-0.687 -2.022,-0.923 -3.359,-0.923c-1.336,0 -2.518,0.236 -3.358,0.923c-0.764,0.625 -1.642,1.957 -1.642,5.077c0,1.729 -0.689,3.339 -1.201,4.488c-0.046,0.103 -0.09,0.202 -0.133,0.298c-0.526,1.178 -0.796,1.782 -0.829,2.235c0,0.002 -0.001,0.004 -0.001,0.006c0.067,0.061 0.207,0.171 0.449,0.258c0.981,0.393 2.968,0.715 6.715,0.715c3.748,0 5.735,-0.322 6.715,-0.715c0.243,-0.087 0.383,-0.198 0.45,-0.259c0,-0.002 -0.001,-0.004 -0.001,-0.006c-0.033,-0.453 -0.303,-1.058 -0.83,-2.238c-0.042,-0.094 -0.086,-0.193 -0.132,-0.295Zm0.97,2.627c-0.003,-0.006 -0.006,-0.03 -0.002,-0.052c0.006,0.047 0.004,0.058 0.002,0.052Zm-14.343,0.001c-0.002,0.006 -0.004,-0.005 0.002,-0.051c0.003,0.022 0,0.045 -0.002,0.051Zm15.38,-3.041c-0.58,-1.285 -1.208,-2.679 -1.208,-4.074c0,-7 -4,-8 -7.001,-8c-2.999,0 -7,1 -7,8c0,1.396 -0.629,2.79 -1.209,4.076c-1.499,3.326 -2.671,5.924 8.209,5.924c10.882,0 9.709,-2.6 8.209,-5.926Z\" />\n          <g>\n            <path d=\"M17.464,6.081c0.293,0.037 0.57,-0.176 0.511,-0.465c-0.184,-0.904 -0.995,-1.616 -1.96,-1.616c-0.966,0 -1.776,0.712 -1.96,1.616c-0.059,0.289 0.218,0.502 0.511,0.465c0.955,-0.122 1.943,-0.122 2.898,0Z\" />\n            <path d=\"M12.978,25.911c-0.525,-0.035 -1.01,0.37 -0.84,0.868c0.5,1.466 2.413,2.221 3.877,2.221c1.465,0 3.376,-0.755 3.877,-2.221c0.17,-0.498 -0.315,-0.903 -0.84,-0.868c-0.555,0.037 -1.146,0.575 -1.657,0.795c-0.489,0.212 -1.128,0.294 -1.38,0.294c-0.301,0 -0.935,-0.068 -1.409,-0.274c-0.511,-0.221 -1.073,-0.778 -1.628,-0.815Z\" />\n          </g>\n        </g>\n      );\n    case 'notification-fill':\n      return (\n        <g>\n          <path d=\"M24.209,18.074c-0.597,-1.324 -1.209,-2.18 -1.209,-3.574c0,-6.5 -4.5,-7.5 -7,-7.5c-2.5,0 -7,1 -7,7.5c0,1.395 -0.498,2 -1.209,3.576c-2.672,5.924 2.209,5.924 8.209,5.924c6,0 10.882,0 8.209,-5.926Z\" />\n          <g>\n            <path d=\"M17.449,6.081c0.293,0.037 0.57,-0.176 0.511,-0.465c-0.184,-0.904 -0.995,-1.616 -1.96,-1.616c-0.966,0 -1.776,0.712 -1.96,1.616c-0.059,0.289 0.218,0.502 0.511,0.465c0.955,-0.122 1.943,-0.122 2.898,0Z\" />\n            <path d=\"M12.963,24.911c-0.525,-0.035 -1.01,0.37 -0.84,0.868c0.5,1.466 2.413,2.221 3.877,2.221c1.465,0 3.376,-0.755 3.877,-2.221c0.17,-0.498 -0.315,-0.903 -0.84,-0.868c-0.555,0.037 -1.146,0.575 -1.657,0.795c-0.489,0.212 -1.128,0.294 -1.38,0.294c-0.301,0 -0.935,-0.068 -1.409,-0.274c-0.511,-0.221 -1.073,-0.778 -1.628,-0.815Z\" />\n          </g>\n        </g>\n      );\n    case 'person':\n      return (\n        <g>\n          <path d=\"M19,13c0,1.683 -0.271,2.241 -0.47,2.456c-0.162,0.176 -0.679,0.544 -2.53,0.544c-1.851,0 -2.368,-0.368 -2.53,-0.544c-0.199,-0.215 -0.47,-0.773 -0.47,-2.456c0,-1.657 1.343,-3 3,-3c1.657,0 3,1.343 3,3Zm0.835,3.977c0.879,-0.804 1.165,-2.104 1.165,-3.977c0,-2.761 -2.239,-5 -5,-5c-2.761,0 -5,2.239 -5,5c0,1.873 0.286,3.173 1.165,3.977c-1.664,0.911 -2.969,2.396 -3.649,4.189c-0.124,0.328 -0.153,0.708 0.052,0.993c0.568,0.789 1.674,-0.111 2.13,-0.97c1.007,-1.897 3.004,-3.189 5.302,-3.189c2.298,0 4.295,1.292 5.302,3.189c0.456,0.859 1.562,1.759 2.13,0.97c0.205,-0.285 0.176,-0.665 0.052,-0.993c-0.68,-1.793 -1.985,-3.278 -3.649,-4.189Z\" />\n        </g>\n      );\n    case 'photo':\n      return (\n        <g>\n          <path d=\"M25.698,22.196c0.248,-1.511 0.302,-3.475 0.302,-6.196c0,-2.716 -0.063,-4.673 -0.324,-6.181c-0.245,-1.442 -0.619,-2.125 -1.019,-2.521c-0.403,-0.397 -1.093,-0.761 -2.534,-0.996c-1.502,-0.249 -3.445,-0.302 -6.123,-0.302c-2.678,0 -4.621,0.053 -6.123,0.302c-1.441,0.235 -2.131,0.599 -2.534,0.996c-0.4,0.396 -0.774,1.079 -1.019,2.521c-0.261,1.508 -0.324,3.465 -0.324,6.181c0,2.721 0.053,4.685 0.302,6.196c0.235,1.45 0.6,2.127 0.987,2.515c0.388,0.387 1.065,0.752 2.515,0.987c1.511,0.249 3.475,0.302 6.196,0.302c2.721,0 4.685,-0.053 6.196,-0.302c1.45,-0.235 2.127,-0.6 2.515,-0.987c0.387,-0.388 0.752,-1.065 0.987,-2.515Zm-9.698,5.804c11,0 12,-1 12,-12c0,-11 -1.169,-12 -12,-12c-10.831,0 -12,1 -12,12c0,11 1,12 12,12Z\" />\n          <path d=\"M8.556,20.674c-0.706,-0.103 -1.385,0.459 -1.28,1.164c0.06,0.406 0.379,0.72 0.784,0.784c1.958,0.308 4.539,0.378 7.94,0.378c3.4,0 5.982,-0.07 7.939,-0.378c0.406,-0.064 0.724,-0.378 0.785,-0.784c0.105,-0.705 -0.574,-1.267 -1.28,-1.164c-0.038,0.006 -0.077,0.011 -0.116,0.017c-0.001,0 -0.002,0 -0.002,0c-1.802,0.253 -4.143,0.309 -7.326,0.309c0,0 0,0 0,0c-3.183,0 -5.524,-0.056 -7.326,-0.309c0,0 -0.001,0 -0.002,0c-0.039,-0.006 -0.078,-0.011 -0.116,-0.017Z\" />\n          <path d=\"M11.722,10.034c-0.808,-0.186 -1.612,0.319 -1.798,1.126c-0.045,0.195 -0.049,0.39 -0.019,0.576c0.05,0.307 -0.056,0.664 -0.323,0.825c-0.107,0.065 -0.212,0.133 -0.316,0.204c-0.465,0.319 -1.106,0.201 -1.256,-0.343c-0.149,-0.54 -0.169,-1.125 -0.035,-1.71c0.433,-1.884 2.311,-3.06 4.194,-2.627c1.884,0.432 3.061,2.31 2.628,4.194c-0.055,0.241 -0.134,0.471 -0.234,0.687c-0.268,0.58 -1.007,0.479 -1.431,0.001c-0.052,-0.06 -0.107,-0.118 -0.164,-0.174c-0.208,-0.207 -0.25,-0.546 -0.158,-0.825c0.015,-0.044 0.027,-0.09 0.038,-0.136c0.185,-0.808 -0.319,-1.613 -1.126,-1.798Zm1.5,7.742c0.407,0.341 1.013,0.286 1.352,-0.124c0.251,-0.296 0.501,-0.6 0.752,-0.905l0.001,0c1.088,-1.32 2.208,-2.677 3.551,-3.705c1.424,1.09 2.563,2.484 3.694,3.868l0.001,0.001c0.203,0.248 0.405,0.495 0.609,0.741c0.339,0.41 0.945,0.465 1.352,0.124c0.403,-0.338 0.457,-0.957 0.122,-1.361c-0.216,-0.26 -0.432,-0.524 -0.651,-0.791l-0.007,-0.009c-1.239,-1.514 -2.533,-3.095 -4.108,-4.221c-0.299,-0.211 -0.637,-0.394 -1.012,-0.394c-0.375,0 -0.713,0.183 -1.012,0.394c-1.581,1.13 -2.909,2.754 -4.163,4.287l0,0c-0.203,0.248 -0.405,0.494 -0.604,0.735c-0.34,0.41 -0.285,1.018 0.123,1.36Zm-0.421,-2.606c0.275,-0.312 0.271,-0.778 -0.024,-1.072c-0.231,-0.23 -0.483,-0.464 -0.763,-0.704c-0.299,-0.211 -0.637,-0.394 -1.012,-0.394c-0.375,0 -0.728,0.171 -1.012,0.394c-1.441,1.135 -1.99,2.084 -2.767,3.022c-0.34,0.41 -0.285,1.018 0.123,1.36c0.407,0.341 1.013,0.286 1.352,-0.124c0.802,-1.152 1.292,-1.652 2.304,-2.61c0.089,0.084 0.173,0.165 0.254,0.242c0.42,0.401 1.161,0.321 1.545,-0.114Z\" />\n        </g>\n      );\n    case 'photo-fill':\n      return (\n        <g>\n          <path d=\"M28,16c0,11 -1,12 -12,12c-11,0 -12,-1 -12,-12c0,-11 1.169,-12 12,-12c10.831,0 12,1 12,12Zm-18.076,-3.84c0.186,-0.807 0.99,-1.311 1.798,-1.126c0.807,0.186 1.311,0.991 1.126,1.798c-0.011,0.047 -0.023,0.092 -0.038,0.137c-0.092,0.278 -0.05,0.617 0.158,0.824c0.057,0.056 0.112,0.114 0.164,0.174c0.424,0.479 1.163,0.579 1.431,-0.001c0.1,-0.216 0.179,-0.445 0.234,-0.686c0.433,-1.884 -0.744,-3.762 -2.628,-4.195c-1.883,-0.433 -3.761,0.744 -4.194,2.628c-0.134,0.585 -0.114,1.169 0.035,1.71c0.15,0.544 0.791,0.662 1.256,0.343c0.104,-0.071 0.209,-0.14 0.316,-0.205c0.267,-0.16 0.373,-0.517 0.323,-0.824c-0.03,-0.186 -0.026,-0.381 0.019,-0.577Zm3.298,6.616c0.407,0.342 1.013,0.286 1.352,-0.123l0.027,-0.033c0.01,-0.01 0.019,-0.021 0.028,-0.032c0.231,-0.274 0.461,-0.554 0.693,-0.835l0.005,-0.005l0,-0.001c1.088,-1.319 2.208,-2.677 3.551,-3.704c1.424,1.09 2.563,2.483 3.695,3.868l0.005,0.006c0.201,0.246 0.402,0.492 0.604,0.736c0.339,0.409 0.945,0.465 1.352,0.123c0.403,-0.337 0.457,-0.956 0.122,-1.361c-0.218,-0.262 -0.437,-0.529 -0.657,-0.799l0,0l-0.001,0c-1.239,-1.515 -2.533,-3.096 -4.108,-4.221c-0.299,-0.211 -0.637,-0.395 -1.012,-0.395c-0.375,0 -0.713,0.184 -1.012,0.395c-1.484,1.06 -2.746,2.557 -3.932,4.004c-0.4,-0.514 -0.753,-0.918 -1.132,-1.274c-0.008,-0.009 -0.017,-0.018 -0.025,-0.026c-0.231,-0.23 -0.483,-0.465 -0.763,-0.704c-0.289,-0.204 -0.615,-0.383 -0.974,-0.394c-0.031,-0.002 -0.061,-0.001 -0.091,0c-0.354,0.017 -0.674,0.193 -0.959,0.394c-1.292,1.302 -1.99,2.083 -2.767,3.021c-0.34,0.41 -0.285,1.019 0.123,1.36c0.407,0.342 1.013,0.286 1.352,-0.123c0.776,-1.116 1.261,-1.62 2.208,-2.52c0.711,0.503 1.13,1.028 2.062,2.313c0.057,0.124 0.142,0.237 0.254,0.33Z\" />\n        </g>\n      );\n    case 'pin':\n      return (\n        <g fillRule=\"non-zero\">\n          <path d=\"M7.407,15.978c-0.39,-0.39 -0.39,-1.024 0,-1.414l5.657,-5.657c0.39,-0.39 1.024,-0.39 1.414,0c0.391,0.391 0.391,1.024 0,1.414l-5.657,5.657c-0.39,0.391 -1.023,0.391 -1.414,0Z\" />\n          <path d=\"M15.303,22.268c-0.452,0.317 -1.076,0.207 -1.393,-0.245l-4.692,-6.702c-0.317,-0.452 -0.207,-1.076 0.245,-1.392c0.453,-0.317 1.076,-0.207 1.393,0.245l4.693,6.702c0.317,0.452 0.207,1.076 -0.246,1.392Z\" />\n          <path d=\"M20.891,16.887c0.317,-0.452 0.207,-1.076 -0.245,-1.393l-6.996,-4.898c-0.453,-0.317 -1.076,-0.207 -1.393,0.245c-0.317,0.453 -0.207,1.076 0.246,1.393l6.996,4.899c0.452,0.317 1.076,0.207 1.392,-0.246Z\" />\n          <path d=\"M13.771,23.756c-0.39,-0.39 -0.39,-1.024 0,-1.414l7.071,-7.071c0.391,-0.391 1.024,-0.391 1.414,0c0.391,0.39 0.391,1.024 0,1.414l-7.071,7.071c-0.39,0.391 -1.023,0.391 -1.414,0Z\" />\n          <path d=\"M18.721,21.635l1.414,-1.414l3.536,3.535c0.39,0.391 0.39,1.024 0,1.415c-0.391,0.39 -1.024,0.39 -1.414,0l-3.536,-3.536Z\" />\n        </g>\n      );\n    case 'pin-fill':\n      return (\n        <g>\n          <path d=\"M7.993,14.15c-0.391,0.39 -0.391,1.023 0,1.414c0.39,0.39 1.024,0.39 1.414,0l0.504,-0.504l4.586,6.549c0.024,0.035 0.051,0.069 0.079,0.1l-0.219,0.219c-0.391,0.39 -0.391,1.024 0,1.414c0.39,0.391 1.024,0.391 1.414,0l7.071,-7.071c0.391,-0.39 0.391,-1.024 0,-1.414c-0.39,-0.391 -1.024,-0.391 -1.414,0l-0.212,0.212l-6.654,-4.66l0.502,-0.502c0.39,-0.39 0.39,-1.024 0,-1.414c-0.391,-0.391 -1.024,-0.391 -1.414,0l-5.657,5.657Z\" />\n          <path d=\"M19.307,21.221l1.414,-1.414l3.536,3.535c0.39,0.391 0.39,1.024 0,1.415c-0.391,0.39 -1.024,0.39 -1.414,0l-3.536,-3.536Z\" />\n        </g>\n      );\n    case 'plus':\n      return (\n        <g>\n          <path d=\"M16,6c5.1,0 7.247,0.575 8.336,1.664c1.089,1.089 1.664,3.236 1.664,8.336c0,5.1 -0.575,7.247 -1.664,8.336c-1.089,1.089 -3.236,1.664 -8.336,1.664c-5.1,0 -7.247,-0.575 -8.336,-1.664c-1.089,-1.089 -1.664,-3.236 -1.664,-8.336c0,-5.1 0.575,-7.247 1.664,-8.336c1.089,-1.089 3.236,-1.664 8.336,-1.664Zm0,-2c10,0 12,2 12,12c0,10 -2,12 -12,12c-10,0 -12,-2 -12,-12c0,-10 2,-12 12,-12Zm-1,8c0,-0.552 0.448,-1 1,-1c0.552,0 1,0.448 1,1l0,3l3,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-3,0l0,3c0,0.552 -0.448,1 -1,1c-0.552,0 -1,-0.448 -1,-1l0,-3l-3,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l3,0l0,-3Z\" />\n        </g>\n      );\n    case 'plus-fill':\n      return (\n        <g>\n          <path d=\"M16,4c10,0 12,2 12,12c0,10 -2,12 -12,12c-10,0 -12,-2 -12,-12c0,-10 2,-12 12,-12Zm-1,8c0,-0.552 0.448,-1 1,-1c0.552,0 1,0.448 1,1l0,3l3,0c0.552,0 1,0.448 1,1c0,0.552 -0.448,1 -1,1l-3,0l0,3c0,0.552 -0.448,1 -1,1c-0.552,0 -1,-0.448 -1,-1l0,-3l-3,0c-0.552,0 -1,-0.448 -1,-1c0,-0.552 0.448,-1 1,-1l3,0l0,-3Z\" />\n        </g>\n      );\n    case 'post':\n      return (\n        <g>\n          <path d=\"M26.957,4.886c-0.39,-0.391 -1.024,-0.391 -1.414,0l-10.896,10.896c-0.593,0.593 -1.07,1.291 -1.407,2.058l-0.003,0.006c-0.307,0.7 0.403,1.413 1.104,1.11c0.777,-0.337 1.484,-0.817 2.083,-1.416l10.886,-10.887c0.391,-0.39 0.391,-1.023 0,-1.414l-0.353,-0.353Zm-8.039,3.245c0.311,0.032 0.622,-0.071 0.843,-0.292l0.737,-0.737c0.274,-0.274 0.145,-0.736 -0.236,-0.804c-1.184,-0.21 -2.592,-0.298 -4.262,-0.298c-8,0 -10,2 -10,10c0,8 2,10 10,10c8,0 10,-2 10,-10c0,-1.507 -0.071,-2.801 -0.24,-3.909c-0.059,-0.39 -0.53,-0.529 -0.808,-0.251l-0.757,0.757c-0.215,0.215 -0.319,0.517 -0.293,0.821c0.064,0.734 0.098,1.587 0.098,2.582c0,4.015 -0.55,5.722 -1.414,6.586c-0.864,0.864 -2.572,1.414 -6.586,1.414c-4.014,0 -5.722,-0.55 -6.586,-1.414c-0.864,-0.864 -1.414,-2.571 -1.414,-6.586c0,-4.014 0.55,-5.721 1.414,-6.585c0.864,-0.864 2.572,-1.415 6.586,-1.415c1.151,0 2.112,0.046 2.918,0.131Z\" />\n        </g>\n      );\n    default:\n    case 'post-cancel':\n      return (\n        <g>\n          <path d=\"M26,16.019c0,8 -2,10 -10,10c-8,0 -10,-2 -10,-10c0,-8 2,-10 10,-10c8,0 10,2 10,10Zm-8.586,-2.828c0.391,-0.39 1.024,-0.39 1.414,0c0.391,0.391 0.391,1.024 0,1.414l-1.414,1.414l1.414,1.414c0.39,0.391 0.391,1.024 0,1.415c-0.39,0.39 -1.024,0.39 -1.414,-0.001l-1.414,-1.413l-1.414,1.414c-0.391,0.39 -1.024,0.39 -1.414,0c-0.391,-0.391 -0.391,-1.024 0,-1.414l1.414,-1.415l-1.414,-1.413c-0.39,-0.391 -0.391,-1.024 0,-1.415c0.39,-0.39 1.024,-0.39 1.414,0.001l1.414,1.413l1.414,-1.414Z\" />\n        </g>\n      );\n    case 'post-fill':\n      return (\n        <g>\n          <path d=\"M26.957,4.843c-0.39,-0.391 -1.024,-0.391 -1.414,0l-10.896,10.896c-0.904,0.96 -1.173,2.243 -1.246,2.744c-0.017,0.115 0.073,0.211 0.189,0.2c0.487,-0.045 1.722,-0.25 2.834,-1.186l10.886,-10.887c0.391,-0.39 0.391,-1.023 0,-1.414l-0.353,-0.353Zm-9.18,14.129l-0.032,0.027l-0.033,0.028c-1.552,1.306 -3.249,1.584 -3.939,1.647c-1.415,0.131 -2.555,-1.095 -2.351,-2.482c0.091,-0.616 0.501,-2.413 1.753,-3.807l0.007,-0.008l0.009,-0.009l0.01,-0.011l0.01,-0.011l0.011,-0.011l0.011,-0.01l7.885,-7.885c-1.343,-0.346 -3.025,-0.483 -5.118,-0.483c-8,0 -10,2 -10,10c0,8 2,10 10,10c8,0 10,-2 10,-10c0,-1.931 -0.117,-3.514 -0.406,-4.802l-7.756,7.756l-0.03,0.03l-0.031,0.031Z\" />\n        </g>\n      );\n    case 'private':\n      return (\n        <g>\n          <path d=\"M19.196 6.238C18.44 6.041 17.479 5.999 16 6c-1.479-.001-2.44.041-3.195.238-.606.15-.826.343-.976.551-.208.291-.451.872-.613 2.111-.119.895-.178 1.972-.202 3.315C12.316 12.052 13.951 12 16 12s3.684.052 4.986.215c-.024-1.343-.083-2.42-.201-3.315-.162-1.239-.406-1.82-.614-2.111-.15-.208-.37-.401-.976-.551zm3.797 6.403C22.894 4.897 21.803 4 16.001 4s-6.893.897-6.992 8.641c-2.604.885-3.008 2.911-3.008 7.359 0 7 1 8 10 8s10-1 10-8c0-4.448-.404-6.474-3.008-7.359zm-5.992 8.092a2 2 0 1 0-2 0V22a1 1 0 0 0 2 0v-1.267z\" />\n        </g>\n      );\n    case 'private-outline':\n      return (\n        <g transform=\"translate(6 4)\">\n          <path d=\"M 13.1955 2.23785C 12.44 2.04071 11.4794 1.99933 10 2C 8.52065 1.99933 7.55997 2.04071 6.8045 2.23785C 6.1992 2.38824 5.97868 2.58063 5.82935 2.78922C 5.62134 3.07977 5.37756 3.66086 5.21555 4.8999C 5.09674 5.79526 5.03786 6.87158 5.01379 8.21457C 6.31618 8.05185 7.9507 8 10 8C 12.0493 8 13.6838 8.05185 14.9862 8.21457C 14.9621 6.87158 14.9033 5.79526 14.7845 4.8999C 14.6225 3.66086 14.3787 3.07977 14.1707 2.78922C 14.0213 2.58066 13.8008 2.38824 13.1955 2.23785ZM 16.992 8.64078C 16.893 0.897217 15.8017 0 10 0C 4.19827 0 3.107 0.897217 3.00796 8.64078C 0.403839 9.52625 0 11.5516 0 16C 0 23 1 24 10 24C 19 24 20 23 20 16C 20 11.5516 19.5962 9.52625 16.992 8.64078ZM 2.25122 12.2217C 2.04568 13.1338 1.99948 14.2954 2 16C 1.99948 17.7046 2.04568 18.8662 2.25122 19.7783C 2.42407 20.5734 2.66103 20.8885 2.89148 21.0771C 3.17363 21.3079 3.72681 21.5756 4.93619 21.7563C 6.18376 21.946 7.78571 22.0003 10 22C 12.2143 22.0003 13.8162 21.946 15.0638 21.7563C 16.2732 21.5756 16.8264 21.308 17.1085 21.0771C 17.339 20.8885 17.5759 20.5734 17.7488 19.7783C 17.9543 18.8662 18.0005 17.7046 18 16C 18.0005 14.2954 17.9543 13.1338 17.7488 12.2217C 17.5759 11.4266 17.339 11.1115 17.1085 10.9229C 16.8264 10.692 16.2732 10.4244 15.0638 10.2437C 13.8162 10.054 12.2143 9.99969 10 10C 7.78571 9.99969 6.18376 10.054 4.93619 10.2437C 3.72681 10.4244 3.17363 10.6921 2.89148 10.9229C 2.66103 11.1115 2.42407 11.4266 2.25122 12.2217ZM 11 16.7325C 11.5978 16.3867 12 15.7403 12 15C 12 13.8954 11.1046 13 10 13C 8.89543 13 8 13.8954 8 15C 8 15.7403 8.40221 16.3867 9 16.7325L 9 18C 9 18.5523 9.44772 19 10 19C 10.5523 19 11 18.5523 11 18L 11 16.7325Z\" />\n        </g>\n      );\n    case 'private-unlocked':\n      return (\n        <g>\n          <path d=\"M16 5c1.479-.001 2.44.041 3.195.238.606.15.826.343.976.551.208.291.452.872.614 2.111.146 1.108.202 2.492.213 4.316C19.693 12.052 18.055 12 16 12c-9 0-10 1-10 8s1 8 10 8 10-1 10-8c0-4.444-.403-6.47-3-7.357C22.976 3.973 22.043 3 16 3c-5.168 0-6.599.712-6.919 6.342-.036.626.582 1.092 1.199.982a.957.957 0 0 0 .796-.88c.033-.571.078-1.082.14-1.544.162-1.239.405-1.82.613-2.111.15-.208.37-.401.976-.551C13.56 5.041 14.521 4.999 16 5zM8.251 16.222C8.046 17.134 7.999 18.295 8 20c-.001 1.705.046 2.866.251 3.778.173.795.41 1.111.64 1.299.283.231.836.499 2.045.679 1.248.19 2.85.244 5.064.244s3.816-.054 5.064-.244c1.209-.18 1.762-.448 2.044-.679.231-.188.468-.504.641-1.299.205-.912.251-2.073.251-3.778s-.046-2.866-.251-3.778c-.173-.795-.41-1.11-.641-1.299-.282-.231-.835-.499-2.044-.679C19.816 14.054 18.214 14 16 14s-3.816.054-5.064.244c-1.209.18-1.762.448-2.045.679-.23.189-.467.504-.64 1.299zM17 20.733a2 2 0 1 0-2 0V22a1 1 0 0 0 2 0v-1.267z\" />\n        </g>\n      );\n    case 'private-fill':\n      return (\n        <g transform=\"translate(6 7)\">\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M18.0919 17.2635C18.4824 16.8729 18.4824 16.2398 18.0919 15.8492L16.2286 13.9859C16.6221 13.708 16.9846 13.416 17.3152 13.1197C18.1483 12.3729 18.7937 11.587 19.2375 10.9046C19.459 10.5639 19.6382 10.237 19.7658 9.94239C19.8795 9.67992 20 9.33716 20 9C20 8.66283 19.8795 8.32008 19.7658 8.05761C19.6382 7.76304 19.459 7.43606 19.2375 7.09543C18.7937 6.41302 18.1483 5.62706 17.3152 4.88034C15.6487 3.38668 13.1709 2 10 2C8.21732 2 6.65369 2.4383 5.33013 3.08749L2.53553 0.292892C2.14501 -0.0976305 1.51184 -0.0976305 1.12132 0.292892C0.730793 0.683417 0.730797 1.31658 1.12132 1.70711L16.6777 17.2635C17.0682 17.654 17.7014 17.654 18.0919 17.2635ZM6.84489 4.60225L8.59259 6.34995C9.01231 6.12657 9.49137 6 10 6C11.6569 6 13 7.34315 13 9C13 9.50863 12.8734 9.98769 12.65 10.4074L14.7894 12.5468C15.2257 12.2613 15.6231 11.9504 15.9803 11.6303C16.6813 11.0021 17.212 10.3505 17.5608 9.81418C17.7356 9.54544 17.8568 9.31773 17.9306 9.14745C17.9598 9.08006 17.9772 9.03153 17.9875 9C17.9772 8.96846 17.9598 8.91994 17.9306 8.85255C17.8568 8.68227 17.7356 8.45456 17.5608 8.18582C17.212 7.64948 16.6813 6.99794 15.9803 6.36966C14.5786 5.11332 12.5564 4 10 4C8.83453 4 7.78011 4.23139 6.84489 4.60225Z\"\n          />\n          <path d=\"M2.43916 8.18582C2.62448 7.90088 2.86115 7.58342 3.14742 7.2542C3.32609 7.04873 3.32418 6.73839 3.13164 6.54585L2.42325 5.83747C2.22571 5.63992 1.90372 5.64189 1.71823 5.85078C1.33557 6.28172 1.01615 6.70548 0.762543 7.09543C0.541012 7.43606 0.36179 7.76304 0.234196 8.05761C0.120506 8.32008 0 8.66283 0 9C0 9.33716 0.120506 9.67992 0.234196 9.94239C0.36179 10.237 0.541012 10.5639 0.762543 10.9046C1.20635 11.587 1.85171 12.3729 2.68483 13.1197C4.35131 14.6133 6.82914 16 10 16C10.4956 16 10.9743 15.9661 11.4357 15.9032C11.8258 15.8501 11.9649 15.3791 11.6865 15.1007L10.7275 14.1417C10.6257 14.0399 10.485 13.9877 10.3411 13.9934C10.2285 13.9978 10.1148 14 10 14C7.44358 14 5.42142 12.8867 4.01971 11.6303C3.31874 11.0021 2.78797 10.3505 2.43916 9.81418C2.26439 9.54544 2.14318 9.31773 2.06943 9.14745C2.04023 9.08006 2.02279 9.03153 2.0125 9C2.02279 8.96847 2.04023 8.91994 2.06943 8.85255C2.14318 8.68227 2.26439 8.45456 2.43916 8.18582Z\" />\n        </g>\n      );\n    case 'product-hunt':\n      return (\n        <g>\n          <path d=\"M15.986,27.968c11,0 12,-1 12,-12c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,11 1,12 12,12Zm-1.84,-11.5l3.06,0c0.895,0 1.62,-0.739 1.62,-1.65c0,-0.911 -0.725,-1.65 -1.62,-1.65l-3.06,0l0,3.3Zm-2.16,-5.5l5.22,0c2.088,0 3.78,1.724 3.78,3.85c0,2.126 -1.692,3.85 -3.78,3.85l-3.06,0l0,3.3l-2.16,0l0,-11Z\" />\n        </g>\n      );\n    case 'profile':\n      return (\n        <g>\n          <path d=\"M25.698,22.196c0.248,-1.511 0.302,-3.475 0.302,-6.196c0,-2.721 -0.053,-4.685 -0.302,-6.196c-0.235,-1.45 -0.6,-2.127 -0.987,-2.515c-0.388,-0.387 -1.065,-0.752 -2.515,-0.987c-1.511,-0.249 -3.475,-0.302 -6.196,-0.302c-2.721,0 -4.685,0.053 -6.196,0.302c-1.45,0.235 -2.127,0.6 -2.515,0.987c-0.387,0.388 -0.752,1.065 -0.987,2.515c-0.249,1.511 -0.302,3.475 -0.302,6.196c0,2.721 0.053,4.685 0.302,6.196c0.235,1.45 0.6,2.127 0.987,2.515c0.388,0.387 1.065,0.752 2.515,0.987c1.511,0.249 3.475,0.302 6.196,0.302c2.721,0 4.685,-0.053 6.196,-0.302c1.45,-0.235 2.127,-0.6 2.515,-0.987c0.387,-0.388 0.752,-1.065 0.987,-2.515Zm-9.698,5.804c11,0 12,-1 12,-12c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,11 1,12 12,12Z\" />\n          <path d=\"M19,14c0,1.683 -0.271,2.241 -0.469,2.456c-0.163,0.176 -0.68,0.544 -2.531,0.544c-1.85,0 -2.367,-0.368 -2.53,-0.544c-0.198,-0.215 -0.47,-0.773 -0.47,-2.456c0,-1.657 1.343,-3 3,-3c1.657,0 3,1.343 3,3Zm0.835,3.977c0.879,-0.804 1.165,-2.104 1.165,-3.977c0,-2.761 -2.238,-5 -5,-5c-2.761,0 -5,2.239 -5,5c0,1.873 0.287,3.173 1.166,3.977c-1.665,0.911 -2.97,2.396 -3.649,4.189c-0.124,0.328 -0.154,0.708 0.051,0.993c0.569,0.789 1.674,-0.111 2.13,-0.97c1.008,-1.897 3.004,-3.189 5.302,-3.189c2.298,0 4.295,1.292 5.303,3.189c0.456,0.859 1.561,1.759 2.129,0.97c0.205,-0.285 0.176,-0.665 0.052,-0.993c-0.68,-1.793 -1.985,-3.278 -3.649,-4.189Z\" />\n        </g>\n      );\n    case 'profile-fill':\n      return (\n        <g>\n          <path d=\"M28,15.972c0,11 -1,12 -12,12c-11,0 -12,-1 -12,-12c0,-11 1,-12 12,-12c11,0 12,1 12,12Zm-9.47,0.456c0.199,-0.215 0.47,-0.773 0.47,-2.456c0,-1.657 -1.343,-3 -3,-3c-1.657,0 -3,1.343 -3,3c0,1.683 0.271,2.241 0.47,2.456c0.162,0.176 0.679,0.544 2.53,0.544c1.851,0 2.368,-0.368 2.53,-0.544Zm2.47,-2.456c0,1.873 -0.286,3.173 -1.165,3.977c1.664,0.911 2.969,2.396 3.648,4.189c0.125,0.328 0.154,0.709 -0.051,0.993c-0.568,0.789 -1.674,-0.111 -2.13,-0.97c-1.008,-1.897 -3.004,-3.189 -5.302,-3.189c-2.298,0 -4.295,1.292 -5.302,3.189c-0.456,0.859 -1.562,1.759 -2.13,0.97c-0.205,-0.284 -0.176,-0.665 -0.052,-0.993c0.68,-1.793 1.985,-3.278 3.649,-4.189c-0.879,-0.804 -1.165,-2.104 -1.165,-3.977c0,-2.761 2.239,-5 5,-5c2.761,0 5,2.239 5,5Z\" />\n        </g>\n      );\n    case 'quote':\n      return (\n        <g>\n          <path d=\"M7.222,15.218c0.257,-1.016 0.616,-1.893 1.085,-2.62c1.043,-1.616 2.704,-2.605 5.41,-2.605c0.552,0 1,-0.447 1,-1c0,-0.552 -0.448,-1 -1,-1c-3.294,0 -5.633,1.261 -7.091,3.521c-1.405,2.179 -1.909,5.161 -1.909,8.479c0,4 1,5 5,5c4,0 5,-1 5,-5c0,-4 -1,-5 -5,-5c-1.014,0 -1.834,0.064 -2.495,0.225Z\" />\n          <path d=\"M19.222,15.218c0.257,-1.016 0.616,-1.893 1.085,-2.62c1.043,-1.616 2.704,-2.605 5.41,-2.605c0.552,0 1,-0.447 1,-1c0,-0.552 -0.448,-1 -1,-1c-3.294,0 -5.633,1.261 -7.091,3.521c-1.405,2.179 -1.909,5.161 -1.909,8.479c0,4 1,5 5,5c4,0 5,-1 5,-5c0,-4 -1,-5 -5,-5c-1.014,0 -1.834,0.064 -2.495,0.225Z\" />\n        </g>\n      );\n    case 'rep':\n      return (\n        <g>\n          <path d=\"M19.22,8.687c-0.353,-1.21 -2.087,-1.21 -2.44,0c-0.406,1.393 -0.814,2.183 -1.362,2.731c-0.548,0.548 -1.338,0.956 -2.731,1.362c-1.21,0.353 -1.21,2.087 0,2.44c1.393,0.406 2.183,0.814 2.731,1.362c0.548,0.548 0.956,1.338 1.362,2.731c0.353,1.21 2.087,1.21 2.44,0c0.406,-1.393 0.814,-2.183 1.362,-2.731c0.548,-0.548 1.338,-0.956 2.731,-1.362c1.21,-0.353 1.21,-2.087 0,-2.44c-1.393,-0.406 -2.183,-0.814 -2.731,-1.362c-0.548,-0.548 -0.956,-1.338 -1.362,-2.731Zm-2.388,4.145c0.482,-0.481 0.856,-1.041 1.168,-1.688c0.312,0.647 0.686,1.207 1.168,1.688c0.482,0.482 1.041,0.856 1.688,1.168c-0.647,0.312 -1.206,0.686 -1.688,1.168c-0.482,0.482 -0.856,1.041 -1.168,1.688c-0.312,-0.647 -0.686,-1.206 -1.168,-1.688c-0.481,-0.482 -1.041,-0.856 -1.688,-1.168c0.647,-0.312 1.207,-0.686 1.688,-1.168Z\" />\n          <path d=\"M12.852,19.726c-0.26,0.408 -0.444,0.76 -0.553,1.089c-0.059,0.175 -0.095,0.344 -0.11,0.511c-0.011,0.116 -0.011,0.232 0,0.348c0.015,0.167 0.052,0.336 0.11,0.513c0.109,0.328 0.293,0.679 0.553,1.087c0.029,0.046 0.058,0.092 0.089,0.138c0.215,0.327 -0.201,0.744 -0.526,0.529c-0.047,-0.031 -0.093,-0.061 -0.138,-0.09c-0.407,-0.261 -0.758,-0.446 -1.085,-0.555c-0.175,-0.059 -0.343,-0.095 -0.509,-0.11c-0.115,-0.011 -0.23,-0.011 -0.346,0c-0.166,0.015 -0.334,0.051 -0.509,0.11c-0.327,0.109 -0.678,0.294 -1.085,0.555c-0.045,0.029 -0.091,0.059 -0.137,0.09c-0.326,0.215 -0.741,-0.202 -0.526,-0.529c0.03,-0.047 0.06,-0.092 0.089,-0.138c0.256,-0.403 0.439,-0.751 0.547,-1.076c0.058,-0.174 0.095,-0.341 0.11,-0.506c0.011,-0.123 0.011,-0.244 -0.001,-0.367c-0.017,-0.165 -0.055,-0.332 -0.115,-0.506c-0.111,-0.323 -0.297,-0.669 -0.558,-1.07c-0.029,-0.045 -0.06,-0.09 -0.091,-0.136c-0.218,-0.325 0.192,-0.747 0.52,-0.535c0.047,0.03 0.093,0.06 0.139,0.088c0.415,0.26 0.771,0.443 1.103,0.55c0.177,0.057 0.347,0.092 0.516,0.105c0.109,0.009 0.217,0.009 0.326,-0.001c0.169,-0.015 0.339,-0.051 0.515,-0.11c0.331,-0.11 0.686,-0.297 1.097,-0.561c0.045,-0.029 0.091,-0.059 0.138,-0.09c0.325,-0.215 0.741,0.202 0.526,0.529c-0.018,0.027 -0.035,0.053 -0.052,0.079c-0.012,0.02 -0.025,0.039 -0.037,0.059Z\" />\n        </g>\n      );\n    case 'reply':\n      return (\n        <g>\n          <path\n            d=\"M 5.8902 8.70774C 6.31445 9.0613 6.3718 9.69185 6.01822 10.1161C 5.66464 10.5404 5.03409 10.5977 4.6098 10.2442L 4.60855 10.2431C 3 9.22597 2 8.22597 0.40863 6.27944C 0.19043 5.96819 0 5.61611 0 5.22594C 0 4.83579 0.19043 4.48371 0.40863 4.17246C 2 2.22597 3 1.22597 4.60944 0.20804C 5.0762 -0.0871717 5.66464 -0.0885144 6.01822 0.335756C 6.3718 0.760027 6.31445 1.3906 5.8902 1.74416L 5.72845 1.87903C 4.58041 2.83635 3.8909 3.41132 3.07352 4.22597L 16 4.22597C 18.7614 4.22597 21 6.46454 21 9.22597C 21 11.9874 18.7614 14.226 16 14.226L 12 14.226C 11.4477 14.226 11 13.7783 11 13.226C 11 12.6737 11.4477 12.226 12 12.226L 16 12.226C 17.6569 12.226 19 10.8828 19 9.22597C 19 7.56911 17.6569 6.22597 16 6.22597L 3.07495 6.22597C 3.87918 7.02567 4.56436 7.59874 5.64545 8.50295L 5.8902 8.70774Z\"\n            transform=\"translate(6 9)\"\n          />\n        </g>\n      );\n    case 'sam':\n      return (\n        <g>\n          <path\n            d=\"M 14 2C 14 2.74028 13.5978 3.38663 13 3.73244L 13 6L 11 6L 11 3.73244C 10.4022 3.38663 10 2.74028 10 2C 10 0.895432 10.8954 0 12 0C 13.1046 0 14 0.895432 14 2ZM 11 7.00577L 11 7L 13 7L 13 7.00577C 22.1347 7.11594 24 8.8546 24 16.5C 24 24.4167 22 26 12 26C 2 26 0 24.4167 0 16.5C 0 8.8546 1.8653 7.11594 11 7.00577ZM 5.5 17C 6.32843 17 7 16.3284 7 15.5C 7 14.6716 6.32843 14 5.5 14C 4.67157 14 4 14.6716 4 15.5C 4 16.3284 4.67157 17 5.5 17ZM 18.5 17C 19.3284 17 20 16.3284 20 15.5C 20 14.6716 19.3284 14 18.5 14C 17.6716 14 17 14.6716 17 15.5C 17 16.3284 17.6716 17 18.5 17ZM 12.0008 21C 13.9558 21 15.6185 19.7531 15.9905 18.0909C 16.176 17.262 13.597 17 12.0011 17C 10.4053 17 7.80522 17.1678 8.01158 18.0909C 8.38356 19.7531 10.0457 21 12.0008 21Z\"\n            transform=\"translate(4 2)\"\n          />\n        </g>\n      );\n    case 'search':\n      return (\n        <g>\n          <path d=\"M14,9c-2.761,0 -5,2.239 -5,5c0,2.761 2.239,5 5,5c1.387,0 2.641,-0.564 3.548,-1.477c0.899,-0.905 1.452,-2.148 1.452,-3.523c0,-2.761 -2.239,-5 -5,-5Zm-7,5c0,-3.866 3.134,-7 7,-7c3.866,0 7,3.134 7,7c0,1.257 -0.332,2.436 -0.912,3.456c-0.244,0.431 -0.212,0.981 0.137,1.332l3.984,4.007c0.389,0.391 0.388,1.025 -0.004,1.414c-0.392,0.389 -1.025,0.388 -1.414,-0.004l-3.97,-3.992c-0.352,-0.354 -0.908,-0.387 -1.341,-0.138c-1.025,0.588 -2.214,0.925 -3.48,0.925c-3.866,0 -7,-3.134 -7,-7Z\" />\n        </g>\n      );\n    case 'send':\n      return (\n        <g>\n          <path d=\"M9,8l0,5.287l7.054,1.495c0.628,0.133 0.966,0.665 0.989,1.164c0,0.009 0.001,0.022 0.001,0.034c0,0.004 0,0.008 0,0.012c0,0.005 0,0.009 0,0.013c0,0.012 -0.001,0.025 -0.001,0.034c-0.023,0.498 -0.361,1.031 -0.989,1.164l-7.054,1.495l0,5.627c0.02,0.001 0.049,-0.002 0.09,-0.017c4.386,-1.524 15.41,-7.808 15.41,-8.308c0,-0.5 -11.075,-6.473 -15.41,-7.984c-0.041,-0.014 -0.07,-0.017 -0.09,-0.016Zm17.555,7.992l0,-0.011l0,-0.003c-0.011,-0.698 -0.39,-1.289 -0.925,-1.685c-3.631,-2.688 -11.512,-6.642 -15.882,-8.165c-0.624,-0.218 -1.3,-0.158 -1.843,0.185c-0.554,0.349 -0.905,0.958 -0.905,1.667l0,5.712c0,0.708 0.496,1.32 1.189,1.467l3.931,0.833l-3.931,0.834c-0.693,0.146 -1.189,0.758 -1.189,1.467l0,6.052c0,0.709 0.351,1.317 0.905,1.667c0.543,0.343 1.219,0.403 1.843,0.185c4.371,-1.527 12.29,-5.85 15.881,-8.505c0.536,-0.397 0.915,-0.987 0.925,-1.685l0,-0.003l0.001,-0.012Z\" />\n        </g>\n      );\n    case 'send-fill':\n      return (\n        <g>\n          <path d=\"M16.044,15.012c-0.005,-0.104 -0.071,-0.205 -0.198,-0.232l-7.45,-1.579c-0.231,-0.049 -0.396,-0.253 -0.396,-0.489l0,-5.712c0,-0.73 0.698,-1.159 1.419,-0.908c4.295,1.497 12.081,5.408 15.616,8.025c0.34,0.252 0.515,0.573 0.52,0.895c-0.005,0.323 -0.18,0.644 -0.52,0.896c-3.535,2.617 -11.321,6.868 -15.616,8.365c-0.721,0.251 -1.419,-0.178 -1.419,-0.908l0,-6.052c0,-0.236 0.165,-0.44 0.396,-0.489l7.45,-1.579c0.127,-0.027 0.193,-0.129 0.198,-0.233Z\" />\n        </g>\n      );\n    case 'settings':\n      return (\n        <g>\n          <path d=\"M9.752,9.489l2.302,0.705c0.552,-0.373 1.161,-0.669 1.81,-0.873l0.885,-2.239c0.397,-0.054 0.803,-0.082 1.216,-0.082c0.413,0 0.819,0.028 1.217,0.082l0.884,2.239c0.649,0.204 1.258,0.5 1.81,0.873l2.302,-0.705c0.588,0.56 1.1,1.2 1.519,1.901l-1.2,2.088c0.238,0.616 0.391,1.274 0.446,1.959l1.987,1.361c-0.073,0.828 -0.257,1.624 -0.539,2.372l-2.383,0.364c-0.341,0.583 -0.764,1.111 -1.253,1.57l0.176,2.403c-0.673,0.446 -1.408,0.804 -2.191,1.057l-1.77,-1.636c-0.328,0.048 -0.664,0.072 -1.005,0.072c-0.341,0 -0.676,-0.024 -1.005,-0.072l-1.77,1.636c-0.782,-0.253 -1.518,-0.611 -2.19,-1.057l0.175,-2.403c-0.489,-0.459 -0.912,-0.987 -1.253,-1.57l-2.383,-0.364c-0.281,-0.748 -0.466,-1.544 -0.539,-2.372l1.987,-1.361c0.055,-0.685 0.208,-1.343 0.446,-1.959l-1.199,-2.088c0.419,-0.701 0.93,-1.341 1.518,-1.901Zm6.213,10.511c2.209,0 4,-1.791 4,-4c0,-2.209 -1.791,-4 -4,-4c-2.209,0 -4,1.791 -4,4c0,2.209 1.791,4 4,4Z\" />\n        </g>\n      );\n    case 'share':\n      return (\n        <g fillRule=\"nonzero\">\n          <path d=\"M16.707,5.294c-0.39,-0.39 -1.024,-0.39 -1.414,0l-3,3c-0.391,0.391 -0.391,1.024 0,1.415c0.39,0.39 1.024,0.39 1.414,0l1.293,-1.293l0,9.585c0,0.553 0.448,1 1,1c0.552,0 1,-0.447 1,-1l0,-9.585l1.293,1.293c0.39,0.39 1.024,0.39 1.414,0c0.391,-0.391 0.391,-1.024 0,-1.415l-3,-3Zm-5.817,7.023c0.588,-0.114 1.11,0.36 1.11,0.959l0,0.426c0,0.265 -0.198,0.487 -0.459,0.531l-0.002,0c-1.042,0.17 -1.486,0.416 -1.706,0.612c-0.191,0.171 -0.42,0.489 -0.588,1.31l-0.007,0.03c-0.191,0.926 -0.238,2.106 -0.238,3.815l0,0.003c0,1.709 0.047,2.889 0.238,3.814l0.007,0.031c0.168,0.821 0.397,1.139 0.588,1.309c0.219,0.197 0.662,0.442 1.699,0.612l0.017,0.002c1.094,0.182 2.493,0.231 4.45,0.23l0.002,0c1.957,0.001 3.356,-0.048 4.45,-0.23l0.017,-0.002c1.037,-0.17 1.48,-0.415 1.699,-0.611c0.191,-0.171 0.42,-0.489 0.588,-1.31l0.007,-0.031c0.191,-0.925 0.238,-2.105 0.238,-3.814l0,-0.003c0,-1.709 -0.047,-2.889 -0.238,-3.815l-0.007,-0.03c-0.168,-0.821 -0.397,-1.139 -0.588,-1.31c-0.22,-0.196 -0.664,-0.442 -1.706,-0.612l-0.002,0c-0.262,-0.044 -0.459,-0.266 -0.459,-0.531l0,-0.426c0,-0.599 0.522,-1.073 1.11,-0.959c3.362,0.655 3.89,2.553 3.89,7.684c0,7.059 -1,8 -9,8c-8,0 -9,-0.941 -9,-8c0,-5.131 0.528,-7.029 3.89,-7.684Z\" />\n        </g>\n      );\n    case 'slack':\n      return (\n        <g>\n          <path\n            d=\"M 11.4524 22.9048C 20.9961 22.9048 22.9048 20.9961 22.9048 11.4524C 22.9048 1.90873 20.9961 -2.02849e-06 11.4524 0C 1.90872 -5.87002e-06 -6.92945e-06 1.90873 1.91115e-10 11.4524C -2.20542e-05 20.9961 1.90874 22.9048 11.4524 22.9048ZM 8.45242 3.95241C 9.28085 3.95241 9.9524 4.62398 9.9524 5.45241L 9.95241 6.95241L 12.9524 6.95241L 12.9524 5.45241C 12.9524 4.62398 13.624 3.9524 14.4524 3.95241C 15.2808 3.95241 15.9524 4.62398 15.9524 5.45241L 15.9524 6.9524L 17.4524 6.95241C 18.2808 6.95241 18.9524 7.62398 18.9524 8.45241C 18.9524 9.28083 18.2808 9.95241 17.4524 9.95241L 15.9524 9.9524L 15.9524 12.9524L 17.4524 12.9524C 18.2808 12.9524 18.9524 13.624 18.9524 14.4524C 18.9524 15.2808 18.2808 15.9524 17.4524 15.9524L 15.9524 15.9524L 15.9524 17.4524C 15.9524 18.2808 15.2808 18.9524 14.4524 18.9524C 13.624 18.9524 12.9524 18.2808 12.9524 17.4524L 12.9524 15.9524L 9.95242 15.9524L 9.9524 17.4524C 9.95241 18.2808 9.28083 18.9524 8.4524 18.9524C 7.62397 18.9524 6.95242 18.2808 6.95242 17.4524L 6.9524 15.9524L 5.45241 15.9524C 4.62398 15.9524 3.9524 15.2808 3.9524 14.4524C 3.95239 13.624 4.62398 12.9524 5.4524 12.9524L 6.9524 12.9524L 6.9524 9.95241L 5.4524 9.95241C 4.62397 9.95241 3.9524 9.28083 3.95239 8.4524C 3.95242 7.62398 4.62397 6.95241 5.4524 6.95241L 6.9524 6.95241L 6.95241 5.45241C 6.95241 4.62398 7.62399 3.95241 8.45242 3.95241ZM 12.9524 9.95241L 12.9524 12.9524L 9.95242 12.9524L 9.95242 9.95241L 12.9524 9.95241Z\"\n            transform=\"matrix(0.951056 -0.309017 0.309017 0.951056 1.56912 8.6471)\"\n          />\n        </g>\n      );\n    case 'slack-colored':\n      return (\n        <g>\n          <path\n            d=\"M 4.17469 1.47953C 3.80074 0.356761 2.60017 -0.253868 1.47832 0.100691C 0.35647 0.474947 -0.253659 1.67651 0.100609 2.79928L 5.63113 19.8181C 6.00508 20.8621 7.14661 21.453 8.22909 21.1379C 9.37062 20.803 10.0595 19.6014 9.68553 18.4984C 9.68553 18.459 4.17469 1.47953 4.17469 1.47953Z\"\n            transform=\"translate(15.3797 4)\"\n            fill=\"#ECB32D\"\n          />\n          <path\n            d=\"M 4.17469 1.47953C 3.80074 0.356761 2.60017 -0.253869 1.47832 0.10069C 0.356468 0.474947 -0.25366 1.67651 0.100608 2.79928L 5.63113 19.8181C 6.00508 20.8621 7.14661 21.453 8.22909 21.1379C 9.37062 20.803 10.0595 19.6014 9.68553 18.4984C 9.68553 18.459 4.17469 1.47953 4.17469 1.47953Z\"\n            transform=\"translate(6.81824 6.77738)\"\n            fill=\"#63C1A0\"\n          />\n          <path\n            d=\"M 19.7466 4.17812C 20.8684 3.80386 21.4786 2.6023 21.1243 1.47953C 20.7503 0.35676 19.5498 -0.253869 18.4279 0.10069L 1.40337 5.65545C 0.360242 6.0297 -0.230204 7.17217 0.0847012 8.25555C 0.419288 9.39801 1.61986 10.0874 2.72203 9.71318C 2.76139 9.71318 19.7466 4.17812 19.7466 4.17812Z\"\n            transform=\"translate(6.77509 15.3853)\"\n            fill=\"#E01A59\"\n          />\n          <path\n            d=\"M 1.31866 5.39718C 2.42083 5.04262 3.85759 4.56987 5.39275 4.07743C 5.03848 2.97435 4.56612 1.53642 4.07408 -6.01127e-07L 6.00634e-07 1.31975L 1.31866 5.39718Z\"\n            transform=\"translate(10.4025 18.9922)\"\n            fill=\"#331433\"\n          />\n          <path\n            d=\"M 1.31867 5.39717C 2.85383 4.90473 4.29058 4.43199 5.39275 4.07743C 5.03848 2.97435 4.56612 1.53642 4.07408 0L -1.20127e-06 1.31975L 1.31867 5.39717Z\"\n            transform=\"translate(18.9836 16.1951)\"\n            fill=\"#D62027\"\n          />\n          <path\n            d=\"M 19.7269 4.17812C 20.8487 3.80386 21.4589 2.6023 21.1046 1.47953C 20.7307 0.356761 19.5301 -0.253868 18.4082 0.100691L 1.40337 5.63575C 0.360243 6.01001 -0.230205 7.15247 0.0847 8.23585C 0.419287 9.37831 1.61986 10.0677 2.72203 9.69348C 2.76139 9.69348 19.7269 4.17812 19.7269 4.17812Z\"\n            transform=\"translate(4 6.81677)\"\n            fill=\"#89D3DF\"\n          />\n          <path\n            d=\"M 1.31867 5.39717C 2.42083 5.04262 3.85759 4.56987 5.39275 4.07743C 4.90071 2.54101 4.42835 1.10307 4.07408 -3.00563e-07L -6.00634e-07 1.31975L 1.31867 5.39717Z\"\n            transform=\"translate(7.62738 10.404)\"\n            fill=\"#258B74\"\n          />\n          <path\n            d=\"M 1.31866 5.39717C 2.85383 4.90473 4.29058 4.43199 5.39275 4.07743C 4.90071 2.541 4.42835 1.10307 4.07408 0L -6.00634e-07 1.31975L 1.31866 5.39717Z\"\n            transform=\"translate(16.1889 7.62658)\"\n            fill=\"#819C3C\"\n          />\n        </g>\n      );\n    case 'slack-white':\n      return (\n        <g>\n          <path\n            d=\"M 11.4524 22.9048C 20.9961 22.9048 22.9048 20.9961 22.9048 11.4524C 22.9048 1.90873 20.9961 -2.02849e-06 11.4524 0C 1.90872 -5.87002e-06 -6.92945e-06 1.90873 1.91115e-10 11.4524C -2.20542e-05 20.9961 1.90874 22.9048 11.4524 22.9048ZM 8.45242 3.95241C 9.28085 3.95241 9.9524 4.62398 9.9524 5.45241L 9.95241 6.95241L 12.9524 6.95241L 12.9524 5.45241C 12.9524 4.62398 13.624 3.95241 14.4524 3.95241C 15.2808 3.95241 15.9524 4.62398 15.9524 5.45241L 15.9524 6.9524L 17.4524 6.95241C 18.2808 6.95241 18.9524 7.62398 18.9524 8.45241C 18.9524 9.28083 18.2808 9.95241 17.4524 9.95241L 15.9524 9.9524L 15.9524 12.9524L 17.4524 12.9524C 18.2808 12.9524 18.9524 13.624 18.9524 14.4524C 18.9524 15.2808 18.2808 15.9524 17.4524 15.9524L 15.9524 15.9524L 15.9524 17.4524C 15.9524 18.2808 15.2808 18.9524 14.4524 18.9524C 13.624 18.9524 12.9524 18.2808 12.9524 17.4524L 12.9524 15.9524L 9.95242 15.9524L 9.95241 17.4524C 9.95241 18.2808 9.28083 18.9524 8.4524 18.9524C 7.62397 18.9524 6.95242 18.2808 6.95242 17.4524L 6.9524 15.9524L 5.45241 15.9524C 4.62398 15.9524 3.9524 15.2808 3.9524 14.4524C 3.95239 13.624 4.62398 12.9524 5.4524 12.9524L 6.9524 12.9524L 6.9524 9.95241L 5.4524 9.95241C 4.62397 9.95241 3.9524 9.28083 3.95239 8.4524C 3.95242 7.62398 4.62397 6.95241 5.4524 6.95241L 6.9524 6.95241L 6.95241 5.45241C 6.95241 4.62398 7.62399 3.95241 8.45242 3.95241ZM 12.9524 9.95241L 12.9524 12.9524L 9.95242 12.9524L 9.95242 9.95241L 12.9524 9.95241Z\"\n            transform=\"matrix(0.951056 -0.309017 0.309017 0.951056 1.56912 8.6471)\"\n            fill=\"#16171A\"\n          />\n        </g>\n      );\n    case 'support':\n      return (\n        <g transform=\"translate(5 7)\">\n          <path d=\"M 9 0.0236206C 9.62299 0.00744629 10.2887 0 11 0C 21.0833 0 22 1.5 22 8C 22 14.5 21.0833 16 11 16C 10.6595 16 10.3294 15.9982 10.0095 15.9947L 10.0082 15.9949C 10.0077 15.995 10.0071 15.9952 10.0067 15.9955L 5.55469 18.9636C 4.89014 19.4066 4 18.9302 4 18.1315L 4 15.4624C 4 15.4601 3.99835 15.4581 3.99609 15.4575C 1.01367 14.723 0.223999 13.1274 0.046051 10C 0.0114746 9.3927 0 8.72772 0 8C 0 1.95856 0.791901 0.236511 9 0.0236206ZM 2.47714 12.2372C 2.13568 11.5002 2 10.2927 2 8C 1.99951 6.41864 2.03903 5.33221 2.24951 4.4577C 2.41556 3.659 2.50861 3.43878 2.96548 3.12634C 3.3237 2.84076 3.99329 2.52826 5.34534 2.31049C 6.72906 2.08453 8.50272 2.00055 10.9492 2L 11 2C 13.4727 1.99945 15.2614 2.08295 16.6547 2.31049C 18.0067 2.52826 18.6763 2.84076 19.0345 3.12634C 19.4914 3.43878 19.5844 3.659 19.7505 4.4577C 19.961 5.33221 20.0005 6.41864 20 8C 20.0005 9.58136 19.961 10.6678 19.7505 11.5423C 19.5844 12.341 19.4914 12.5612 19.0345 12.8737C 18.6763 13.1592 18.0067 13.4717 16.6547 13.6895C 15.2614 13.9171 13.4727 14.0005 11 14C 10.6648 14 10.3458 13.9983 10.0316 13.9948C 9.73151 14.014 9.15842 14.1841 8.89725 14.3315L 6 16.263L 6 15.4624C 6 14.4967 5.32776 13.7258 4.47443 13.5156C 3.08609 13.1736 2.70114 12.7207 2.47714 12.2372ZM 10.9824 5.88C 12.2809 4.59998 13.5794 4.91998 14.2287 5.56C 16.8257 8.12 11.7788 11.5 10.9824 11.5C 10.1859 11.5 5.13913 8.12 7.73615 5.56C 8.38538 4.91998 9.6839 4.59998 10.9824 5.88Z\" />\n        </g>\n      );\n    case 'support-fill':\n      return (\n        <g>\n          <path\n            d=\"M 22 8.07648C 22.0002 14.5118 22.0002 16 11.5 16C 10.9835 16 10.49 15.9964 10.0184 15.9888L 10.0156 15.9896L 5.55469 18.9636C 4.89014 19.4066 4 18.9302 4 18.1315L 4 15.418C 4 15.4165 3.9993 15.4151 3.9982 15.4142C 3.99762 15.4137 3.99692 15.4133 3.99615 15.4131C 0.439423 14.5103 0 12.4014 0 8C 0 1.5 0.958313 0 11.5 0C 22.0002 0 22.0002 1.48822 22 7.92352L 22 8L 22 8.07648ZM 11 6C 12.2985 4.71997 13.5794 4.91998 14.2286 5.56C 16.8257 8.12 11.7788 11.5 10.9824 11.5C 10.1859 11.5 5.13913 8.12 7.73615 5.56C 8.38538 4.91998 9.70151 4.71997 11 6Z\"\n            transform=\"translate(5 7)\"\n          />\n        </g>\n      );\n    case 'thread':\n      return (\n        <g>\n          <path\n            d=\"M 3.58569 2.55591C 3.00964 2.69867 2.59576 2.83893 2.28473 3C 2.59576 3.16107 3.00964 3.30133 3.58569 3.44409C 4.96814 3.79199 6.84656 4.00153 9 4C 11.1534 4.00153 13.0319 3.79199 14.4143 3.44409C 14.9904 3.30133 15.4042 3.16107 15.7153 3C 15.4042 2.83893 14.9904 2.69867 14.4143 2.55591C 13.0319 2.20801 11.1534 1.99847 9 2C 6.84656 1.99847 4.96814 2.20801 3.58569 2.55591ZM 9 0C 6.73517 0.00152588 4.61359 0.239685 3.10059 0.615662C 2.32495 0.811035 1.60474 1.07886 1.11987 1.36066C 0.663269 1.63049 0 2.15204 0 3C 0 3.84796 0.663269 4.36951 1.11987 4.63934C 1.60474 4.92114 2.32495 5.18896 3.10059 5.38434C 4.61359 5.76031 6.73517 5.99847 9 6C 11.2648 5.99847 13.3864 5.76031 14.8994 5.38434C 15.675 5.18896 16.3953 4.92114 16.8801 4.63934C 17.3367 4.36951 18 3.84796 18 3C 18 2.15204 17.3367 1.63049 16.8801 1.36066C 16.3953 1.07886 15.675 0.811035 14.8994 0.615662C 13.3864 0.239685 11.2648 0.00152588 9 0ZM 3 15.6415L 3 6.38879C 4.56848 6.75916 6.74707 6.99695 8.99933 7L 9.00067 7C 11.2529 6.99695 13.4315 6.75916 15 6.38879L 15 12.5333C 15.6378 12.8946 16.2509 13.2064 16.884 13.3768C 17.7888 13.6309 18.7344 13.6111 19.8818 12.9099C 20.3531 12.6218 20.9686 12.7703 21.2566 13.2416C 21.5446 13.7128 21.3961 14.3283 20.9249 14.6163C 19.2665 15.6299 17.7411 15.6948 16.3434 15.3024C 15.8802 15.1682 15.4322 14.9863 15 14.7811L 15 15.6415L 15 17C 15 17.6904 12.3137 18.25 9 18.25C 5.68628 18.25 3 17.6904 3 17L 3 15.6415ZM 2 15.9562C 1.66284 16.0826 1.362 16.2199 1.11987 16.3607C 0.663269 16.6305 0 17.152 0 18C 0 18.848 0.663269 19.3695 1.11987 19.6393C 1.60474 19.9211 2.32495 20.189 3.10059 20.3843C 4.61359 20.7603 6.73517 20.9985 9 21C 11.2648 20.9985 13.3864 20.7603 14.8994 20.3843C 15.675 20.189 16.3953 19.9211 16.8801 19.6393C 17.3367 19.3695 18 18.848 18 18C 18 17.152 17.3367 16.6305 16.8801 16.3607C 16.638 16.2199 16.3372 16.0826 16 15.9562L 16 17C 16 17.4349 15.7839 17.7568 15.5916 17.9526C 15.4354 18.1039 15.1794 18.2783 14.9703 18.3837C 14.5935 18.5657 14.0343 18.7393 13.4466 18.8629C 12.3055 19.099 10.7033 19.2489 9 19.25C 7.29669 19.2489 5.69452 19.099 4.55341 18.8629C 3.9657 18.7393 3.40649 18.5657 3.02966 18.3837C 2.82062 18.2783 2.56458 18.1039 2.40845 17.9526C 2.21606 17.7568 2 17.4349 2 17L 2 15.9562Z\"\n            transform=\"translate(6 6)\"\n          />\n        </g>\n      );\n    case 'thumbsdown':\n      return (\n        <g>\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M13.5775 14.6887C14.3267 14.341 14.9003 13.852 15.3369 13.278C15.5731 13.7138 15.9303 14.132 16.4732 14.4251C17.47 14.963 19.0051 14.963 20.0019 14.4251C21.3993 13.6709 21.6221 12.0453 21.6942 10.6136C21.7289 9.89036 21.7375 8.95641 21.7376 7.80176C21.7375 6.6471 21.7289 5.71316 21.6942 4.98989C21.6221 3.55818 21.3993 1.9326 20.0019 1.17843C19.0051 0.64048 17.47 0.64048 16.4732 1.17843C15.9618 1.45445 15.6152 1.84159 15.3793 2.24981C15.1401 1.98061 14.8636 1.73596 14.5454 1.51851C13.2538 0.635712 11.5302 0.467453 10.1881 0.336434C9.01426 0.221846 7.84166 0.0692102 6.66298 0.0146944C5.71916 -0.0275649 4.67884 0.00153175 3.71167 0.370819C1.45262 1.23336 0.687679 3.43556 0.264782 5.97296C-0.218098 8.87028 -0.211308 11.5838 1.7682 13.2611C2.69259 14.0444 3.83361 14.3971 4.94181 14.5786C5.00189 14.5882 5.06274 14.5975 5.12437 14.6064C5.03077 15.0508 4.9896 15.4724 4.98756 15.8018C4.98756 18.1346 6.35162 19.5358 7.55798 20.4169C8.09816 20.8114 8.81247 21.098 9.62532 21.0104C10.4377 20.9229 11.0536 20.4929 11.4523 20.0226C12.1947 19.1468 12.3851 17.9516 12.2065 16.9504C12.1218 16.4759 12.1093 16.1422 12.212 15.8557C12.2859 15.6496 12.5205 15.1793 13.5775 14.6887ZM7.11609 14.773C7.30603 14.1159 7.75196 13.4588 8.73756 12.8018C7.67788 12.8018 6.74923 12.7766 5.9474 12.6944C2.58744 12.3497 1.45411 11.0025 2.23758 6.30176C3.02066 1.6032 4.53964 1.76146 8.86905 2.21253L8.87059 2.21269C12.1114 2.55032 14.7376 2.8472 14.7376 6.80176C14.7376 8.44516 14.6536 9.78171 14.3536 10.8018C14.0608 11.7969 13.5624 12.4908 12.7356 12.8745C9.84489 14.2161 10.0423 16.2074 10.2376 17.3018C10.4328 18.3961 9.71331 19.5144 8.73756 18.8018C7.76181 18.0891 6.98756 17.2105 6.98756 15.8018C6.98756 15.4588 7.01696 15.1159 7.11609 14.773ZM19.7376 7.80176C19.7376 3.21842 19.6126 2.80176 18.2376 2.80176C16.8626 2.80176 16.7376 3.21842 16.7376 7.80176C16.7376 12.3851 16.8626 12.8018 18.2376 12.8018C19.6126 12.8018 19.7376 12.3851 19.7376 7.80176Z\"\n            transform=\"translate(5.26244 5.77551)\"\n          />\n        </g>\n      );\n    case 'thumbsdown-fill':\n      return (\n        <g transform=\"translate(7.21309 7.32291)\">\n          <path d=\"M5.78691 11.8084C4.72724 11.8084 4.00271 11.6386 3.45685 11.4584C0.249474 10.3997 -0.496537 9.58643 0.286926 4.88565C1.07001 0.187093 2.5186 -0.5453 6.78691 0.308362C9.28691 0.808362 12.7869 0.885648 12.7869 4.88565C12.7869 6.52905 12.703 8.3656 12.4029 9.38565C11.7731 11.5265 6.90882 13.3425 8.28691 15.8856C8.78691 16.8084 7.78691 17.8084 6.78691 17.3856C5.78691 16.9629 5.03691 15.7944 5.03691 14.3856C5.03691 13.276 5.28691 12.8084 5.78691 11.8084Z\" />\n          <path d=\"M16.2869 1.38565C17.6619 1.38565 18.7869 1.80232 18.7869 6.38565C18.7869 10.969 17.6619 11.3856 16.2869 11.3856C14.9119 11.3856 13.7869 10.969 13.7869 6.38565C13.7869 1.80232 14.9119 1.38565 16.2869 1.38565Z\" />\n        </g>\n      );\n    case 'thumbsup':\n      return (\n        <g>\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M7.11609 6.25327C7.30603 6.91034 7.75196 7.56741 8.73756 8.22448C7.67788 8.22448 6.74923 8.24963 5.9474 8.33187C2.58744 8.6765 1.45411 10.0237 2.23758 14.7245C3.02066 19.423 4.53964 19.2648 8.86905 18.8137C9.14666 18.7848 9.43631 18.7546 9.73758 18.7245C12.8823 18.41 14.7376 18.2245 14.7376 14.2245C14.7376 12.5811 14.6536 11.2445 14.3536 10.2245C14.2542 9.8866 14.1311 9.58344 13.9794 9.31537C13.6845 8.79387 13.2817 8.40512 12.7356 8.15169L13.5775 6.33754C14.3267 6.68523 14.9003 7.17426 15.3369 7.74823C15.5731 7.31245 15.9303 6.89419 16.4732 6.60115C17.1608 6.23008 17.8831 6.22448 18.2376 6.22448C18.5921 6.22448 19.3143 6.23008 20.0019 6.60115C20.8289 7.04747 21.2248 7.78428 21.4188 8.43103C21.5624 8.9347 21.6562 9.65668 21.6942 10.4126C21.7289 11.1359 21.7375 12.0698 21.7376 13.2245C21.7375 14.3791 21.7289 15.3131 21.6942 16.0364C21.6562 16.7923 21.5624 17.5143 21.4188 18.0179C21.2248 18.6647 20.8289 19.4015 20.0019 19.8478C19.3143 20.2189 18.5921 20.2245 18.2376 20.2245C17.8831 20.2245 17.1608 20.2189 16.4732 19.8478C15.9618 19.5718 15.6152 19.1846 15.3793 18.7764C15.1401 19.0456 14.8636 19.2903 14.5454 19.5077C13.2538 20.3905 11.5302 20.5588 10.1881 20.6898C10.1027 20.6981 10.0187 20.7063 9.93658 20.7146C9.65345 20.7428 9.37742 20.7715 9.10868 20.7994L9.10752 20.7996C8.20887 20.8929 7.39167 20.9778 6.66298 21.0115C5.71916 21.0538 4.67884 21.0247 3.71167 20.6554C1.45262 19.7929 0.687679 17.5907 0.264782 15.0533C-0.218098 12.156 -0.211308 9.44247 1.7682 7.76513C2.69259 6.98185 3.83361 6.62916 4.94181 6.44761C5.00189 6.43799 5.06274 6.42876 5.12437 6.41988C5.03077 5.97543 4.9896 5.55387 4.98756 5.22448C4.98756 2.89168 6.35162 1.49043 7.55798 0.609369C8.09816 0.21485 8.81247 -0.0717593 9.62532 0.0158339C10.4377 0.103374 11.0536 0.533314 11.4523 1.00362C12.1947 1.87944 12.3851 3.07465 12.2065 4.0758C12.1218 4.55031 12.1093 4.88402 12.212 5.17057C12.2859 5.37664 12.5205 5.84698 13.5775 6.33754L12.7356 8.15169C9.84489 6.81018 10.0423 4.8188 10.2376 3.72448C10.4328 2.63016 9.71331 1.51184 8.73756 2.22448C7.76181 2.93711 6.98756 3.81576 6.98756 5.22448C6.98756 5.56741 7.01696 5.91034 7.11609 6.25327ZM19.7376 13.2245C19.7376 17.8078 19.6126 18.2245 18.2376 18.2245C16.8626 18.2245 16.7376 17.8078 16.7376 13.2245C16.7376 8.64114 16.8626 8.22448 18.2376 8.22448C19.6126 8.22448 19.7376 8.64114 19.7376 13.2245Z\"\n            transform=\"translate(5.26244 5.77551)\"\n          />\n        </g>\n      );\n    case 'thumbsup-fill':\n      return (\n        <g transform=\"translate(7.21309 7.32291)\">\n          <path d=\"M5.78691 5.67708C4.72724 5.67708 4.00271 5.84685 3.45685 6.02702C0.249474 7.08571 -0.496537 7.89903 0.286926 12.5998C1.07001 17.2984 2.5186 18.0308 6.78691 17.1771C9.28691 16.6771 12.7869 16.5998 12.7869 12.5998C12.7869 10.9564 12.703 9.11985 12.4029 8.0998C11.7731 5.95897 6.90882 4.14298 8.28691 1.59981C8.78691 0.677094 7.78691 -0.322918 6.78691 0.0998077C5.78691 0.522533 5.03691 1.69109 5.03691 3.09981C5.03691 4.20943 5.28691 4.67708 5.78691 5.67708Z\" />\n          <path d=\"M16.2869 16.0998C17.6619 16.0998 18.7869 15.6831 18.7869 11.0998C18.7869 6.51647 17.6619 6.09981 16.2869 6.09981C14.9119 6.09981 13.7869 6.51647 13.7869 11.0998C13.7869 15.6831 14.9119 16.0998 16.2869 16.0998Z\" />\n        </g>\n      );\n    case 'twitter':\n      return (\n        <g>\n          <path d=\"M16,28c11,0 12,-1 12,-12c0,-11 -1,-12 -12,-12c-11,0 -12,1 -12,12c0,11 1,12 12,12Zm5.825,-13.901c0,3.669 -2.889,7.901 -8.172,7.901l0,0c-1.622,0 -3.132,-0.46 -4.403,-1.248c0.225,0.026 0.454,0.039 0.685,0.039c1.346,0 2.585,-0.444 3.568,-1.189c-1.258,-0.022 -2.318,-0.825 -2.684,-1.928c0.175,0.032 0.355,0.05 0.54,0.05c0.262,0 0.516,-0.034 0.758,-0.098c-1.315,-0.255 -2.305,-1.377 -2.305,-2.722c0,-0.013 0,-0.024 0.001,-0.036c0.387,0.208 0.829,0.333 1.301,0.348c-0.772,-0.498 -1.279,-1.348 -1.279,-2.312c0,-0.509 0.143,-0.985 0.389,-1.396c1.417,1.681 3.534,2.786 5.921,2.902c-0.049,-0.204 -0.074,-0.416 -0.074,-0.633c0,-1.533 1.286,-2.777 2.872,-2.777c0.826,0 1.573,0.338 2.097,0.877c0.654,-0.124 1.269,-0.356 1.824,-0.674c-0.215,0.649 -0.67,1.192 -1.263,1.536c0.581,-0.067 1.134,-0.216 1.649,-0.437c-0.384,0.557 -0.872,1.046 -1.433,1.438c0.006,0.119 0.008,0.239 0.008,0.359Z\" />\n        </g>\n      );\n    case 'up':\n      return (\n        <g>\n          <path d=\"M21.934,6.364c-1.478,-0.284 -3.354,-0.365 -5.934,-0.364c-2.58,-0.001 -4.456,0.08 -5.934,0.364c-1.402,0.264 -2.137,0.66 -2.589,1.113c-0.453,0.452 -0.849,1.187 -1.113,2.589c-0.284,1.478 -0.365,3.354 -0.364,5.934c-0.001,2.58 0.08,4.456 0.364,5.934c0.264,1.402 0.66,2.137 1.113,2.589c0.452,0.453 1.187,0.849 2.589,1.113c1.478,0.284 3.354,0.364 5.934,0.364c2.58,0 4.456,-0.08 5.934,-0.364c1.402,-0.264 2.137,-0.66 2.589,-1.113c0.453,-0.452 0.849,-1.187 1.113,-2.589c0.284,-1.478 0.364,-3.354 0.364,-5.934c0,-2.58 -0.08,-4.456 -0.364,-5.934c-0.264,-1.402 -0.66,-2.137 -1.113,-2.589c-0.452,-0.453 -1.187,-0.849 -2.589,-1.113Zm6.066,9.636c0,-10.5 -1.5,-12 -12,-12c-10.5,0 -12,1.5 -12,12c0,10.5 1.5,12 12,12c10.5,0 12,-1.5 12,-12Z\" />\n          <path d=\"M10.11,19.018c0.424,0.354 1.055,0.297 1.408,-0.128c1.391,-1.636 2.76,-3.464 4.482,-4.774c1.749,1.331 3.085,3.1 4.482,4.774c0.353,0.425 0.984,0.482 1.408,0.128c0.42,-0.349 0.476,-0.99 0.127,-1.409c-1.505,-1.799 -3.031,-3.827 -4.964,-5.2c-0.311,-0.219 -0.663,-0.409 -1.053,-0.409c-0.39,0 -0.742,0.19 -1.053,0.409c-1.914,1.359 -3.471,3.41 -4.965,5.201c-0.354,0.424 -0.296,1.055 0.128,1.408Z\" />\n        </g>\n      );\n    case 'up-fill':\n      return (\n        <g>\n          <path d=\"M16,4c10.5,0 12,1.5 12,12c0,10.5 -1.5,12 -12,12c-10.5,0 -12,-1.5 -12,-12c0,-10.5 1.5,-12 12,-12Zm-4.482,14.89c-0.353,0.424 -0.984,0.482 -1.408,0.128c-0.424,-0.353 -0.482,-0.984 -0.128,-1.408l0.001,-0.001c0.216,-0.26 0.433,-0.524 0.652,-0.79c1.299,-1.581 2.658,-3.235 4.312,-4.41c0.311,-0.219 0.663,-0.409 1.053,-0.409c0.39,0 0.742,0.19 1.053,0.409c1.679,1.193 2.988,2.791 4.285,4.374c0.226,0.277 0.452,0.553 0.68,0.826c0.354,0.425 0.296,1.056 -0.128,1.409c-0.424,0.354 -1.055,0.296 -1.408,-0.128c-0.212,-0.254 -0.423,-0.511 -0.634,-0.768c-1.178,-1.434 -2.365,-2.878 -3.848,-4.006c-1.457,1.108 -2.673,2.584 -3.848,4.009c-0.212,0.257 -0.423,0.513 -0.634,0.765Z\" />\n        </g>\n      );\n    case 'upload':\n      return (\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M17 7a5.002 5.002 0 0 1 4.9 4.001c2.217-.054 4.1 1.78 4.1 3.999a4 4 0 0 1-4 4 1 1 0 1 1 0-2 2 2 0 1 0 0-4c-.286 0-.57.037-.85.096-.543.115-1.15-.54-1.15-1.096a3 3 0 0 0-3-3c-1.755 0-2.837 1.151-3.275 2.534-.215.677-.931 1.14-1.576.841-.455-.21-.867-.375-1.149-.375a1 1 0 0 0-1 1 1.61 1.61 0 0 1-1.562 2H8a1 1 0 1 0 0 2h2a1 1 0 1 1 0 2H8a3 3 0 1 1 0-6 3 3 0 0 1 4.298-2.705A5.002 5.002 0 0 1 17 7zm-.293 9.293a1 1 0 0 0-1.414 0l-3 3a1 1 0 0 0 1.414 1.414L15 19.414V25a1 1 0 1 0 2 0v-5.586l1.293 1.293a1 1 0 0 0 1.414-1.414l-3-3z\"\n        />\n      );\n    case 'view':\n      return (\n        <g>\n          <path\n            d=\"M 2.06943 7.14746C 2.04023 7.08008 2.02279 7.03156 2.0125 7C 2.02279 6.96844 2.04023 6.91992 2.06943 6.85254C 2.15181 6.65991 2.2622 6.45642 2.43916 6.18579C 2.80449 5.62134 3.30807 5.00348 4.01971 4.36969C 5.46653 3.06451 7.38721 1.96802 10 2C 12.6128 1.96802 14.5335 3.06451 15.9803 4.36969C 16.6919 5.00348 17.1955 5.62134 17.5608 6.18579C 17.7378 6.45642 17.8482 6.65991 17.9306 6.85254C 17.9598 6.91992 17.9772 6.96844 17.9875 7C 17.9772 7.03156 17.9598 7.08008 17.9306 7.14746C 17.8482 7.34009 17.7378 7.54358 17.5608 7.81421C 17.1955 8.37866 16.6919 8.99652 15.9803 9.63031C 14.5335 10.9355 12.6128 12.032 10 12C 7.38721 12.032 5.46653 10.9355 4.01971 9.63031C 3.30807 8.99652 2.80449 8.37866 2.43916 7.81421C 2.2622 7.54358 2.15181 7.34009 2.06943 7.14746ZM 10 0C 6.88552 0.0319824 4.3062 1.43549 2.68483 2.88031C 1.86238 3.62152 1.18983 4.44116 0.762543 5.09546C 0.543196 5.4342 0.353159 5.7854 0.234196 6.05762C 0.120506 6.32007 0 6.66284 0 7C 0 7.33716 0.120506 7.67993 0.234196 7.94238C 0.353159 8.2146 0.543196 8.5658 0.762543 8.90454C 1.18983 9.55884 1.86238 10.3785 2.68483 11.1197C 4.3062 12.5645 6.88552 13.968 10 14C 13.1145 13.968 15.6938 12.5645 17.3152 11.1197C 18.1376 10.3785 18.8102 9.55884 19.2375 8.90454C 19.4568 8.5658 19.6468 8.2146 19.7658 7.94238C 19.8795 7.67993 20 7.33716 20 7C 20 6.66284 19.8795 6.32007 19.7658 6.05762C 19.6468 5.7854 19.4568 5.4342 19.2375 5.09546C 18.8102 4.44116 18.1376 3.62152 17.3152 2.88031C 15.6938 1.43549 13.1145 0.0319824 10 0ZM 12.5 6.5C 12.6546 6.5 12.8051 6.48248 12.9496 6.44928C 12.9827 6.62781 13 6.81189 13 7C 13 8.65686 11.6569 10 10 10C 8.34315 10 7 8.65686 7 7C 7 5.34314 8.34315 4 10 4C 10.1881 4 10.3722 4.01727 10.5507 4.05042C 10.5175 4.19495 10.5 4.3454 10.5 4.5C 10.5 5.60455 11.3954 6.5 12.5 6.5Z\"\n            transform=\"translate(6 9)\"\n          />\n        </g>\n      );\n    case 'view-fill':\n      return (\n        <g>\n          <path\n            d=\"M 10 0C 6.82915 0 4.35131 1.38666 2.68483 2.88031C 1.85171 3.62708 1.20635 4.41302 0.762543 5.09546C 0.541014 5.43604 0.36179 5.76306 0.234196 6.05762C 0.120506 6.32007 0 6.66284 0 7C 0 7.33716 0.120506 7.67993 0.234196 7.94238C 0.36179 8.23694 0.541014 8.56396 0.762543 8.90454C 1.20635 9.58698 1.85171 10.3729 2.68483 11.1197C 4.35131 12.6133 6.82915 14 10 14C 13.1709 14 15.6487 12.6133 17.3152 11.1197C 18.1483 10.3729 18.7937 9.58698 19.2375 8.90454C 19.459 8.56396 19.6382 8.23694 19.7658 7.94238C 19.8795 7.67993 20 7.33716 20 7C 20 6.66284 19.8795 6.32007 19.7658 6.05762C 19.6382 5.76306 19.459 5.43604 19.2375 5.09546C 18.7937 4.41302 18.1483 3.62708 17.3152 2.88031C 15.6487 1.38666 13.1709 0 10 0ZM 12.5 6.5C 12.6546 6.5 12.8051 6.48248 12.9496 6.44928C 12.9827 6.62781 13 6.81189 13 7C 13 8.65686 11.6569 10 10 10C 8.34315 10 7 8.65686 7 7C 7 5.34314 8.34315 4 10 4C 10.1881 4 10.3722 4.01727 10.5507 4.05042C 10.5175 4.19495 10.5 4.3454 10.5 4.5C 10.5 5.60455 11.3954 6.5 12.5 6.5Z\"\n            transform=\"translate(6 9)\"\n          />\n        </g>\n      );\n    case 'view-back':\n      return (\n        <g>\n          <path d=\"M19.768,23.89c0.354,-0.424 0.296,-1.055 -0.128,-1.408c-1.645,-1.377 -5.465,-4.762 -6.774,-6.482c1.331,-1.749 5.1,-5.085 6.774,-6.482c0.424,-0.353 0.482,-0.984 0.128,-1.408c-0.353,-0.425 -0.984,-0.482 -1.409,-0.128c-1.839,1.532 -5.799,4.993 -7.2,6.964c-0.219,0.312 -0.409,0.664 -0.409,1.054c0,0.39 0.19,0.742 0.409,1.053c1.373,1.932 5.399,5.462 7.2,6.964l0.001,0.001c0.424,0.354 1.055,0.296 1.408,-0.128Z\" />\n        </g>\n      );\n    case 'view-close':\n      return (\n        <g>\n          <path d=\"M11.121,9.707c-0.39,-0.391 -1.024,-0.391 -1.414,0c-0.391,0.39 -0.391,1.024 0,1.414l4.95,4.95l-4.95,4.95c-0.391,0.39 -0.391,1.023 0,1.414c0.39,0.39 1.024,0.39 1.414,0l4.95,-4.95l4.95,4.95c0.39,0.39 1.023,0.39 1.414,0c0.39,-0.391 0.39,-1.024 0,-1.414l-4.95,-4.95l4.95,-4.95c0.39,-0.39 0.39,-1.024 0,-1.414c-0.391,-0.391 -1.024,-0.391 -1.414,0l-4.95,4.95l-4.95,-4.95Z\" />\n        </g>\n      );\n    case 'view-close-small':\n      return (\n        <g>\n          <path\n            d=\"M 15.4142 3.41421C 16.1952 2.63317 16.1952 1.36681 15.4142 0.585777C 14.6332 -0.195259 13.3668 -0.195259 12.5858 0.585777L 8.00005 5.17156L 3.41423 0.585777C 2.63322 -0.195259 1.36687 -0.195259 0.585861 0.585777C -0.195206 1.36681 -0.195206 2.63317 0.585861 3.41421L 5.17162 7.99996L 0.5858 12.5858C -0.195267 13.3668 -0.195267 14.6332 0.5858 15.4142C 1.36681 16.1952 2.63316 16.1952 3.41417 15.4142L 8.00005 10.8284L 12.5859 15.4142C 13.3669 16.1952 14.6332 16.1952 15.4142 15.4142C 16.1953 14.6332 16.1953 13.3668 15.4142 12.5858L 10.8284 7.99996L 15.4142 3.41421Z\"\n            transform=\"translate(8 8)\"\n          />\n        </g>\n      );\n    case 'view-forward':\n      return (\n        <g>\n          <path d=\"M12.982,23.89c-0.354,-0.424 -0.296,-1.055 0.128,-1.408c1.645,-1.377 5.465,-4.762 6.774,-6.482c-1.331,-1.749 -5.1,-5.085 -6.774,-6.482c-0.424,-0.353 -0.482,-0.984 -0.128,-1.408c0.353,-0.425 0.984,-0.482 1.409,-0.128c1.839,1.532 5.799,4.993 7.2,6.964c0.219,0.312 0.409,0.664 0.409,1.054c0,0.39 -0.19,0.742 -0.409,1.053c-1.373,1.932 -5.399,5.462 -7.2,6.964l-0.001,0.001c-0.424,0.354 -1.055,0.296 -1.408,-0.128Z\" />\n        </g>\n      );\n    case 'view-reload':\n      return (\n        <g>\n          <path d=\"M20.726,14.162c-0.776,-2.415 -3.04,-4.162 -5.713,-4.162c-3.314,0 -6,2.686 -6,6c0,3.314 2.686,6 6,6c2.063,0 3.883,-1.041 4.962,-2.626c0.333,-0.489 0.988,-0.707 1.497,-0.406c0.437,0.26 0.611,0.814 0.342,1.246c-1.411,2.273 -3.929,3.786 -6.801,3.786c-4.418,0 -8,-3.582 -8,-8c0,-4.418 3.582,-8 8,-8c3.53,0 6.525,2.286 7.588,5.458c0.278,-0.429 0.537,-0.848 0.736,-1.175c0.108,-0.178 0.196,-0.324 0.258,-0.428l0.042,-0.07l0.029,-0.05l0.018,-0.03l0.005,-0.008l0.001,-0.002c0.279,-0.476 0.892,-0.636 1.368,-0.357c0.477,0.279 0.636,0.892 0.357,1.369l-0.001,0.001l-0.001,0.002l-0.005,0.009l-0.02,0.034c-0.017,0.028 -0.043,0.072 -0.075,0.125l-0.062,0.105l-0.015,0.025l-0.084,0.139c-0.033,0.055 -0.069,0.114 -0.107,0.176c-0.222,0.365 -0.528,0.86 -0.849,1.35c-0.32,0.49 -0.676,1.006 -0.978,1.389c-0.157,0.198 -0.336,0.402 -0.482,0.54c-0.084,0.077 -0.217,0.181 -0.316,0.243c-0.103,0.062 -0.357,0.201 -0.695,0.178c-0.202,-0.013 -0.369,-0.08 -0.447,-0.113c-0.083,-0.035 -0.195,-0.091 -0.283,-0.141c-0.164,-0.092 -0.372,-0.224 -0.575,-0.363c-0.399,-0.272 -0.884,-0.633 -1.337,-0.98c-0.453,-0.348 -0.892,-0.697 -1.214,-0.954c-0.162,-0.13 -0.296,-0.239 -0.389,-0.314l-0.108,-0.088l-0.029,-0.024l-0.007,-0.006l-0.002,-0.001l-0.001,-0.001c-0.427,-0.35 -0.489,-0.98 -0.139,-1.407c0.35,-0.428 0.98,-0.489 1.407,-0.139l0.036,0.029l0.104,0.085c0.091,0.074 0.221,0.178 0.379,0.305c0.317,0.255 0.74,0.59 1.181,0.928c0.143,0.11 0.285,0.218 0.425,0.323Z\" />\n        </g>\n      );\n    case 'welcome':\n      return (\n        <g>\n          <path d=\"M24.518,7.453c0.279,0.487 0.058,1.095 -0.452,1.329l-0.103,0.047c-0.437,0.201 -0.953,0.013 -1.194,-0.404c-1.199,-2.078 -2.928,-3.659 -4.917,-4.673c-0.493,-0.251 -0.741,-0.834 -0.529,-1.346c0.21,-0.509 0.794,-0.755 1.288,-0.511c2.385,1.179 4.46,3.053 5.89,5.53l0.017,0.028Zm-2.539,1.428c0.215,0.371 0.046,0.837 -0.343,1.016l-0.568,0.26c-0.301,0.138 -0.655,0.011 -0.821,-0.276c-0.865,-1.499 -2.094,-2.656 -3.511,-3.425c-0.487,-0.265 -0.736,-0.846 -0.524,-1.358c0.21,-0.509 0.794,-0.756 1.283,-0.504c1.813,0.938 3.388,2.388 4.484,4.287Zm3.225,5.464c-0.13,0.288 -0.264,0.586 -0.336,0.89c-0.28,1.179 0,2.632 0,2.632c0,0 0.513,2.835 0,4.289c-0.855,2.423 -2.471,4.253 -5.113,4.253c-1.282,0 -2.765,-1.207 -3.956,-2.177l-0.001,0l0,0l-0.001,-0.001c-0.388,-0.316 -0.744,-0.606 -1.053,-0.821c-0.807,-0.563 -2.506,-1.542 -3.711,-2.237c-0.67,-0.386 -1.187,-0.684 -1.312,-0.773c-0.631,-0.448 -0.731,-1.306 -0.38,-1.867c0.351,-0.561 1.245,-0.91 1.929,-0.37c0.684,0.54 2.946,1.941 2.946,1.941c0,0 -3.64,-3.678 -4.283,-4.221c-0.644,-0.544 -0.727,-1.5 -0.212,-2.014c0.514,-0.514 1.324,-0.538 1.799,-0.151c0.475,0.387 4.364,4.149 4.364,4.149c0,0 -3.987,-5.03 -4.364,-5.495c-0.376,-0.465 -0.483,-1.281 0,-1.764c0.484,-0.484 1.325,-0.486 1.826,0c0.5,0.486 4.378,5.174 4.378,5.174c0,0 -2.669,-4.478 -2.98,-5.174c-0.31,-0.696 -0.03,-1.597 0.617,-1.84c0.648,-0.242 1.384,-0.054 1.802,0.53c0.115,0.159 0.433,0.744 0.85,1.511c1.112,2.044 2.928,5.382 3.453,5.382c0.477,0 0.511,-0.272 0.577,-0.805l0,0l0,-0.001c0.034,-0.274 0.077,-0.617 0.193,-1.027c0.307,-1.086 2.073,-2.919 3.071,-1.755c0.446,0.521 0.181,1.109 -0.103,1.742Zm0.802,12.595c-2.22,2.422 -3.372,2.045 -4.129,1.488c-1.62,-1.191 -1.406,-1.27 -0.507,-1.605c0.648,-0.24 1.65,-0.612 2.579,-1.626c0.843,-0.92 1.227,-1.771 1.486,-2.346c0.424,-0.939 0.516,-1.142 1.734,0.293c0.609,0.716 1.058,1.374 -1.163,3.796Zm-20.864,-8.729c-0.473,0.081 -0.791,0.535 -0.667,0.999c0.627,2.34 1.901,4.333 3.578,5.839c0.409,0.368 1.038,0.281 1.373,-0.157c0.336,-0.439 0.247,-1.066 -0.159,-1.443c-1.337,-1.242 -2.352,-2.863 -2.86,-4.756c-0.099,-0.37 -0.456,-0.619 -0.834,-0.555l-0.431,0.073Zm-2.709,0.46c0.526,-0.089 1.023,0.26 1.161,0.775c0.681,2.539 2.069,4.699 3.897,6.324c0.414,0.368 0.501,0.995 0.165,1.434c-0.335,0.438 -0.963,0.525 -1.379,0.163c-2.167,-1.887 -3.815,-4.418 -4.615,-7.403c-0.011,-0.041 -0.021,-0.082 -0.032,-0.124c-0.141,-0.542 0.23,-1.071 0.783,-1.165l0.02,-0.004Z\" />\n        </g>\n      );\n    case 'apple':\n      return (\n        <g>\n          <path\n            d=\"M16.6437 15.5861C16.3385 16.2848 15.9772 16.928 15.5586 17.5193C14.9881 18.3255 14.5209 18.8835 14.1609 19.1934C13.6027 19.702 13.0048 19.9625 12.3644 19.9773C11.9047 19.9773 11.3504 19.8477 10.705 19.5847C10.0576 19.323 9.46262 19.1934 8.91858 19.1934C8.34801 19.1934 7.73608 19.323 7.08155 19.5847C6.42601 19.8477 5.89793 19.9847 5.49417 19.9983C4.88012 20.0242 4.26806 19.7563 3.65713 19.1934C3.2672 18.8563 2.77947 18.2786 2.1952 17.4601C1.56832 16.586 1.05294 15.5725 0.649179 14.417C0.216767 13.1689 5.70276e-08 11.9603 5.70276e-08 10.7902C5.70276e-08 9.44984 0.292262 8.29382 0.877656 7.32509C1.33773 6.54696 1.94978 5.93315 2.71581 5.48255C3.48185 5.03195 4.30955 4.80232 5.20091 4.78763C5.68863 4.78763 6.32822 4.93713 7.12303 5.23095C7.9156 5.52576 8.42451 5.67526 8.64763 5.67526C8.81444 5.67526 9.37977 5.50045 10.3382 5.15194C11.2445 4.82874 12.0094 4.69492 12.636 4.74763C14.334 4.88343 15.6097 5.54675 16.4581 6.74177C14.9395 7.6536 14.1883 8.93072 14.2032 10.5691C14.2169 11.8452 14.6841 12.9071 15.6022 13.7503C16.0183 14.1417 16.483 14.4441 17 14.6589C16.8879 14.9812 16.7695 15.2898 16.6437 15.5861V15.5861ZM12.7494 0.400111C12.7494 1.40034 12.3806 2.33425 11.6456 3.19867C10.7586 4.22629 9.68574 4.8201 8.5223 4.7264C8.50747 4.6064 8.49888 4.48011 8.49888 4.3474C8.49888 3.38718 8.9207 2.35956 9.66979 1.51934C10.0438 1.09392 10.5194 0.740188 11.0962 0.458011C11.6718 0.180044 12.2162 0.0263202 12.7282 8.94779e-09C12.7431 0.133712 12.7494 0.267436 12.7494 0.400099V0.400111Z\"\n            transform=\"translate(8 5)\"\n          />\n        </g>\n      );\n    case 'windows':\n      return (\n        <g>\n          <path\n            d=\"M0 2.83167L7.7647 1.72197L7.76809 9.58155L0.00709303 9.62793L0 2.83167ZM7.761 10.4871L7.76703 18.3536L0.0060269 17.2338L0.00559175 10.4344L7.761 10.4871ZM8.70226 1.5768L18.9976 0V9.48159L8.70226 9.56736V1.5768ZM19 10.5611L18.9976 20L8.70224 18.4752L8.68781 10.5434L19 10.5611Z\"\n            transform=\"translate(7 6)\"\n          />\n        </g>\n      );\n    case 'announcement':\n      return (\n        <g>\n          <path d=\"M25.6581 10.5613C26.0345 10.3103 26.1925 9.83076 26.0039 9.4195C24.2665 5.63117 20.4405 3 16 3C11.5595 3 7.73351 5.63117 5.99611 9.4195C5.80749 9.83077 5.96545 10.3103 6.34191 10.5613C6.88084 10.9206 7.61467 10.6606 7.8973 10.0778C9.35485 7.07228 12.4354 5 16 5C19.5646 5 22.6451 7.07228 24.1027 10.0778C24.3853 10.6606 25.1191 10.9206 25.6581 10.5613Z\" />\n          <path d=\"M22.3049 12.7967C22.6196 12.5869 22.7778 12.2027 22.6613 11.8429C21.7519 9.03244 19.1133 7 16 7C12.8867 7 10.2481 9.03244 9.33867 11.8429C9.22223 12.2027 9.38038 12.5869 9.69507 12.7967C10.2797 13.1865 11.0964 12.79 11.3582 12.138C12.0967 10.2987 13.8967 9 16 9C18.1033 9 19.9033 10.2987 20.6418 12.138C20.9036 12.79 21.7203 13.1865 22.3049 12.7967Z\" />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M16 15C16.5523 15 17 14.5523 17 14C17 13.4477 16.5523 13 16 13C15.4477 13 15 13.4477 15 14C15 14.5523 15.4477 15 16 15ZM16 17C17.6569 17 19 15.6569 19 14C19 12.3431 17.6569 11 16 11C14.3431 11 13 12.3431 13 14C13 15.6569 14.3431 17 16 17Z\"\n          />\n          <path\n            fillRule=\"evenodd\"\n            clipRule=\"evenodd\"\n            d=\"M19.2447 17.8043C18.3714 18.5499 17.2383 19 16 19C14.7618 19 13.6287 18.5499 12.7554 17.8044L9.0637 27.6489C8.86978 28.166 9.13178 28.7424 9.6489 28.9363C10.166 29.1302 10.7424 28.8682 10.9364 28.3511L12.0655 25.3401C13.2981 25.7676 14.6219 25.9999 16 25.9999C17.3781 25.9999 18.702 25.7676 19.9345 25.34L21.0637 28.3511C21.2576 28.8682 21.834 29.1302 22.3512 28.9363C22.8683 28.7424 23.1303 28.166 22.9364 27.6489L19.2447 17.8043ZM12.7682 23.4662L13.8225 20.6546C14.5079 20.8788 15.2398 20.9999 16 20.9999C16.7602 20.9999 17.4922 20.8788 18.1775 20.6546L19.2318 23.4662C18.2181 23.8122 17.1309 23.9999 16 23.9999C14.8691 23.9999 13.782 23.8122 12.7682 23.4662Z\"\n          />\n        </g>\n      );\n  }\n};\n\nclass Icon extends React.Component<Props> {\n  render() {\n    const {\n      size = 32,\n      onboarding,\n      count,\n      onClick,\n      glyph,\n      ...rest\n    } = this.props;\n\n    return (\n      <SvgWrapper\n        size={size}\n        onboarding={onboarding}\n        count={count}\n        className={'icon'}\n        onClick={onClick}\n        {...rest}\n      >\n        <InlineSvg\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          strokeLinejoin=\"round\"\n          strokeMiterlimit=\"1.414\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          aria-labelledby=\"title\"\n          viewBox=\"0 0 32 32\"\n          preserveAspectRatio=\"xMidYMid meet\"\n          fit\n        >\n          <title id=\"title\">{glyph}</title>\n          <Glyph glyph={glyph} />\n        </InlineSvg>\n      </SvgWrapper>\n    );\n  }\n}\n\nexport default Icon;\n"
  },
  {
    "path": "src/components/illustrations/index.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { zIndex } from '../globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Cluster = styled.img`\n  position: absolute;\n  opacity: 0.05;\n`;\n\nexport const ClusterOne = styled(Cluster)`\n  max-width: 120px;\n  max-height: 120px;\n  top: 10%;\n  left: 10%;\n  z-index: ${zIndex.background};\n`;\n\nexport const ClusterTwo = styled(Cluster)`\n  max-width: 160px;\n  max-height: 160px;\n  top: 60%;\n  right: 10%;\n  z-index: ${zIndex.background};\n`;\n\nexport const ClusterThree = styled(Cluster)`\n  max-width: 80px;\n  max-height: 80px;\n  top: 10%;\n  right: 40%;\n  z-index: ${zIndex.background};\n`;\n\nexport const ClusterFour = styled(Cluster)`\n  max-width: 80px;\n  max-height: 80px;\n  top: 80%;\n  left: 40%;\n  z-index: ${zIndex.background};\n`;\n\nexport const Constellations = styled.div`\n  position: absolute;\n  background-color: transparent;\n  background: url('/img/constellations.svg') center top no-repeat;\n  background-size: cover 100%;\n  z-index: ${zIndex.background};\n  height: calc(100% + 4px);\n  width: 110%;\n  top: -10px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  pointer-events: none;\n`;\n\nexport const ConversationWrapper = styled.div`\n  position: relative;\n  z-index: ${zIndex.background};\n\n  max-width: 480px;\n  overflow-y: hidden;\n  box-shadow: 0 0 32px 24px ${theme.bg.default};\n  display: inline-block;\n  align-items: center;\n  justify-content: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n\n  > img {\n    height: 100%;\n    width: 100%;\n    object-fit: contain;\n    pointer-events: none;\n  }\n\n  + div {\n    margin-left: 48px;\n\n    @media (max-width: ${MEDIA_BREAK}px) {\n      margin-left: 0;\n      margin-bottom: 32px;\n    }\n  }\n`;\n\nexport const Conversation = () => (\n  <ConversationWrapper>\n    <img src=\"/img/conversation.svg\" alt=\"conversation screenshot\" />\n  </ConversationWrapper>\n);\n\nconst DiscoverImage = styled.img`\n  position: relative;\n  left: -24px;\n  max-width: 400px;\n  height: auto;\n  object-fit: contain;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    left: auto;\n    margin-top: 32px;\n    max-width: 100%;\n    min-width: 256px;\n  }\n`;\n\nexport const Discover = () => <DiscoverImage src=\"/img/discover.png\" alt=\"\" />;\n\nconst EmptyImage = styled.img`\n  position: absolute;\n  right: -10%;\n  top: 5%;\n  bottom: -10%;\n  height: 120%;\n  z-index: ${zIndex.background};\n`;\n\nexport const Empty = () => <EmptyImage src=\"/img/empty.svg\" alt=\"\" />;\n\nconst InlineSvg = styled.svg`\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  color: inherit;\n  fill: currentColor;\n`;\n\nconst SvgWrapper = styled.div`\n  display: inline-block;\n  position: relative;\n  grid-area: topic;\n  justify-self: flex-start;\n  min-height: 200px;\n  min-width: 300px;\n  height: 100%;\n  width: 100%;\n`;\n\nexport const Easy = () => (\n  <SvgWrapper>\n    <InlineSvg\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      strokeLinejoin=\"round\"\n      strokeMiterlimit=\"1.414\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-labelledby=\"title\"\n      viewBox=\"0 0 630 463\"\n      preserveAspectRatio=\"xMidYMid meet\"\n      fit\n      id={'easy'}\n    >\n      <title id=\"title\">{'easy'}</title>\n      <g id=\"Canvas\" fill=\"none\">\n        <g id=\"easy\">\n          <mask\n            id=\"mask0\"\n            mask-type=\"alpha\"\n            maskUnits=\"userSpaceOnUse\"\n            x=\"-9\"\n            y=\"-11\"\n            width=\"639\"\n            height=\"474\"\n          >\n            <path\n              id=\"Union\"\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M 629.188 0L 153.38 0L 153.283 155.41C 69.1314 205.422 -32.9109 357.603 10.2302 432.353C 47.7807 497.416 118.01 483.561 233.797 409.489L 639 469.574L 629.188 0Z\"\n              transform=\"translate(630 -11) scale(-1 1)\"\n              fill=\"#C4C4C4\"\n            />\n          </mask>\n          <g mask=\"url(#mask0)\">\n            <path\n              id=\"Ellipse 2.4\"\n              d=\"M 10.2302 291.569C -33.2406 216.247 70.6996 62.3076 155.21 13.4975C 239.72 -35.3125 163.58 67.7898 365.398 17.7448C 567.216 -32.3002 443.055 122.055 292.011 229.251C 140.968 336.446 53.701 366.891 10.2302 291.569Z\"\n              transform=\"translate(630 129.784) scale(-1 1)\"\n              fill=\"white\"\n            />\n            <g id=\"Group 5\">\n              <g id=\"Group 5_2\">\n                <g id=\"Group 5_3\">\n                  <path\n                    id=\"Vector\"\n                    d=\"M 52.5254 0.0326982C 51.1383 0.680618 43.278 11.9729 33.9381 25.9495C 27.9273 34.9278 21.454 45.0169 15.7206 54.1803C 6.93557 68.2494 0.0924631 80.1896 -1.12884e-05 82.6887C -1.12884e-05 83.892 12.669 92.4075 30.1467 103.515C 38.5618 89.0754 70.0031 36.8716 82.7645 15.6753C 66.0267 6.0491 53.6351 -0.522662 52.5254 0.0326982Z\"\n                    transform=\"translate(458.837 0.533203) scale(-1 1)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_2\"\n                    d=\"M 55.2072 1.48097C 54.3749 1.01817 53.5427 0.4628 52.6179 0C 39.764 21.1962 8.32268 73.4 -1.12884e-05 87.8394C 0.647309 88.3022 1.29464 88.6724 2.03444 89.1352C 11.8367 95.3367 22.9336 102.279 34.2155 109.128C 44.3877 91.8195 76.1989 38.9677 87.3883 20.5483C 76.1989 13.7914 65.0095 7.21968 55.2072 1.48097Z\"\n                    transform=\"translate(428.783 16.116) scale(-1 1)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <path\n                    id=\"Vector_3\"\n                    d=\"M 56.3169 1.94375C 55.2997 1.29583 54.19 0.647917 53.1727 -2.82471e-06C 41.9833 18.512 10.1722 71.2712 -1.12884e-05 88.5799C 0.924732 89.1352 1.8495 89.6906 2.68177 90.246C 13.2238 96.6326 23.581 102.927 32.9209 108.48C 45.035 88.2096 73.887 41.3743 86.556 20.7334C 77.3086 14.8096 66.859 8.33039 56.3169 1.94375Z\"\n                    transform=\"translate(394.567 36.6643) scale(-1 1)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_4\"\n                    d=\"M 85.5388 23.3251C 85.0764 21.1962 73.887 13.1435 58.1664 2.86935C 56.6868 1.94375 55.2072 0.925611 53.6352 1.12988e-05C 40.9662 20.6409 12.2066 67.4762 2.25767e-05 87.7468C 1.66456 88.765 3.32909 89.6906 4.90115 90.6162C 21.2691 100.242 33.1058 106.999 33.8456 106.722C 34.7704 106.444 43.3705 94.3186 53.3577 79.3239C 59.3685 70.253 65.9342 60.164 71.4827 51.0005C 79.8054 37.3017 86.0937 25.9168 85.5388 23.3251Z\"\n                    transform=\"translate(361.647 57.4902) scale(-1 1)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <path\n                    id=\"Vector_5\"\n                    d=\"M -2.25767e-05 -5.64941e-06L 123.361 74.2331\"\n                    transform=\"translate(453.011 54.4358) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_6\"\n                    d=\"M -1.12884e-05 1.12988e-05L 31.4413 18.8822\"\n                    transform=\"translate(370.986 58.8787) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_7\"\n                    d=\"M 0 5.64941e-06L 42.9081 25.9168\"\n                    transform=\"translate(424.899 26.3904) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n                <g id=\"Group 5_4\">\n                  <path\n                    id=\"Vector_8\"\n                    d=\"M 81.9323 19.8078C 81.9323 21.2888 75.5516 33.5067 67.3214 48.1312C 62.0503 57.5723 56.0394 67.939 50.491 77.2876C 41.9833 91.5418 34.493 103.112 32.2736 104.315C 31.2564 104.87 17.8476 97.4656 0 86.9138C 8.97001 72.9372 41.1511 21.1037 54.19 -5.64941e-06C 70.4654 10.5518 81.9323 18.6045 81.9323 19.8078Z\"\n                    transform=\"translate(82.744 228.448) scale(-1 1)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_9\"\n                    d=\"M 86.0936 19.9004C 86.9259 20.4558 87.7582 21.0111 88.5905 21.4739C 75.5516 42.5776 43.3704 94.3186 34.4004 108.388C 33.7531 108.017 33.0133 107.555 32.366 107.184C 22.3788 101.261 11.1894 94.5037 0 87.6543C 10.8195 70.7158 43.278 18.3269 54.6523 5.64941e-06C 65.6568 6.84944 76.5688 13.7914 86.0936 19.9004Z\"\n                    transform=\"translate(116.96 206.882) scale(-1 1)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <path\n                    id=\"Vector_10\"\n                    d=\"M 84.2441 18.512C 85.2613 19.1599 86.3711 19.8078 87.3883 20.4558C 76.0139 38.7826 43.5554 91.1716 32.7359 108.11C 31.8112 107.555 30.8864 106.999 30.0542 106.444C 19.6046 99.9648 9.24744 93.5781 0 87.7468C 12.484 67.6613 41.0586 20.7334 53.6351 0C 63.16 5.64616 73.702 11.9402 84.2441 18.512Z\"\n                    transform=\"translate(149.788 186.426) scale(-1 1)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_11\"\n                    d=\"M 50.7721 0.0340114C 52.899 -0.521348 65.198 5.77275 81.3811 15.2139C 82.8606 16.0469 84.4327 16.9725 86.0048 17.8981C 73.4283 38.6315 44.8537 85.5594 32.3696 105.645C 30.7051 104.627 29.1331 103.609 27.561 102.59C 11.563 92.4089 0.188563 84.9115 0.00361453 84.0785C -0.181334 83.0603 6.75429 69.9168 15.5394 54.2742C 20.9029 44.7405 26.9136 34.3738 32.4621 25.2103C 40.8773 11.604 48.1828 0.774491 50.7721 0.0340114Z\"\n                    transform=\"translate(182.158 168.621) scale(-1 1)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <path\n                    id=\"Vector_12\"\n                    d=\"M 61.7729 38.5049L 0 1.12988e-05\"\n                    transform=\"translate(115.11 259.734) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_13\"\n                    d=\"M 16.9228 10.5518L 2.25767e-05 -1.12988e-05\"\n                    transform=\"translate(44.4597 303.792) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_14\"\n                    d=\"M 55.4846 34.6174L -2.25767e-05 0\"\n                    transform=\"translate(124.265 208.641) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_15\"\n                    d=\"M 42.5382 26.5647L 2.25767e-05 1.12988e-05\"\n                    transform=\"translate(57.8685 250.015) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n                <path\n                  id=\"Vector_16\"\n                  d=\"M 104.732 47.563C 103.807 38.1219 100.478 29.5138 95.3917 22.2942C 90.583 15.5373 84.2949 9.98368 76.9894 6.09616C 68.3893 1.56073 58.402 -0.660708 48.0449 0.172332C 47.8599 0.172332 47.675 0.172332 47.5825 0.172332C 30.3823 1.83841 15.9563 11.5572 7.63363 25.1635C 1.99269 34.5121 -0.874012 45.6193 0.23568 57.3744C 0.23568 57.6521 0.328132 57.8372 0.328132 58.1148C 1.62277 70.1476 6.98624 80.8846 14.8466 89.0299C 24.0015 98.471 36.6705 104.395 50.4492 104.95C 52.7611 105.043 55.0729 104.95 57.4772 104.765C 74.6775 103.099 89.1035 93.3802 97.4262 79.7739C 102.975 70.4253 105.841 59.2256 104.732 47.563Z\"\n                  transform=\"translate(281.522 113.78) scale(-1 1)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Union_2\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 71.0522 0.00113563C 72.1562 0.0377567 73.0213 0.962561 72.9846 2.06657C 72.6619 11.7541 70.0705 26.0592 60.2175 41.9132L 69.4667 47.5382L 95.5377 4.48136C 96.1098 3.53654 97.3395 3.23429 98.2844 3.80631C 99.2292 4.37858 99.5314 5.60831 98.9593 6.55314L 72.8843 49.6166L 86.3183 57.7863C 89.4051 51.7682 92.9311 46.3039 96.572 41.4357C 97.2335 40.5512 98.4868 40.3703 99.3714 41.0319C 100.256 41.6933 100.437 42.9467 99.7752 43.8312C 96.1939 48.6198 92.7448 53.9797 89.7446 59.87L 137.127 88.6857C 138.071 89.2597 138.371 90.4901 137.797 91.4338C 137.223 92.3776 135.993 92.6774 135.049 92.1034L 87.9924 63.486C 82.0167 76.4772 78.3649 91.8363 80.0967 109.17C 80.2066 110.269 79.4046 111.249 78.3055 111.359C 77.2064 111.469 76.2264 110.667 76.1166 109.568C 74.2823 91.2074 78.2194 75.0019 84.5534 61.3947L 70.8126 53.0382L 56.4211 76.8061C 55.8489 77.7511 54.6192 78.0531 53.6744 77.4811C 52.7294 76.9091 52.4273 75.6791 52.9994 74.7343L 67.395 50.9599L 58.0369 45.2687C 53.5483 51.8832 47.7678 58.7243 40.3464 65.5771C 39.5348 66.3263 38.2695 66.276 37.5202 65.4645C 36.7708 64.653 36.8212 63.3876 37.6327 62.6383C 44.7607 56.0566 50.3083 49.5053 54.6144 43.1872L 0.961119 10.558C 0.017271 9.98405 -0.282412 8.75382 0.291441 7.80997C 0.865416 6.86637 2.09576 6.56657 3.03949 7.14054L 56.7993 39.8344C 66.2735 24.6042 68.6854 10.9836 68.9868 1.93326C 69.0235 0.829505 69.9483 -0.0357296 71.0522 0.00113563ZM 144.157 92.9452C 143.215 92.3698 141.984 92.6679 141.409 93.6108C 140.833 94.5539 141.131 95.7846 142.074 96.3598L 165.285 110.521C 166.228 111.097 167.459 110.799 168.034 109.856C 168.61 108.913 168.312 107.682 167.369 107.107L 144.157 92.9452ZM 122.269 17.9301C 122.979 18.776 122.869 20.0375 122.023 20.7477C 119.209 23.1105 115.929 26.1191 112.461 29.6818C 111.69 30.4733 110.424 30.4904 109.632 29.7199C 108.841 28.9494 108.824 27.6833 109.594 26.8918C 113.154 23.235 116.532 20.1347 119.451 17.6842C 120.297 16.974 121.559 17.0841 122.269 17.9301Z\"\n                  transform=\"translate(309.827 109.453) scale(-1 1)\"\n                  fill=\"white\"\n                />\n              </g>\n              <g id=\"Group 5_5\">\n                <path\n                  id=\"Vector_17\"\n                  d=\"M 3.92965 2.88114C -0.879014 7.04634 -1.34136 14.3586 2.91246 19.1717C 3.92967 20.375 5.03937 21.208 6.14906 21.6708C 9.47814 14.8214 13.9169 6.58357 16.9686 1.40021C 12.8072 -0.821231 7.62863 -0.451014 3.92965 2.88114Z\"\n                  transform=\"translate(521.488 411.243) scale(-1 1)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_18\"\n                  d=\"M 5.92183 11.8408C 9.19236 11.8408 11.8436 9.19014 11.8436 5.9204C 11.8436 2.65066 9.19236 -1.12922e-05 5.92183 -1.12922e-05C 2.65131 -1.12922e-05 0 2.65066 0 5.9204C 0 9.19014 2.65131 11.8408 5.92183 11.8408Z\"\n                  transform=\"matrix(-0.608145 -0.793772 -0.793228 0.608855 536.011 411.736)\"\n                  fill=\"#1CD2F2\"\n                />\n                <g id=\"Group\">\n                  <path\n                    id=\"Vector_19\"\n                    d=\"M -2.44141e-05 26.3796L -2.44141e-05 1.12988e-05\"\n                    transform=\"translate(351.289 186.611) scale(-1 1)\"\n                    stroke=\"#1CD2F2\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_20\"\n                    d=\"M 0 7.96016L 3.2366 0\"\n                    transform=\"translate(329.65 189.666) scale(-1 1)\"\n                    stroke=\"#1CD2F2\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_21\"\n                    d=\"M 1.12884e-05 7.58993L 3.14411 0\"\n                    transform=\"translate(336.863 207.252) scale(-1 1)\"\n                    stroke=\"#1CD2F2\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_22\"\n                    d=\"M 1.12884e-05 13.4212L 13.2238 1.12988e-05\"\n                    transform=\"translate(325.304 210.214) scale(-1 1)\"\n                    stroke=\"#1CD2F2\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_23\"\n                    d=\"M 6.93555 16.6608L -2.25767e-05 5.64941e-06\"\n                    transform=\"translate(372.096 199.014) scale(-1 1)\"\n                    stroke=\"#1CD2F2\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n                <path\n                  id=\"Union_3\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 120.89 193.851C 150.204 191.259 164.907 169.693 171.658 143.591C 182.847 100.458 180.351 56.029 173.692 54.1777C 170.398 53.3925 168.73 54.4721 167 55.592C 165.67 56.4526 164.303 57.3368 162.133 57.4174C 159.706 57.5073 159.048 56.1974 158.291 54.6891C 157.491 53.0949 156.579 51.2787 153.348 50.6603C 150.199 50.092 148.692 51.2546 147.155 52.4409C 145.939 53.3793 144.704 54.3327 142.621 54.4553C 140.551 54.5749 139.886 53.0307 139.122 51.2553C 138.11 48.9062 136.924 46.1518 132.079 46.31C 127.615 46.4819 123.364 50.092 120.334 52.6655C 118.467 54.2507 117.063 55.4428 116.358 55.1957C 111.55 53.6222 105.724 46.7729 113.307 18.9123C 120.52 -7.28205 107.018 -5.89362 96.7538 20.7636C 88.9149 41.0275 90.5516 60.5905 91.4895 71.801C 91.9568 77.3859 92.2506 80.8979 91.1128 81.3903C 87.6913 82.8713 79.8309 79.6318 78.3513 57.3246C 76.9642 36.4987 68.1792 40.2936 65.22 61.9528C 62.2607 83.6117 71.5083 97.9584 88.8934 109.158C 106.279 120.358 106.556 135.168 99.6205 137.759C 78.1289 145.689 45.8068 110.871 26.9463 90.5546C 25.1127 88.5793 23.4064 86.7411 21.8495 85.0927L 5.1117 68.5243C -5.61535 86.2033 3.16968 102.957 7.70093 108.418C 8.77784 109.757 9.95826 111.24 11.2354 112.843C 32.1106 139.058 78.7994 197.688 120.89 193.851Z\"\n                  transform=\"translate(367.313 220.366) scale(-1 1)\"\n                  fill=\"#E2197A\"\n                />\n                <g id=\"Group_2\">\n                  <path\n                    id=\"Vector_24\"\n                    d=\"M -2.25767e-05 7.12711C 0.277401 4.90567 0.462417 2.59166 0.647366 -2.25976e-05\"\n                    transform=\"translate(193.621 292.037) scale(-1 1)\"\n                    stroke=\"white\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_25\"\n                    d=\"M 2.25767e-05 21.1048C 5.91838 22.956 7.30552 -0.184026 9.61738 0.00109364C 12.7615 0.278774 15.9056 29.9906 19.6045 30.1757C 27.0025 30.4534 24.7832 0.741573 28.5746 1.85229C 31.9962 2.87045 28.4821 22.2155 31.9037 26.9361C 33.3833 28.9724 36.4349 28.6022 42.2608 8.88688\"\n                    transform=\"translate(236.806 296.85) scale(-1 1)\"\n                    stroke=\"white\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_26\"\n                    d=\"M -4.51535e-05 -2.25976e-05C 0.73975 4.25774 1.10969 7.96015 1.66454 10.8295\"\n                    transform=\"translate(242.077 301.293) scale(-1 1)\"\n                    stroke=\"white\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_27\"\n                    d=\"M -4.51535e-05 1.12988e-05C 0.73975 2.31401 1.38707 4.53546 1.84944 6.66434\"\n                    transform=\"translate(244.852 289.816) scale(-1 1)\"\n                    stroke=\"white\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n                <path\n                  id=\"Vector_28\"\n                  d=\"M 214.785 103.492C 155.139 42.7729 140.066 3.43488 109.55 0.380399C 79.033 -2.67408 65.9941 13.5239 56.0069 18.3371C 50.4584 21.0213 41.3959 20.5585 31.3162 13.5239C 10.7869 -0.822869 14.9483 14.7272 21.4215 22.6874C 30.6689 34.1648 49.2563 31.2954 46.5745 34.8127C 43.8928 38.33 25.5828 33.7946 8.66002 48.1413C -3.54659 58.5081 -3.63905 72.1144 13.4687 60.3593C 30.5765 48.6042 46.9444 49.5298 47.5917 50.1777C 48.239 50.8256 31.7786 57.3973 21.514 71.2813C 12.7289 83.129 11.5267 95.4395 15.7806 97.5684C 19.3871 99.4196 26.6925 85.6281 35.0152 77.5754C 46.482 66.3757 55.8219 61.2849 57.0241 62.6733C 58.2263 64.0617 45.4648 76.5572 39.8239 89.238C 35.1077 99.9749 34.0905 111.823 38.5292 115.803C 42.8755 119.783 49.1638 100.715 53.88 92.8478C 59.1511 83.9621 75.2416 58.6006 86.1535 65.2649C 96.7881 71.8367 86.6159 79.0564 81.7148 86.2761C 76.8136 93.4032 78.0158 104.14 84.8589 106.547C 91.4246 108.861 111.861 38.7928 138.679 64.5245C 169.935 94.5139 190.927 115.432 198.51 123.022C 210.347 106.732 214.138 102.474 214.138 102.474L 214.785 103.492Z\"\n                  transform=\"translate(620.357 142.358) scale(-1 1)\"\n                  fill=\"#E2197A\"\n                />\n                <path\n                  id=\"Vector_29\"\n                  d=\"M 4.34885 8.69555C 6.75064 8.69555 8.69764 6.74902 8.69764 4.34781C 8.69764 1.94659 6.75064 1.12922e-05 4.34885 1.12922e-05C 1.94706 1.12922e-05 1.1295e-05 1.94659 1.1295e-05 4.34781C 1.1295e-05 6.74902 1.94706 8.69555 4.34885 8.69555Z\"\n                  transform=\"matrix(-0.608145 -0.793772 -0.793228 0.608855 533.288 395.918)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_30\"\n                  d=\"M 21.7215 6.11648C 18.7623 0.470327 11.7343 -1.65853 6.09333 1.39595C 1.19219 3.98763 -1.02723 9.72635 0.452359 14.8171C 7.85031 12.4106 16.173 10.004 22.5538 8.43048C 22.4613 7.69 22.0914 6.85696 21.7215 6.11648Z\"\n                  transform=\"translate(536.506 296.288) scale(-1 1)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_31\"\n                  d=\"M 5.91942 11.8455C 9.18864 11.8455 11.8389 9.19381 11.8389 5.92276C 11.8389 2.65172 9.18864 -1.12968e-05 5.91942 -1.12968e-05C 2.6502 -1.12968e-05 1.12904e-05 2.65172 1.12904e-05 5.92276C 1.12904e-05 9.19381 2.6502 11.8455 5.91942 11.8455Z\"\n                  transform=\"matrix(-0.895436 -0.44523 -0.44457 0.895764 531.672 283.009)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_32\"\n                  d=\"M 4.34707 8.69904C 6.7479 8.69904 8.69417 6.75169 8.69417 4.34951C 8.69417 1.94734 6.7479 5.64838e-06 4.34707 5.64838e-06C 1.94624 5.64838e-06 2.25809e-05 1.94734 2.25809e-05 4.34951C 2.25809e-05 6.75169 1.94624 8.69904 4.34707 8.69904Z\"\n                  transform=\"matrix(-0.895436 -0.44523 -0.44457 0.895764 522.181 269.891)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Union_4\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 65.8744 38.1006C 70.7756 44.1172 76.3241 39.7669 82.9822 30.8809C 89.2705 33.4727 101.662 40.2295 105.084 54.3911C 89.0856 69.2009 68.0013 84.6582 60.2335 80.8633C 50.6523 76.2034 44.7636 47.7925 41.3816 31.4761C 40.1284 25.4302 39.2195 21.0449 38.5945 20.1441C 37.3149 18.3511 25.2439 17.2388 14.9376 16.2888C 6.62171 15.5222 -0.545409 14.8618 0.0327159 14.0352C 0.495118 13.2947 7.80054 10.7029 16.5856 7.83351C 23.8907 5.42677 32.306 2.92775 38.687 1.44703C 43.5881 0.336195 47.2871 -0.311754 48.3969 0.151137C 50.4362 0.932875 52.5569 7.05348 55.103 14.4019C 57.9832 22.7146 61.4077 32.5982 65.8744 38.1006Z\"\n                  transform=\"translate(552.639 303.271) scale(-1 1)\"\n                  fill=\"#828C99\"\n                />\n                <path\n                  id=\"Union_5\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 66.3673 23.2327C 69.6962 22.0293 79.2211 10.6443 87.5439 0C 94.4794 2.49902 108.628 8.88574 114.639 21.1963C 100.675 40.6338 88.931 55.8137 86.0643 57.3872C 80.3212 60.4824 58.0819 53.5759 43.3323 48.9956C 36.4699 46.8643 31.2287 45.2368 30.0248 45.3542C 28.1672 45.4905 21.2258 51.5149 14.4869 57.3635C 7.47186 63.4519 0.676332 69.3499 0.0631733 68.2168C -0.399229 67.3835 1.7276 62.293 4.77924 56.0913C 5.64069 56.4746 6.51447 56.647 7.39899 56.6377C 6.57245 56.6294 5.75983 56.4553 4.96405 56.0913C 8.2851 49.2583 12.6183 41.0439 15.7607 35.8584C 15.7376 35.8457 15.7144 35.8333 15.6912 35.8208C 17.4483 32.8589 18.8354 30.8225 19.2978 30.5447C 20.0814 30.1526 24.7499 29.645 30.9672 28.9692C 42.3586 27.7307 58.949 25.9272 66.3673 23.2327Z\"\n                  transform=\"translate(520.303 376.73) scale(-1 1)\"\n                  fill=\"#828C99\"\n                />\n                <path\n                  id=\"Vector_33\"\n                  d=\"M 47.4826 11.311C 43.4138 7.42346 39.2524 3.62848 35.1836 0.296321C 34.6287 -0.166479 33.8889 -0.073908 33.519 0.481452C 26.6759 9.64489 17.2435 22.8809 0.228266 47.5944C -0.141632 48.0572 -0.0492024 48.7052 0.413169 49.168L 12.8048 60.4603C 13.3596 60.9231 14.0994 60.8305 14.5618 60.2752L 47.6676 12.977C 47.945 12.3291 47.8525 11.6812 47.4826 11.311Z\"\n                  transform=\"translate(436.779 266.657) scale(-1 1)\"\n                  fill=\"#EAA736\"\n                />\n                <path\n                  id=\"Vector_34\"\n                  d=\"M 20.3559 0.493653C 19.6161 -0.246827 18.4139 -0.154278 17.8591 0.771322L 0.28896 25.8551C -0.173412 26.503 -0.0808925 27.5211 0.566428 28.0765L 22.1129 47.6992C 22.8527 48.3472 24.0549 48.2546 24.6098 47.4216C 30.898 38.2581 36.2615 30.2054 40.7928 23.2634C 41.2552 22.6155 41.1627 21.7825 40.6078 21.2271C 34.0421 14.0074 25.8119 5.76957 20.3559 0.493653Z\"\n                  transform=\"translate(414.461 308.112) scale(-1 1)\"\n                  fill=\"#7B16FF\"\n                />\n                <path\n                  id=\"Union_6\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 64.0847 0.833008L 63.9922 0.740479L 63.9886 0.746582L 63.1599 0C 63.1599 0 59.3684 4.25781 47.5317 20.5483L 47.5853 20.6021C 40.467 30.4114 30.3988 44.5581 16.5529 64.792C 14.3121 68.0725 12.1682 71.3289 10.1123 74.4514C 6.4834 79.9631 3.12866 85.0583 0 89.1353C 6.28821 91.7268 18.6798 98.4839 22.1938 112.646C 27.6498 107.647 32.4585 102.742 36.0649 98.6689L 51.3232 112.646C 51.3232 112.646 44.665 121.809 36.9897 131.62C 43.9253 134.119 57.9814 140.506 64.0847 152.909C 74.3494 138.655 95.8035 106.166 110.137 83.7668C 105.606 78.3057 96.8207 61.5525 107.455 43.8735L 64.0847 0.833008ZM 50.7101 23.637L 55.881 14.8206L 50.7684 23.6953L 50.7101 23.637ZM 45.5898 82.0081C 46.1448 82.4709 46.9769 82.3784 47.3469 81.823L 80.4526 34.3398C 80.7301 33.877 80.7301 33.229 80.2678 32.8589C 76.1064 28.9712 72.0375 25.1763 67.9686 21.8442C 67.5062 21.3813 66.674 21.4739 66.3041 22.0293C 59.5535 31.1926 50.0286 44.4287 33.0133 69.1423C 32.736 69.6978 32.736 70.3457 33.1982 70.7158L 45.5898 82.0081ZM 79.7129 110.332C 86.0011 101.168 91.3646 93.1152 95.8959 86.1733C 96.3583 85.5254 96.2657 84.7849 95.7109 84.0444C 89.1453 76.9172 80.915 68.772 75.4591 63.4036C 74.7192 62.7556 73.5171 62.8481 72.9623 63.6812L 55.3921 88.7651C 54.9298 89.5056 55.0222 90.4312 55.6696 90.9863L 77.2161 110.609C 77.9558 111.35 79.1581 111.165 79.7129 110.332Z\"\n                  transform=\"translate(469.657 245.017) scale(-1 1)\"\n                  fill=\"#DAE4F2\"\n                />\n                <path\n                  id=\"Vector_35\"\n                  d=\"M 43.6731 11.8939C 37.8473 0.971778 24.2535 -3.19342 13.3416 2.63786C 2.42959 8.46914 -1.73176 22.0755 4.09413 32.9975C 5.57372 35.6818 7.51566 37.9958 9.73504 39.847C 4.92638 46.6964 0.857527 51.5095 0.857527 51.6021C -0.437114 53.1756 -0.252166 55.4896 1.3199 56.7854C 2.05969 57.3408 2.89194 57.6185 3.72421 57.6185C 4.74143 57.6185 5.85115 57.1557 6.59095 56.3226C 6.86837 55.9524 11.3071 50.769 16.3008 43.4568C 22.0342 45.5857 28.6923 45.308 34.5182 42.161C 45.3377 36.4223 49.499 22.8159 43.6731 11.8939Z\"\n                  transform=\"translate(377.022 224.33) scale(-1 1)\"\n                  fill=\"#828C99\"\n                />\n                <g id=\"Group_3\">\n                  <path\n                    id=\"Vector_36\"\n                    d=\"M -2.25767e-05 9.26194C 0.184926 3.98602 4.71622 -0.17918 9.98725 0.00593966C 15.2583 0.19106 19.4196 4.72649 19.2347 10.0024\"\n                    transform=\"translate(362.849 238.254) scale(-1 1)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </InlineSvg>\n  </SvgWrapper>\n);\n\nexport const Happy = () => (\n  <SvgWrapper>\n    <InlineSvg\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      strokeLinejoin=\"round\"\n      strokeMiterlimit=\"1.414\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-labelledby=\"title\"\n      viewBox=\"0 0 554 461\"\n      preserveAspectRatio=\"xMidYMid meet\"\n      fit\n      id={'happy'}\n    >\n      <title id=\"title\">{'happy'}</title>\n      <g id=\"Canvas\" fill=\"none\">\n        <g id=\"happy\">\n          <mask\n            id=\"mask1\"\n            mask-type=\"alpha\"\n            maskUnits=\"userSpaceOnUse\"\n            x=\"0\"\n            y=\"0\"\n            width=\"568\"\n            height=\"461\"\n          >\n            <path\n              id=\"Union\"\n              d=\"M 568 0L 0 0L 0 220.276L 118.531 236.575C 2.85754 265.57 -60.9319 314.699 83.1118 356.271C 194.018 388.279 203.253 418.234 209.298 437.839C 213.724 452.194 216.439 461 256.102 461C 349.935 461 510.473 382.725 510.473 299.014C 510.473 296.07 510.365 293.208 510.148 290.428L 543.392 295L 568 0Z\"\n              fill=\"#C4C4C4\"\n            />\n          </mask>\n          <g mask=\"url(#mask1)\">\n            <path\n              id=\"Ellipse 2.2\"\n              d=\"M 510.473 89.5016C 510.473 173.212 349.934 251.487 256.102 251.487C 162.269 251.487 275.224 202.203 83.1118 146.758C -109 91.3135 68.5761 22.4266 245.874 5.79096C 423.171 -10.8447 510.473 5.79096 510.473 89.5016Z\"\n              transform=\"translate(3.43323e-05 209.513)\"\n              fill=\"white\"\n            />\n            <g id=\"girl\">\n              <g id=\"ice cream\">\n                <path\n                  id=\"Vector\"\n                  d=\"M 0 26.9149L 41.9705 229.528C 42.3459 231.258 44.7485 231.258 45.199 229.604L 95.7288 13.3071L 34.3122 3.67096e-05L 6.60716 18.3442L 0 26.9149Z\"\n                  transform=\"translate(397.236 144.235)\"\n                  fill=\"#EAA736\"\n                />\n                <path\n                  id=\"Union_2\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 25.6326 0.810165C 25.5277 0.267928 25.0031 -0.0865638 24.4609 0.0184166C 23.9186 0.123153 23.5641 0.647811 23.669 1.19005L 26.3259 14.9274L 0.453517 31.8143C -0.00894612 32.1161 -0.139165 32.7357 0.162715 33.1981C 0.464565 33.6608 1.08419 33.7909 1.54669 33.4891L 26.736 17.048L 29.9866 33.8546L 22.604 38.6546C 22.141 38.9557 22.0097 39.5751 22.3108 40.0379C 22.6118 40.5011 23.2312 40.6324 23.6942 40.3314L 30.3964 35.9737L 33.5783 52.4252L 15.9214 63.9159C 15.4585 64.2169 15.3274 64.8365 15.6287 65.2994C 15.9299 65.7623 16.5493 65.8934 17.0123 65.5921L 33.9882 54.5448L 35.6069 62.9139C 35.7118 63.4562 36.2364 63.8107 36.7786 63.7057C 37.3209 63.6009 37.6754 63.0763 37.5706 62.534L 35.7976 53.3673L 55.8293 40.3312C 56.2922 40.0299 56.4233 39.4105 56.122 38.9476C 55.8208 38.4847 55.2013 38.3536 54.7384 38.6549L 35.3877 51.2477L 32.206 34.7972L 66.9412 12.2135C 67.4042 11.9125 67.5355 11.2931 67.2344 10.8299C 66.9334 10.367 66.314 10.2357 65.851 10.5367L 31.7961 32.6781L 28.5448 15.8673L 40.3638 8.15294C 40.8263 7.85094 40.9565 7.23131 40.6546 6.7689C 40.3527 6.3065 39.7331 6.17613 39.2707 6.47813L 28.1346 13.7467L 25.6326 0.810165Z\"\n                  transform=\"translate(394.96 190.223)\"\n                  fill=\"#F6F7F8\"\n                />\n                <g id=\"Group\">\n                  <path\n                    id=\"Vector_2\"\n                    d=\"M 125.766 89.9764C 124.865 88.3976 123.664 87.1946 122.312 86.2925C 122.162 86.1421 122.012 85.9918 121.711 85.8414C 121.711 85.8414 121.636 85.8414 121.636 85.7662C 121.186 85.4655 120.735 85.24 120.21 85.0144C 117.131 83.1349 118.708 81.9319 120.21 76.8948C 120.81 75.0153 121.336 73.0605 121.786 71.0306C 128.619 39.3793 108.572 8.17911 76.9628 1.33761C 45.3535 -5.50388 14.1947 14.5695 7.36232 46.2208C 4.95971 57.4228 5.93579 68.5496 9.5397 78.5488C 9.84003 79.6765 10.2905 80.5787 10.6659 81.4057L 10.6659 81.4808C 11.7171 83.7363 12.0925 84.864 7.51249 87.7961C 3.60826 89.9763 -0.145813 93.3595 0.00434953 98.0207C 0.154512 103.734 6.08595 106.516 11.0413 105.539C 12.7682 105.238 14.1947 104.562 15.7715 103.81C 15.8465 103.735 15.9216 103.734 16.0718 103.659C 15.0207 104.186 16.1469 108.696 16.4472 109.599C 18.2492 115.087 24.6311 115.989 28.9107 112.756C 32.6648 109.899 33.2654 105.238 36.1936 101.855C 37.9205 99.825 39.5723 99.7499 40.1729 102.532C 41.2991 107.569 43.4014 112.08 47.5309 115.237C 56.6157 122.154 68.5537 118.169 72.0825 107.494C 72.3078 107.193 72.533 106.892 72.7583 106.441C 72.3829 107.343 73.5091 108.772 73.8094 109.599C 74.41 111.177 75.0858 112.681 75.9868 114.11C 79.4405 119.222 86.1978 119.673 90.2522 114.937C 91.6788 113.283 92.5047 111.253 93.0303 109.148C 93.4808 107.343 93.5558 105.238 94.8322 103.81C 97.0096 101.254 100.914 105.614 102.866 106.667C 110.749 110.877 122.988 111.403 126.442 101.329C 126.592 100.953 126.667 100.577 126.817 100.201C 127.643 96.893 127.568 92.9084 125.766 89.9764Z\"\n                    transform=\"translate(378.311 63.7314)\"\n                    fill=\"#FFF5E5\"\n                  />\n                </g>\n                <path\n                  id=\"Union_3\"\n                  fillRule=\"evenodd\"\n                  clipRule=\"evenodd\"\n                  d=\"M 194.741 11.0016C 205.076 7.8519 213.504 5.68173 219.461 4.66C 222.456 4.14609 224.718 3.94247 226.247 4.01352C 226.659 4.03256 226.982 4.0704 227.23 4.11532C 227.084 4.31943 226.881 4.56967 226.605 4.86728C 225.564 5.9874 223.813 7.42953 221.331 9.16586C 216.392 12.6195 208.907 16.9979 199.392 22.0074C 180.384 32.0157 153.491 44.4317 123.198 56.8578L 123.195 56.8592C 96.4293 67.8949 71.5534 77.0472 51.9432 83.3429C 50.8915 83.6805 50.3126 84.8067 50.6502 85.8585C 50.9879 86.9102 52.1142 87.4891 53.1659 87.1515C 72.898 80.8167 97.8757 71.6251 124.718 60.5577C 155.09 48.099 182.105 35.6305 201.256 25.5467C 210.822 20.5101 218.48 16.0406 223.623 12.4437C 226.181 10.6549 228.206 9.02109 229.536 7.58945C 230.196 6.87875 230.769 6.12875 231.127 5.35531C 231.482 4.58725 231.735 3.54086 231.299 2.46982L 231.297 2.46615C 230.86 1.39975 229.958 0.818694 229.153 0.508879C 228.349 0.199553 227.407 0.0630787 226.433 0.0179126C 224.47 -0.073396 221.871 0.188079 218.785 0.71762C 212.579 1.78207 203.962 4.00986 193.575 7.17538C 192.518 7.4974 191.923 8.61484 192.245 9.67148C 192.567 10.7281 193.685 11.3236 194.741 11.0016ZM 54.112 67.42C 55.1034 66.9332 55.5124 65.7347 55.0255 64.7433C 54.5386 63.7518 53.3401 63.3429 52.3487 63.8297C 38.5462 70.6082 27.2841 76.6976 19.6294 81.557C 15.8153 83.9784 12.8169 86.1441 10.8402 87.9784C 9.86077 88.8873 9.03796 89.8001 8.50765 90.6988C 8.00659 91.5477 7.52566 92.8072 8.0538 94.1153L 8.06017 94.1312L 8.06683 94.1468C 8.4511 95.054 9.17947 95.6046 9.8742 95.9268C 10.556 96.243 11.336 96.4046 12.1181 96.4859C 13.6862 96.6493 15.7149 96.5309 18.0769 96.2135C 22.8331 95.5746 29.4145 94.0601 37.3995 91.8351C 38.4635 91.5384 39.0857 90.4356 38.7892 89.3714C 38.4927 88.3075 37.3897 87.6854 36.3257 87.9818C 28.3935 90.1922 22.0233 91.6476 17.5444 92.2491C 15.289 92.5521 13.6292 92.6217 12.5319 92.5074C 12.3813 92.4918 12.2497 92.4735 12.1353 92.4539C 12.4169 92.0616 12.8748 91.5472 13.5611 90.9105C 15.2682 89.3263 18.0228 87.3148 21.7732 84.9339C 29.2474 80.1891 40.3596 74.1742 54.112 67.42ZM 202.997 54.3187C 203.345 53.2706 204.477 52.703 205.525 53.0509C 212.807 55.4688 218.621 57.7852 222.582 59.9051C 224.549 60.9581 226.17 62.0204 227.291 63.0951C 228.328 64.0907 229.404 65.555 229.088 67.327C 228.787 69.0338 227.361 70.016 226.118 70.5831C 224.786 71.1915 223.025 71.6226 220.979 71.9344C 216.86 72.5619 211.074 72.775 203.989 72.6239C 189.787 72.3209 170.015 70.544 147.115 67.4564C 146.021 67.3089 145.253 66.3018 145.4 65.2071C 145.548 64.1126 146.555 63.3448 147.65 63.4923C 170.475 66.5697 190.083 68.3263 204.074 68.6248C 211.085 68.7743 216.599 68.5553 220.377 67.9798C 222.28 67.69 223.618 67.3272 224.457 66.9442C 224.766 66.8033 224.952 66.6866 225.061 66.6051C 224.98 66.4767 224.823 66.2708 224.521 65.9813C 223.788 65.2777 222.537 64.4181 220.694 63.4317C 217.034 61.4727 211.474 59.2408 204.265 56.8473C 203.216 56.4991 202.649 55.367 202.997 54.3187ZM 4.81512 28.5059C 4.39309 28.1339 4.18868 27.8766 4.09054 27.7249C 4.15197 27.6798 4.23611 27.6244 4.34988 27.5599C 4.87933 27.2601 5.76653 26.9388 7.09725 26.6515C 9.73858 26.0811 13.6427 25.743 18.7054 25.6637C 28.7982 25.5059 43.1028 26.38 60.2246 28.2181C 61.3229 28.336 62.3088 27.5414 62.4267 26.443C 62.5446 25.3448 61.7499 24.359 60.6516 24.2411C 43.4612 22.3954 28.9722 21.5025 18.6428 21.6642C 13.4944 21.7447 9.28033 22.088 6.25298 22.7415C 4.74941 23.0663 3.41467 23.4928 2.37914 24.0789C 1.37142 24.6495 0.31048 25.5714 0.0554445 27.0084C 0.0555665 27.0077 0.0557191 27.0069 0.0558412 27.0062L 2.02468 27.3573L 0.0554445 27.0084C -0.284369 28.9242 1.00173 30.4764 2.16964 31.5062C 3.46234 32.6461 5.33746 33.7916 7.6322 34.9422C 12.2496 37.2577 19.0118 39.8114 27.4352 42.4859C 44.3092 47.8441 68.1486 53.7811 95.5558 59.315C 96.6386 59.5338 97.6935 58.8331 97.9121 57.7506C 98.1307 56.6678 97.4302 55.6129 96.3475 55.3941C 69.0204 49.8766 45.3332 43.9725 28.6458 38.6737C 20.2885 36.0199 13.7613 33.5411 9.42523 31.3665C 7.24322 30.2726 5.72558 29.3087 4.81512 28.5059ZM 11.8169 93.0155C 11.8164 93.0157 11.8176 93.0094 11.8218 92.9962C 11.8196 93.0086 11.8174 93.0152 11.8169 93.0155Z\"\n                  transform=\"translate(321.482 57.1838)\"\n                  fill=\"#1CD2F2\"\n                />\n                <g id=\"scoop\">\n                  <path\n                    id=\"Vector_3\"\n                    d=\"M 68.7746 38.7184C 64.9455 43.9059 62.0923 50.0707 57.2121 54.356C 51.2806 59.5436 41.7453 61.4231 35.2883 55.9348C 28.0804 49.77 30.1828 40.3724 35.7388 33.8316C 39.2676 29.6966 43.7725 26.4638 47.5265 22.5544C 48.4275 21.6522 49.3285 20.3742 48.878 19.1713C 48.2774 17.5925 46.0249 17.5924 44.3731 18.1939C 40.544 19.6975 37.6158 22.8551 34.162 25.1858C 30.7834 27.5164 26.1283 29.0952 22.5244 27.0653C 19.371 25.2609 18.0195 21.1259 18.6202 17.5172C 19.5962 11.6531 24.2513 8.1948 27.1795 3.38319C 27.7801 2.33066 28.2306 1.20294 28.5309 3.67096e-05C 13.5897 5.03718 2.62784 18.0435 -9.16521e-06 33.4557C 3.00325 33.5309 6.08158 34.3579 8.85959 35.7863C 14.5658 38.7936 20.3471 43.9811 22.074 50.4467C 23.951 57.7392 21.0979 65.3325 23.2002 72.7003C 23.5005 73.828 24.026 74.9558 24.6267 76.0083C 31.1588 76.7601 38.5919 76.0834 46.4754 75.1061C 69.9759 72.2492 88.7462 67.9639 84.842 35.4856C 84.6168 33.5309 84.2414 31.5762 83.7158 29.6966C 77.7844 29.4711 72.3785 33.8316 68.7746 38.7184Z\"\n                    transform=\"translate(392.206 2.14282)\"\n                    fill=\"#0059C2\"\n                  />\n                  <path\n                    id=\"Vector_4\"\n                    d=\"M 62.5365 24.5364C 54.8782 8.29721 37.3843 -2.00258 18.6139 0.328035C 18.3136 0.403217 17.9382 0.40318 17.6378 0.478361C 15.01 0.854268 12.5323 1.45574 10.0546 2.28273C 9.82935 3.48563 9.37887 4.61335 8.70313 5.66589C 5.77496 10.4775 1.11989 13.9358 0.143832 19.7999C -0.45682 23.4086 0.819574 27.5436 4.04808 29.348C 7.65198 31.3779 12.232 29.7991 15.6857 27.4685C 19.0644 25.1378 22.0676 21.9802 25.8968 20.4766C 27.4735 19.8751 29.801 19.8 30.4017 21.454C 30.8522 22.6569 29.9512 23.9349 29.0502 24.8371C 25.2961 28.7465 20.7913 31.9793 17.2624 36.1143C 11.7815 42.5799 9.6041 52.0528 16.8119 58.2176C 23.1938 63.7059 32.8043 61.8262 38.7357 56.6387C 43.616 52.3534 46.394 46.2638 50.2983 41.0011C 53.9022 36.1143 59.3831 31.7538 65.3146 31.9793C 64.5637 29.348 63.6628 26.867 62.5365 24.5364Z\"\n                    transform=\"translate(410.682 -0.0651855)\"\n                    fill=\"#00D5BD\"\n                  />\n                  <path\n                    id=\"Vector_5\"\n                    d=\"M 23.8008 39.2446C 21.6985 31.8769 24.5516 24.2836 22.6746 16.991C 21.0228 10.5254 15.2415 5.33789 9.46027 2.33064C 6.60718 0.827012 3.60393 0.075218 0.60067 3.67096e-05C 0.150181 2.48102 -1.83304e-05 5.03716 -1.83304e-05 7.59333C -1.83304e-05 9.17213 0.150163 10.8261 0.300326 12.4049C 2.25244 28.6441 8.10879 36.6133 16.2927 40.222C 18.9956 41.4249 21.9988 42.1016 25.1523 42.4775C 24.6267 41.4249 24.1011 40.3723 23.8008 39.2446Z\"\n                    transform=\"translate(391.68 35.5981)\"\n                    fill=\"#00D5BD\"\n                  />\n                </g>\n                <path\n                  id=\"Vector_6\"\n                  d=\"M 15.2282 7.48011L 13.2761 7.1042C 12.0748 6.87866 11.324 5.7509 11.4741 4.62318L 11.7745 2.66849C 11.9997 1.46559 11.1738 0.262689 9.97252 0.0371449C 8.77122 -0.188399 7.56992 0.638614 7.34467 1.84151L 7.04433 3.79621C 6.81908 4.99911 5.69287 5.75094 4.56665 5.60058L 2.76472 5.29983C 1.56342 5.07429 0.362088 5.82607 0.0617623 6.95379C -0.238563 8.23187 0.587351 9.43475 1.86374 9.66029L 3.81583 9.96104C 5.01714 10.1866 5.76797 11.3143 5.61781 12.4421L 4.56665 18.5317C 4.3414 19.7346 5.16732 20.9375 6.36862 21.1631C 7.56992 21.3886 8.77123 20.5616 8.99647 19.3587L 10.0476 13.269C 10.2728 12.0661 11.3991 11.3143 12.5253 11.4647L 14.4774 11.7654C 15.979 11.991 17.3305 10.7881 17.1053 9.13406C 16.88 8.38225 16.1292 7.70565 15.2282 7.48011Z\"\n                  transform=\"translate(496.883 28.4937)\"\n                  fill=\"#171A21\"\n                />\n                <path\n                  id=\"Vector_7\"\n                  d=\"M 3.68381 7.35812C 5.71832 7.35812 7.36764 5.71093 7.36764 3.67904C 7.36764 1.64715 5.71832 -3.66616e-05 3.68381 -3.66616e-05C 1.6493 -3.66616e-05 -1.83545e-05 1.64715 -1.83545e-05 3.67904C -1.83545e-05 5.71093 1.6493 7.35812 3.68381 7.35812Z\"\n                  transform=\"matrix(0.120442 -0.992719 0.992681 0.120758 533.127 17.1709)\"\n                  fill=\"#171A21\"\n                />\n                <path\n                  id=\"Vector_8\"\n                  d=\"M 15.2282 7.48007L 13.2761 7.10417C 12.0748 6.87862 11.324 5.75087 11.4741 4.62315L 11.7745 2.66845C 11.9997 1.46555 11.1738 0.262652 9.9725 0.0371082C 8.7712 -0.188436 7.5699 0.638577 7.34465 1.84148L 7.04435 3.79617C 6.81911 4.99907 5.6929 5.7509 4.56668 5.60054L 2.7647 5.2998C 1.5634 5.07425 0.362116 5.82612 0.0617898 6.95384C -0.238536 8.23192 0.587332 9.4348 1.86372 9.66035L 3.81586 9.96109C 5.01716 10.1866 5.76795 11.3143 5.61779 12.442L 5.31749 14.3967C 5.09225 15.5996 5.91811 16.8025 7.11942 17.0281C 8.32072 17.2536 9.52202 16.4267 9.74727 15.2238L 10.0476 13.269C 10.2729 12.0661 11.3991 11.3144 12.5253 11.4647L 14.4774 11.7654C 15.979 11.9909 17.3305 10.788 17.1052 9.13402C 16.88 8.38221 16.1292 7.63044 15.2282 7.48007Z\"\n                  transform=\"translate(523.612 175.624)\"\n                  fill=\"#171A21\"\n                />\n              </g>\n              <g id=\"body\">\n                <path\n                  id=\"Vector_9\"\n                  d=\"M 255.066 0.216118C 248.909 -2.1145 245.381 14.5757 215.648 42.0169C 196.728 59.459 169.398 70.2099 164.293 72.1646C 154.757 75.8485 143.045 74.9463 152.505 57.8801C 163.166 38.8593 161.815 22.8457 133.96 54.2715C 106.105 85.6973 102.801 127.047 108.132 156.593C 113.838 187.718 132.984 214.708 131.332 222.828C 129.155 233.428 112.411 229.068 93.1155 205.16C 76.8979 185.012 68.714 158.849 31.5486 142.835C 19.3855 148.398 2.64231 160.352 0.2397 183.809C -2.38815 209.596 17.2081 223.129 28.8457 228.842C 48.517 204.333 60.1547 229.669 75.3211 245.533C 105.954 277.56 147.474 305.302 170.825 294.25C 193.349 283.574 192.824 257.562 176.906 206.438C 165.644 170.351 169.774 155.691 183.138 143.361C 196.878 130.656 234.118 122.461 238.773 113.89C 243.428 105.32 233.368 100.734 233.368 98.5533C 233.368 96.2978 241.852 91.1103 242.227 87.1257C 242.603 83.1411 236.446 81.036 236.446 78.2543C 236.446 75.4726 246.882 69.834 244.93 63.9699C 242.978 58.1809 236.821 60.8875 234.118 58.7072C 231.415 56.5269 238.173 52.1664 246.807 37.9571C 258.445 19.2369 261.298 2.54674 255.066 0.216118Z\"\n                  transform=\"translate(247.735 196.044)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_10\"\n                  d=\"M 194.159 54.2716C 196.562 30.8902 213.305 18.8612 225.468 13.2978C 220.437 11.1175 214.957 9.1628 208.8 7.28327C 192.732 2.47167 132.217 -12.339 81.687 22.3195C 31.1571 56.9781 -3.60556 121.935 0.298673 130.731C 4.20291 139.527 198.589 167.269 209.1 136.821C 209.1 136.821 212.554 117.8 222.765 99.3052C 211.127 93.5914 191.531 80.0588 194.159 54.2716Z\"\n                  transform=\"translate(53.9656 325.581)\"\n                  fill=\"#171A21\"\n                />\n                <path\n                  id=\"Vector_11\"\n                  d=\"M 38.2915 -1.83548e-05C 34.6125 4.05977 11.3373 24.2084 -1.83304e-05 28.7193\"\n                  transform=\"translate(450.244 245.955)\"\n                  stroke=\"#F6F7F8\"\n                  strokeWidth=\"2\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n              </g>\n              <g id=\"head\">\n                <path\n                  id=\"Vector_12\"\n                  d=\"M -4.58261e-06 15.3862C 6.60716 11.7023 12.1632 6.4396 16.2176 0.124372C 13.2143 -0.477078 4.35472 0.575496 -4.58261e-06 15.3862Z\"\n                  transform=\"translate(289.795 294.624)\"\n                  fill=\"#171A21\"\n                />\n                <path\n                  id=\"Vector_13\"\n                  d=\"M 77.2777 -1.83548e-05C 66.3158 22.4792 40.8632 22.6296 25.922 20.5245L 25.922 20.2238L 19.1646 19.2464C 16.3115 18.6449 14.5847 18.1187 14.5847 18.0435C 14.5847 18.1939 14.5096 18.4195 14.5096 18.5698L 11.5063 18.1187C 5.9503 17.3668 0.844753 21.2011 0.0939387 26.7645C -0.656876 32.3279 3.17228 37.4403 8.7283 38.1921L 15.861 39.1694C 15.9361 39.4701 16.0112 39.7709 16.0863 40.0716C 17.3627 39.9213 18.7892 39.8461 20.3659 39.8461L 23.219 40.222L 23.2941 39.8461C 30.2767 40.222 38.3855 42.4022 42.7402 49.9204C 46.7946 56.7619 46.269 64.6559 45.1428 69.9186C 52.0503 72.3244 59.5584 73.1514 67.2918 72.0237C 73.0731 71.1967 78.4039 69.3171 83.2091 66.6106C 87.6389 51.7999 96.4234 50.7474 99.4267 51.3488C 103.781 44.6577 106.484 36.7637 106.935 28.4937C 89.2907 23.1558 80.9567 9.32246 77.2777 -1.83548e-05Z\"\n                  transform=\"translate(206.661 243.324)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_14\"\n                  d=\"M -6.10352e-06 5.11236C -6.10352e-06 2.63138 -6.10352e-06 1.2029 -6.10352e-06 0\"\n                  transform=\"translate(284.914 255.654)\"\n                  stroke=\"white\"\n                  strokeWidth=\"2\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n                <path\n                  id=\"Vector_15\"\n                  d=\"M -1.2207e-05 1.57883C -1.2207e-05 1.05256 -1.2207e-05 0.526306 -1.2207e-05 3.67096e-05\"\n                  transform=\"translate(284.839 279.185)\"\n                  stroke=\"white\"\n                  strokeWidth=\"2\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n                <path\n                  id=\"Vector_16\"\n                  d=\"M -4.58261e-06 10.5254C 5.2557 11.3524 11.5625 11.202 12.3133 10.8261C 12.4635 10.7509 12.5386 6.91666 12.6137 -1.83548e-05\"\n                  transform=\"translate(272.15 285.426)\"\n                  stroke=\"white\"\n                  strokeWidth=\"2\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n                <path\n                  id=\"Vector_17\"\n                  d=\"M 26.5788 10.1021C 20.4972 -0.197719 7.43307 -0.498426 4.58261e-06 0.253387C 4.50489 14.4626 15.4668 25.364 28.9814 30.1004C 30.1077 24.7625 30.6332 16.9436 26.5788 10.1021Z\"\n                  transform=\"translate(222.747 283.292)\"\n                  fill=\"#171A21\"\n                />\n                <g id=\"hair\">\n                  <path\n                    id=\"Vector_18\"\n                    d=\"M 5.83982 25.9691C -0.166694 23.9392 -3.54536 13.1883 5.83982 4.76799C 13.348 -1.92315 27.0128 -1.24652 32.5688 4.76799C 37.1488 9.72995 36.3229 16.797 32.5688 20.932C 28.8147 25.0669 5.83982 25.9691 5.83982 25.9691Z\"\n                    transform=\"translate(237.404 205.401)\"\n                    fill=\"#171A21\"\n                  />\n                  <path\n                    id=\"Vector_19\"\n                    d=\"M 91.7495 39.7255C 89.4971 24.3134 79.8867 11.8334 67.1228 5.2174C 58.7137 0.856885 48.9531 -0.947503 38.9673 0.480942C 18.6202 3.48819 3.30359 19.3514 9.16522e-06 38.5978C 0.375416 38.673 46.7757 53.1078 62.693 20.4791C 66.372 29.8016 74.706 43.7101 92.2751 49.1232C 92.3502 46.0408 92.2 42.8831 91.7495 39.7255Z\"\n                    transform=\"translate(221.32 222.845)\"\n                    fill=\"#828C99\"\n                  />\n                  <g id=\"Group 2\">\n                    <path\n                      id=\"Union_4\"\n                      fillRule=\"evenodd\"\n                      clipRule=\"evenodd\"\n                      d=\"M 112.11 127.533C 110.201 125.786 107.759 124.054 105.453 122.419C 102.498 120.324 99.7668 118.387 98.6702 116.782C 96.8232 114.074 98.0479 111.191 99.2381 108.39C 99.4026 108.003 99.5664 107.617 99.7214 107.234C 101.598 102.648 102.124 97.4603 99.7965 92.9495C 96.9434 87.4612 90.7116 85.5816 84.9303 86.8597C 82.7967 87.3306 80.9243 88.4991 79.0783 89.6509C 77.0917 90.8907 75.1356 92.1114 72.9173 92.4231C 64.9587 93.4756 60.9794 83.4014 61.0545 77.1614C 61.1111 68.7708 64.7539 60.9791 68.3129 53.3665L 68.3148 53.3624C 69.4749 50.8809 70.6259 48.4185 71.6409 45.961C 75.8455 35.8868 78.3983 24.1585 74.494 13.5579C 72.3167 7.6187 67.6616 1.90483 61.2046 0.40117C 53.6964 -1.32783 47.0142 2.65679 44.6867 9.94927C 42.534 16.6404 42.7655 23.5728 42.9969 30.5064C 43.153 35.1807 43.309 39.8558 42.7346 44.4576C 42.5093 46.1866 42.1339 48.0662 40.8575 49.4195C 40.0316 50.2466 38.8303 50.5472 38.3798 49.1939C 38.2904 48.9251 38.2023 48.6575 38.1146 48.3912L 38.1086 48.3726C 36.5795 43.7247 35.1816 39.4751 29.295 37.8416C 22.2373 35.8868 15.4049 39.7962 11.6508 45.5853C 8.12202 50.9231 6.24499 57.99 5.49418 64.2303C 4.66828 70.9964 5.94465 77.4622 8.64759 83.7022C 14.2787 96.4078 25.9163 104.753 38.0044 110.767C 40.6323 112.045 46.2634 115.278 43.4103 123.398C 43.1851 124.075 42.9598 124.751 42.7346 125.353C 38.4549 136.48 35.9772 148.96 40.4071 160.462C 45.2873 173.318 56.3243 184.069 69.4636 188.204C 92.889 195.421 121.72 177.077 121.72 151.892C 121.645 142.268 118.492 133.322 112.11 127.533ZM 24.9562 28.7811C 31.2467 26.0867 34.1647 18.7962 31.4738 12.4971C 28.7828 6.19829 21.5019 3.27641 15.2115 5.97099C 8.92098 8.66557 6.00297 15.9561 8.6939 22.2549C 11.3848 28.5538 18.6657 31.4756 24.9562 28.7811ZM 2.71626 109.489C 10.5247 102.122 24.8653 109.715 29.0698 119.564C 29.8207 121.293 30.2711 123.022 30.4964 124.676C 31.3223 131.517 28.6193 139.787 22.9132 143.998C 19.6847 146.328 15.1047 146.479 11.8762 143.922C 9.32343 141.968 8.04705 139.111 7.37131 136.028C 7.32214 135.802 7.2781 135.544 7.22808 135.252C 6.89632 133.311 6.30111 129.83 2.19068 123.623C -0.28701 119.864 -1.33814 113.324 2.71626 109.489Z\"\n                      transform=\"translate(150.881 10.6125)\"\n                      fill=\"#FFCCE5\"\n                    />\n                    <path\n                      id=\"Union_5\"\n                      fillRule=\"evenodd\"\n                      clipRule=\"evenodd\"\n                      d=\"M 15.4733 20.2219L 15.8853 17.3347C 16.2607 14.7785 15.8853 12.1472 14.759 9.89182L 11.8309 3.57663C 10.4043 0.49411 6.72532 -0.858917 3.57191 0.569305C 0.493555 1.99777 -0.8579 5.68185 0.568644 8.83932L 3.49681 15.1545C 4.62303 17.4851 6.34992 19.4399 8.52729 20.7932L 10.9123 22.2715L 13.4791 27.7927L 8.3693 30.1821C 7.11857 30.7668 6.57881 32.2549 7.16368 33.5056C 7.74851 34.7563 9.23655 35.2961 10.4873 34.7112L 15.587 32.3264L 23.1193 48.5278L 10.5492 54.3894C 9.29786 54.9729 8.75645 56.4602 9.33998 57.7116C 9.92347 58.9629 11.4109 59.5044 12.6623 58.9209L 25.2273 53.0617L 33.3648 70.5649C 33.9469 71.8171 35.4338 72.3601 36.6858 71.778C 37.9378 71.196 38.4809 69.7092 37.8988 68.457L 29.7588 50.9487L 43.2955 44.6364C 44.5469 44.0529 45.0883 42.5654 44.5048 41.3139C 43.9212 40.0627 42.4338 39.5212 41.1824 40.1047L 27.6509 46.4148L 20.1163 30.2085L 25.2783 27.7946C 26.5291 27.2097 27.0688 25.7216 26.484 24.4709C 25.8991 23.2202 24.4111 22.6804 23.1603 23.2654L 18.0084 25.6745L 15.4733 20.2219Z\"\n                      transform=\"translate(207.537 118.104)\"\n                      fill=\"#E2197A\"\n                    />\n                    <path\n                      id=\"Vector_20\"\n                      d=\"M 113.455 0.0657907C 119.912 14.0495 98.8895 46.8285 70.8841 59.9101C 41.5273 73.5931 6.23901 67.0523 0.00725469 52.9183C -1.04389 50.5876 112.479 -2.11447 113.455 0.0657907Z\"\n                      transform=\"translate(182.496 152.665)\"\n                      fill=\"#828C99\"\n                    />\n                    <path\n                      id=\"Vector_21\"\n                      d=\"M 3.679 7.36778C 5.71085 7.36778 7.35798 5.71843 7.35798 3.68388C 7.35798 1.64933 5.71085 -1.83548e-05 3.679 -1.83548e-05C 1.64714 -1.83548e-05 9.16521e-06 1.64933 9.16521e-06 3.68388C 9.16521e-06 5.71843 1.64714 7.36778 3.679 7.36778Z\"\n                      transform=\"translate(285.14 131.68)\"\n                      fill=\"#171A21\"\n                    />\n                  </g>\n                </g>\n                <g id=\"glasses\">\n                  <path\n                    id=\"Vector_22\"\n                    d=\"M 17.1936 34.433C 26.6894 34.433 34.3873 26.725 34.3873 17.2166C 34.3873 7.70813 26.6894 1.83548e-05 17.1936 1.83548e-05C 7.69785 1.83548e-05 0 7.70813 0 17.2166C 0 26.725 7.69785 34.433 17.1936 34.433Z\"\n                    transform=\"translate(248.2 251.068)\"\n                    fill=\"white\"\n                  />\n                  <path\n                    id=\"Vector_23\"\n                    d=\"M 4.58261e-06 0.534926C 0.450493 0.459745 10.5865 -2.09642 16.4428 4.6699\"\n                    transform=\"translate(277.932 269.779)\"\n                    stroke=\"white\"\n                    strokeWidth=\"7\"\n                    strokeMiterlimit=\"10\"\n                  />\n                  <g id=\"Group_2\">\n                    <path\n                      id=\"Vector_24\"\n                      d=\"M 2.32752 3.67096e-05C 3.00325 2.18029 3.52882 4.43573 3.82914 6.76635C 4.27963 9.92397 4.4298 13.0816 4.27964 16.164C 3.97931 22.1785 2.4777 27.8923 9.16521e-06 33.2301C 7.95864 31.7265 13.9651 24.7346 13.9651 16.3143C 14.0402 8.72103 9.15993 2.25548 2.32752 3.67096e-05Z\"\n                      transform=\"translate(309.166 255.88)\"\n                      fill=\"#E5F0FF\"\n                    />\n                    <path\n                      id=\"Vector_25\"\n                      d=\"M 17.1936 9.17208C 12.3884 6.61592 8.40913 3.45834 5.25571 0C 2.0272 3.15761 4.58261e-06 7.51813 4.58261e-06 12.4049C 4.58261e-06 20.5997 5.70618 27.366 13.2894 29.1704C 17.7943 22.0282 18.2448 15.0362 17.1936 9.17208Z\"\n                      transform=\"translate(288.819 259.788)\"\n                      fill=\"white\"\n                    />\n                    <path\n                      id=\"Vector_26\"\n                      d=\"M 3.90423 -3.67096e-05C 4.95538 5.8641 4.50488 12.856 -9.16522e-06 19.923C 1.27638 20.2237 2.55277 20.3742 3.90423 20.3742C 5.03046 20.3742 6.08159 20.299 7.13273 20.0734C 9.61042 14.8107 11.037 9.02172 11.4124 3.00721C 8.70945 2.2554 6.23176 1.20286 3.90423 -3.67096e-05Z\"\n                      transform=\"translate(302.108 268.961)\"\n                      fill=\"#E5F0FF\"\n                    />\n                    <path\n                      id=\"Vector_27\"\n                      d=\"M 12.8727 17.0662C 13.0229 13.9838 12.8727 10.8262 12.4222 7.66855C 12.0468 5.33793 11.5963 3.08249 10.9206 0.90223C 9.1937 0.30078 7.31667 0 5.43963 0C 3.5626 0 1.72687 0.286968 0 0.813237C 1.65179 3.3694 4.27682 8.06341 5.32796 13.9276C 7.5804 15.1305 10.1698 16.2392 12.8727 17.0662Z\"\n                      transform=\"translate(300.648 254.977)\"\n                      fill=\"#E5F0FF\"\n                    />\n                    <path\n                      id=\"Vector_28\"\n                      d=\"M 11.9379 13.1567C 10.8868 7.29255 8.25895 2.55613 6.60716 -3.67096e-05C 4.12947 0.826957 1.80196 2.18026 4.58261e-06 3.98461C 3.22851 7.44295 7.13274 10.6757 11.9379 13.1567Z\"\n                      transform=\"translate(294.074 255.804)\"\n                      fill=\"white\"\n                    />\n                  </g>\n                </g>\n              </g>\n              <g id=\"jetpack\">\n                <g id=\"Group 2_2\">\n                  <path\n                    id=\"Vector_29\"\n                    d=\"M 44.9424 7.6365C 42.1644 11.0197 39.3113 14.478 36.6083 18.0116C 28.3494 14.7036 19.6399 13.5007 10.6301 14.6284L 1.16987 36.1302C 4.02297 35.5288 11.9065 34.6267 21.2166 39.2879C 8.30262 58.2336 -0.707164 74.3224 0.0436507 75.0742C 17.2373 94.7717 50.6486 87.7798 52.0751 85.6747C 53.5017 83.5696 85.0359 33.3485 86.0119 19.6655C 87.5135 -2.13707 55.7541 -5.29468 44.9424 7.6365Z\"\n                    transform=\"translate(146.721 309.064)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <path\n                    id=\"Vector_30\"\n                    d=\"M 0.0275748 61.0241C -0.873403 59.8964 20.4497 28.6962 42.6738 5.54033C 52.8098 -4.98505 79.9142 -0.398993 77.2864 18.3211C 75.7097 30.0494 45.602 71.324 44.2505 73.1283C 42.8991 74.9327 13.6924 78.9925 0.0275748 61.0241Z\"\n                    transform=\"translate(85.9962 302.364)\"\n                    fill=\"#A3AFBF\"\n                  />\n                </g>\n              </g>\n              <g id=\"Group 2_3\">\n                <path\n                  id=\"Vector_31\"\n                  d=\"M 9.16521e-06 6.71184C 0.300335 2.72724 3.82916 -0.280034 7.80847 0.0206916C 11.7878 0.321417 14.791 3.85496 14.4907 7.83956\"\n                  transform=\"translate(258.11 261.046)\"\n                  stroke=\"#2B01B3\"\n                  strokeWidth=\"3\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n                <path\n                  id=\"Vector_32\"\n                  d=\"M 0 6.71186C 0.300326 2.72725 3.82915 -0.280015 7.80847 0.0207099C 11.7878 0.321435 14.791 3.85497 14.4907 7.83958\"\n                  transform=\"translate(299.255 264.354)\"\n                  stroke=\"#2B01B3\"\n                  strokeWidth=\"3\"\n                  strokeMiterlimit=\"10\"\n                  strokeLinecap=\"round\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </InlineSvg>\n  </SvgWrapper>\n);\n\nexport const Impact = () => (\n  <SvgWrapper>\n    <InlineSvg\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      strokeLinejoin=\"round\"\n      strokeMiterlimit=\"1.414\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-labelledby=\"title\"\n      viewBox=\"0 0 456 569\"\n      preserveAspectRatio=\"xMidYMid meet\"\n      fit\n      id={'impact'}\n    >\n      <title id=\"title\">{'impact'}</title>\n      <g id=\"Canvas\" fill=\"none\">\n        <g id=\"impact\">\n          <mask\n            id=\"mask2\"\n            mask-type=\"alpha\"\n            maskUnits=\"userSpaceOnUse\"\n            x=\"0\"\n            y=\"0\"\n            width=\"456\"\n            height=\"569\"\n          >\n            <path\n              id=\"Union\"\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M 344 0L 0 0L 0 438L 45.7853 438C 53.3735 477.466 93.7747 515.632 163.485 496.975C 201.986 486.671 216.592 512.573 229.88 536.134C 250.51 572.717 267.959 603.658 366.727 484.668C 518.935 301.297 452.872 154.695 344 231.899L 344 0Z\"\n              fill=\"#C4C4C4\"\n            />\n          </mask>\n          <g mask=\"url(#mask2)\">\n            <path\n              id=\"Ellipse 2.3\"\n              d=\"M 81.0725 217.639C -20.6664 217.639 -14.4152 137.44 33.1069 112.783C 80.6289 88.1263 150.609 100.229 297.718 20.3694C 444.827 -59.4898 488.083 111.303 280.563 258.296C 73.0424 405.288 182.811 217.639 81.0725 217.639Z\"\n              transform=\"matrix(0.966001 -0.258538 0.2591 0.96585 28.7787 307.729)\"\n              fill=\"#F0F8FF\"\n            />\n            <g id=\"Group 11\">\n              <g id=\"Group 10\">\n                <g id=\"Group 9\">\n                  <path\n                    id=\"Vector\"\n                    d=\"M 60.6258 121.11C 94.1084 121.11 121.252 93.9989 121.252 60.5552C 121.252 27.1115 94.1084 0 60.6258 0C 27.1431 0 6.38534e-06 27.1115 6.38534e-06 60.5552C 6.38534e-06 93.9989 27.1431 121.11 60.6258 121.11Z\"\n                    transform=\"translate(0.212708 126.763)\"\n                    fill=\"#E2197A\"\n                  />\n                  <path\n                    id=\"Vector_2\"\n                    d=\"M 9.41556 18.8092C 14.6156 18.8092 18.8311 14.5986 18.8311 9.40461C 18.8311 4.21059 14.6156 0 9.41556 0C 4.21549 0 -6.38534e-06 4.21059 -6.38534e-06 9.40461C -6.38534e-06 14.5986 4.21549 18.8092 9.41556 18.8092Z\"\n                    transform=\"translate(29.0349 264.75)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_3\"\n                    d=\"M 2.56314 5.12028C 3.97871 5.12028 5.12625 3.97407 5.12625 2.56014C 5.12625 1.14621 3.97871 0 2.56314 0C 1.14756 0 0 1.14621 0 2.56014C 0 3.97407 1.14756 5.12028 2.56314 5.12028Z\"\n                    transform=\"translate(59.7402 279.118)\"\n                    fill=\"#A3AFBF\"\n                  />\n                  <g id=\"Group 8\">\n                    <path\n                      id=\"Union_2\"\n                      fillRule=\"evenodd\"\n                      clipRule=\"evenodd\"\n                      d=\"M 25.0704 3.35889C 30.9812 9.41968 31.7658 17.5703 31.2428 25.8254C 30.9289 31.1023 29.8304 60.5701 29.6735 70.2361C 25.8027 69.2432 22.0888 67.8848 18.5841 66.2129C 18.4806 63.8811 18.4007 61.3684 18.3196 58.8152C 17.95 47.1804 17.5538 34.7075 14.7655 34.7075C 13.575 34.7075 13.6285 36.5217 13.6906 38.6248C 13.7185 39.5708 13.7482 40.5757 13.667 41.4998C 13.5101 43.6941 12.8824 45.0002 11.8362 45.8362C 9.1685 47.9263 5.34995 47.2471 3.41453 44.6345C 2.62992 43.5374 2.05454 42.2312 1.7407 40.8728C 0.432963 35.1777 0.0145057 29.7961 0.0145057 24.5193L 0.00998909 23.8704C -0.0464074 16.0398 -0.10256 8.2356 7.02384 3.20215C 12.307 -0.559815 20.1533 -1.60474 25.0704 3.35889ZM 74.6536 44.9683C 74.8171 49.5706 74.9776 54.0864 76.0711 58.6895L 76.1174 58.8674C 76.4221 60.042 76.7995 61.4966 77.745 62.2422C 77.7973 62.3467 77.9019 62.3989 78.0065 62.4512C 73.0895 65.5862 67.7017 68.0417 62 69.7136C 62.7751 64.7004 62.4305 59.6094 62.0868 54.532C 61.9434 52.4126 61.8002 50.2954 61.7385 48.1875L 61.7182 47.5559L 61.717 47.5183C 61.5425 42.2163 61.2458 33.2012 67.9632 32.1997C 72.671 31.4683 74.2403 36.6409 74.4495 40.2458C 74.5423 41.8345 74.5981 43.4065 74.6536 44.9683ZM 78.6865 15.01C 74.6064 15.01 71.1017 18.5105 71.1017 22.5859C 71.1017 26.7136 74.5541 30.1619 78.6865 30.1619C 82.7666 30.1619 86.2713 26.6614 86.2713 22.5859C 86.2713 18.4583 82.8189 15.01 78.6865 15.01ZM 88.6774 41.0818C 88.6774 43.8518 86.4291 46.0974 83.6558 46.0974C 80.8824 46.0974 78.6341 43.8518 78.6341 41.0818C 78.6341 38.3115 80.8824 36.0659 83.6558 36.0659C 86.4291 36.0659 88.6774 38.3115 88.6774 41.0818Z\"\n                      transform=\"translate(15.2111 176.123)\"\n                      fill=\"#C21F3A\"\n                    />\n                    <path\n                      id=\"Vector_4\"\n                      d=\"M 20.3481 71.3183C 18.6219 66.0412 16.948 60.5552 15.3264 54.9124C 13.8618 49.8967 1.2554 4.8068 -6.38534e-06 -1.59448e-06\"\n                      transform=\"translate(38.4504 148.603)\"\n                      stroke=\"#16171A\"\n                      strokeWidth=\"4\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_5\"\n                      d=\"M 26.7821 24.3475C 28.5082 37.8797 28.1421 46.5528 25.1605 47.3888C 20.3481 48.7994 10.1479 28.9975 0 1.59448e-06\"\n                      transform=\"translate(62.6171 231.207)\"\n                      stroke=\"#16171A\"\n                      strokeWidth=\"4\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                  </g>\n                </g>\n                <g id=\"Group 7\">\n                  <path\n                    id=\"Union_3\"\n                    fillRule=\"evenodd\"\n                    clipRule=\"evenodd\"\n                    d=\"M 120.959 38.0745C 114.427 44.7154 107.887 51.3645 107.639 58.3819C 107.514 61.8001 109.845 65.1475 112.275 68.6382C 115.763 73.6473 119.456 78.9517 116.393 85.1841C 113.521 91.0259 109.308 93 105.069 94.9869C 101.633 96.597 98.1795 98.2154 95.4077 101.907C 93.784 104.065 92.5729 106.456 91.4872 108.6C 89.4037 112.713 87.7817 115.916 84.5902 114.812C 81.0228 113.603 81.4692 109.495 81.9068 105.469C 82.2851 101.988 82.6567 98.5682 80.4238 97.1343C 73.4287 92.6673 65.4399 99.3487 63.5669 108.245C 62.9942 110.965 62.5145 113.913 62.038 116.841C 60.9562 123.489 59.8915 130.033 57.795 133.558C 52.8641 143.714 42.4671 150.739 30.3883 150.739C 13.6078 150.739 0 137.147 0 120.386C 0 118.095 0.267578 115.881 0.726257 113.742C 0.764465 113.609 0.793152 113.475 0.821838 113.341C 0.850525 113.208 0.87915 113.074 0.917358 112.941L 1.03204 112.483C 1.07025 112.349 1.10852 112.206 1.14673 112.063C 1.18494 111.919 1.22321 111.776 1.26141 111.643C 1.29962 111.547 1.32825 111.452 1.35687 111.356C 1.38556 111.261 1.41425 111.165 1.45251 111.07L 1.79651 110.039C 1.81799 110.018 1.82739 109.984 1.83832 109.945C 1.8468 109.915 1.8562 109.882 1.87299 109.848C 4.59894 102.484 9.56744 97.472 13.5778 93.4261C 16.9904 89.9832 19.7092 87.2405 19.7619 84.3443C 19.8129 81.2903 18.8374 78.7793 17.8918 76.3455C 16.7095 73.3023 15.5741 70.3794 16.5511 66.667C 19.7619 54.4495 37.9566 57.1221 33.752 67.3543C 29.5473 77.5862 34.2489 81.7478 38.6065 81.2134C 41.8215 80.8142 42.2396 76.7925 42.7954 71.4449C 43.4622 65.0303 44.3274 56.7078 50.456 50.4405C 55.224 45.5386 60.3317 47.1958 64.6854 48.6084C 67.4868 49.5174 69.9759 50.325 71.8616 49.2188C 75.2856 47.2071 75.9311 42.4273 76.7268 36.5345C 77.7433 29.0076 79.005 19.6646 86.6161 11.9554C 104.696 -6.40914 129.274 -2.0566 133.823 14.4371C 136.102 22.6795 128.536 30.3714 120.959 38.0745ZM 42.0468 46.47C 42.0468 49.8228 39.3257 52.5406 35.9691 52.5406C 32.6125 52.5406 29.8914 49.8228 29.8914 46.47C 29.8914 43.1175 32.6125 40.3995 35.9691 40.3995C 39.3257 40.3995 42.0468 43.1175 42.0468 46.47Z\"\n                    transform=\"translate(85.0406 0.26416)\"\n                    fill=\"#FFE6BF\"\n                  />\n                  <g id=\"Group\">\n                    <path\n                      id=\"Vector_6\"\n                      d=\"M 5.50427 13.9356C 14.487 6.14692 11.1233 14.2029 13.8372 15.5773C 16.3217 16.7991 21.5585 5.84148 21.0616 -1.86424e-05C 20.9469 -1.86424e-05 20.8322 -1.86424e-05 20.7175 -1.86424e-05C 11.0086 -1.86424e-05 2.82861 6.33782 1.86642e-05 15.081C 1.49076 15.8064 3.36371 15.8064 5.50427 13.9356Z\"\n                      transform=\"translate(94.4055 99.1929)\"\n                      fill=\"#6D7581\"\n                    />\n                    <path\n                      id=\"Vector_7\"\n                      d=\"M 14.4105 0.0494197C 9.7854 -0.752355 2.75216 8.41079 1.86642e-05 12.2288C 3.32553 14.3287 7.30084 15.5122 11.5055 15.5122C 13.5696 15.5122 15.5573 15.2068 17.4303 14.6723C 16.2835 9.67073 18.6916 0.813014 14.4105 0.0494197Z\"\n                      transform=\"translate(103.579 127.167)\"\n                      fill=\"#6D7581\"\n                    />\n                    <path\n                      id=\"Vector_8\"\n                      d=\"M 39.0652 19.5099C 36.9246 18.7463 30.6176 28.8257 29.2798 21.7243C 28.133 15.6919 32.1466 8.1323 34.6312 4.19979C 31.1145 1.64175 26.7952 0.0763781 22.1318 1.86424e-05C 22.6288 5.84152 17.392 16.7991 14.9075 15.5773C 12.1935 14.2029 15.5573 6.14696 6.57456 13.9356C 4.47223 15.7682 2.56101 15.7682 1.03204 15.081C 0.344009 17.1809 9.33209e-06 19.4335 9.33209e-06 21.7625C 9.33209e-06 29.5511 4.08997 36.3853 10.2441 40.2032C 12.9962 36.3853 20.0295 27.2221 24.6546 28.0239C 28.9358 28.7875 26.5276 37.6452 27.6744 42.6849C 32.1084 41.425 35.9308 38.8288 38.7211 35.3544C 36.7335 29.8566 40.9764 20.1971 39.0652 19.5099Z\"\n                      transform=\"translate(93.2971 99.2314)\"\n                      fill=\"#A3AFBF\"\n                    />\n                    <path\n                      id=\"Vector_9\"\n                      d=\"M 5.55284 -1.86424e-05C 3.06827 3.97067 -0.945276 11.4921 0.201451 17.5245C 1.5393 24.6259 7.84629 14.5465 9.98684 15.3101C 11.8981 15.9973 7.65519 25.6568 9.68108 31.1165C 12.6626 27.3749 14.4591 22.6788 14.4591 17.5245C 14.4591 10.3467 10.9425 3.97067 5.55284 -1.86424e-05Z\"\n                      transform=\"translate(122.414 103.393)\"\n                      fill=\"#6D7581\"\n                    />\n                    <path\n                      id=\"Vector_10\"\n                      d=\"M 5.00739 10.0031C 7.77289 10.0031 10.0148 7.7638 10.0148 5.00153C 10.0148 2.23925 7.77289 -9.32123e-06 5.00739 -9.32123e-06C 2.2419 -9.32123e-06 -1.86642e-05 2.23925 -1.86642e-05 5.00153C -1.86642e-05 7.7638 2.2419 10.0031 5.00739 10.0031Z\"\n                      transform=\"translate(98.1898 118.245)\"\n                      fill=\"#6D7581\"\n                    />\n                    <path\n                      id=\"Vector_11\"\n                      d=\"M 2.48457 4.96336C 3.85676 4.96336 4.96914 3.85227 4.96914 2.48167C 4.96914 1.11108 3.85676 -9.32122e-06 2.48457 -9.32122e-06C 1.11237 -9.32122e-06 -9.33209e-06 1.11108 -9.33209e-06 2.48167C -9.33209e-06 3.85227 1.11237 4.96336 2.48457 4.96336Z\"\n                      transform=\"translate(112.294 115.763)\"\n                      fill=\"#6D7581\"\n                    />\n                  </g>\n                  <path\n                    id=\"Vector_12\"\n                    d=\"M -9.33209e-06 7.71232L 7.91243 -1.86424e-05\"\n                    transform=\"translate(175.364 50.5139)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_13\"\n                    d=\"M 0 33.5218L 34.3636 1.86424e-05\"\n                    transform=\"translate(135.191 63.9148)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_14\"\n                    d=\"M 9.33209e-06 15.1574L 15.5573 -1.86424e-05\"\n                    transform=\"translate(165.923 65.022)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_15\"\n                    d=\"M -1.86642e-05 3.05436L 3.1344 -1.86425e-05\"\n                    transform=\"translate(140.81 103.393)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_16\"\n                    d=\"M -9.33209e-06 4.84882L 5.00736 9.32123e-06\"\n                    transform=\"translate(112.294 88.3882)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_17\"\n                    d=\"M -1.86642e-05 16.2646L 16.6658 1.86425e-05\"\n                    transform=\"translate(134.312 66.3965)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_18\"\n                    d=\"M 9.33209e-06 7.67413L 7.91241 9.32122e-06\"\n                    transform=\"translate(123.112 85.9065)\"\n                    stroke=\"#F6F7F8\"\n                    strokeWidth=\"3\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                </g>\n              </g>\n              <g id=\"Group 4\">\n                <g id=\"Group 4_2\">\n                  <path\n                    id=\"Vector_19\"\n                    d=\"M 187.643 36.8965C 180.682 35.9802 175.07 35.1178 171.508 28.8114C 166.759 20.4029 159.097 15.1746 149.221 15.6597C 144.742 15.8753 140.317 17.0611 136 18.2469C 131.953 19.3249 127.906 20.4568 123.858 21.5348C 114.091 24.176 106.051 11.8867 97.7942 7.4129C 88.0268 2.13064 77.1261 -0.294864 66.0097 0.02854C 48.6334 0.513646 33.1459 8.437 25.3212 24.4455C 21.22 32.8001 17.9822 42.0171 18.306 51.3419C 18.6298 61.9603 25.1054 72.7944 23.9722 76.1901C 23.3786 78.0227 21.4898 79.1546 19.709 80.017C 4.1136 87.4553 -0.635164 99.8525 0.0663609 109.285C 1.30752 125.509 23.3246 130.037 28.2892 113.921C 28.8828 112.034 29.0447 110.04 29.2606 108.099C 29.2606 107.992 29.3685 107.452 29.4225 107.075C 29.5304 106.698 29.6923 105.997 29.7463 105.889C 29.7463 105.782 29.8002 105.728 29.8002 105.674C 30.07 105.135 30.3938 104.596 30.7176 104.057C 30.7716 104.003 30.8255 103.895 30.8255 103.841C 31.2572 103.356 31.6889 102.871 32.1206 102.44C 32.4984 102.062 32.8761 101.739 33.1999 101.416C 33.3618 101.254 33.4697 101.2 33.5237 101.092C 33.5777 101.038 33.6856 100.984 33.7935 100.931C 34.8728 100.176 35.952 99.4752 37.0853 98.7745C 39.3517 97.427 41.6722 96.2951 44.0466 95.1632C 45.5036 94.4625 46.5828 93.2766 47.3383 91.8752C 53.5981 95.2709 60.7752 97.1575 68.3841 97.1575C 92.8295 97.1575 112.688 77.3759 112.688 52.9051C 112.688 51.3958 112.634 49.8866 112.472 48.3774C 113.767 48.1618 115.062 48.0001 116.304 47.8384C 116.789 48.5391 117.437 49.1859 118.3 49.671C 121.16 51.3419 125.585 50.4795 127.15 47.3533C 127.258 47.0838 127.42 46.8682 127.528 46.6526C 129.363 46.4909 131.252 46.383 133.086 46.2752C 139.778 45.8979 146.523 45.7363 153.215 45.9519C 156.237 46.0597 159.798 46.1135 162.874 47.0838C 164.547 48.1618 166.274 49.132 168.109 50.0483C 168.486 50.21 168.864 50.3717 169.242 50.4795C 170.321 51.0724 171.454 51.5575 172.749 51.8809C 175.933 52.6355 178.685 51.8809 181.815 51.5575C 188.075 50.9646 193.957 55.1688 195.576 61.1518C 197.141 66.9192 204.318 67.027 207.394 62.7149C 213.87 53.5518 209.391 39.7533 187.643 36.8965Z\"\n                    transform=\"translate(165.052 414.13)\"\n                    fill=\"#00D5BD\"\n                  />\n                  <path\n                    id=\"Vector_20\"\n                    d=\"M 15.4016 30.7674C 23.9077 30.7674 30.8033 23.8799 30.8033 15.3837C 30.8033 6.88752 23.9077 -1.64008e-05 15.4016 -1.64008e-05C 6.89554 -1.64008e-05 -1.64199e-05 6.88752 -1.64199e-05 15.3837C -1.64199e-05 23.8799 6.89554 30.7674 15.4016 30.7674Z\"\n                    transform=\"translate(280.613 366.518)\"\n                    fill=\"#00D5BD\"\n                  />\n                </g>\n                <g id=\"Group 2\">\n                  <path\n                    id=\"Vector_21\"\n                    d=\"M 131.622 151.221C 128.753 143.809 129.862 136.588 128.868 128.909C 128.638 127.151 128.256 125.355 127.223 123.904C 125.616 121.573 123.206 121.306 120.682 121.993C 108.327 125.355 95.0155 124.171 85.2997 115.154C 80.2124 110.455 76.1577 104.342 76.6168 97.1591C 76.9993 90.7404 80.3654 84.7038 84.5347 80.0426C 87.1358 77.1007 90.6166 75.0757 93.1412 72.0956C 98.0373 66.3265 98.8788 58.4941 100.103 51.3113C 101.136 45.2365 105.037 34.042 112.917 34.8443C 118.272 35.3792 120.414 40.8809 120.72 45.5803C 120.95 49.2482 120.452 52.6867 119.534 56.24C 118.54 60.2516 114.753 66.7849 120.146 69.3447C 121.906 70.1853 124.048 69.9943 125.693 68.9627C 132.387 64.8364 127.376 56.0489 126.267 50.4325C 125.31 45.6185 125.234 40.6135 126.611 35.8377C 128.179 30.3359 132.348 25.4073 137.627 23.1149C 143.212 20.7079 149.676 21.5867 154.343 25.5219C 159.201 29.6482 161.687 35.6849 161.955 41.9507C 162.261 48.7133 160.922 55.5904 158.78 62.0091C 156.638 68.3132 153.234 74.1206 151.053 80.4246C 149.485 85.0094 147.458 91.6574 153.042 94.4082C 155.108 95.4398 157.632 95.5544 159.774 94.7139C 163.255 93.4148 164.824 90.2055 165.512 86.7669C 168.075 74.2352 180.047 64.3397 193.168 66.8231C 195.998 67.358 198.599 68.6571 200.894 70.3763C 187.162 29.4572 148.49 -1.86555e-05 102.933 -1.86555e-05C 65.524 -1.86555e-05 32.7429 19.8674 14.6119 49.6302C 15.4152 49.9741 16.1802 50.4708 16.9069 51.2349C 21.9943 56.622 19.202 65.9062 19.0873 72.3631C 19.049 74.1588 19.2402 76.1073 20.3878 77.4827C 24.9014 82.717 32.4751 76.3366 35.7264 73.0126C 39.8193 68.7717 43.6444 64.1105 49.1525 61.6271C 54.1634 59.3729 60.0541 59.1054 64.7589 62.3148C 75.8135 69.8415 67.1688 84.1689 60.3218 91.4663C 59.9776 91.8102 59.6716 92.1541 59.3273 92.4979C 52.0979 99.6425 43.1471 103.769 33.6609 106.864C 23.5244 110.149 12.7376 111.83 2.10381 112.403C 1.37704 112.442 0.650267 112.327 0 112.06C 4.47537 164.899 48.8465 206.391 102.933 206.391C 133.725 206.391 161.381 192.943 180.315 171.585C 176.911 172.846 173.354 173.687 169.72 174.145C 153.348 176.246 137.551 166.542 131.622 151.221Z\"\n                    transform=\"translate(193.043 446.757)\"\n                    fill=\"#5F45FC\"\n                  />\n                  <path\n                    id=\"Vector_22\"\n                    d=\"M 34.0434 57.2333C 43.4914 54.1386 52.4804 50.0123 59.7098 42.8677C 60.0541 42.5238 60.3983 42.18 60.7043 41.8361C 67.5513 34.5387 76.196 20.2112 65.1415 12.6845C 60.4366 9.47519 54.5459 9.74266 49.535 11.9968C 44.0269 14.4803 40.2401 19.1414 36.1089 23.3823C 32.8576 26.7445 25.2839 33.0868 20.7703 27.8525C 19.5845 26.4771 19.4315 24.5286 19.4698 22.7329C 19.5845 16.2378 22.3768 6.95356 17.2894 1.60465C 16.5627 0.840524 15.7977 0.343858 14.9944 0C 5.46989 15.6265 -9.33862e-06 33.9655 -9.33862e-06 53.5655C -9.33862e-06 56.5456 0.114744 59.4875 0.382501 62.3912C 1.03277 62.6586 1.72129 62.7732 2.48631 62.735C 13.1583 62.2001 23.9451 60.5191 34.0434 57.2333Z\"\n                    transform=\"translate(192.699 496.349)\"\n                    fill=\"#2B01B3\"\n                  />\n                  <path\n                    id=\"Vector_23\"\n                    d=\"M 124.313 48.5954C 122.018 46.8761 119.417 45.577 116.586 45.0421C 103.466 42.5587 91.4936 52.4542 88.9308 64.986C 88.2423 68.4245 86.674 71.6339 83.1932 72.9329C 81.0511 73.7352 78.5265 73.6206 76.461 72.6273C 70.9146 69.9146 72.9419 63.2666 74.4719 58.6436C 76.614 52.3396 80.0566 46.5322 82.1986 40.2281C 84.3789 33.8095 85.7177 26.9705 85.3735 20.1697C 85.0675 13.8657 82.6194 7.86725 77.7615 3.74095C 73.0949 -0.194318 66.6305 -1.07309 61.0458 1.33392C 55.7672 3.62631 51.5978 8.55497 50.0295 14.0567C 48.6525 18.8325 48.7672 23.8375 49.6853 28.6516C 50.7945 34.2679 55.8054 43.0172 49.1115 47.1817C 47.4667 48.2133 45.2864 48.4043 43.5651 47.5638C 38.1717 45.0039 41.9203 38.4707 42.9531 34.459C 43.8329 30.9058 44.3301 27.4672 44.1389 23.7994C 43.8711 19.1382 41.7291 13.6364 36.3357 13.0633C 28.456 12.261 24.5544 23.4173 23.5216 29.5303C 22.3358 36.6749 21.456 44.5455 16.5599 50.3147C 14.0353 53.2948 10.5545 55.3197 7.95343 58.2616C 3.78407 62.9228 0.456251 68.9594 0.0354903 75.3781C -0.423522 82.5609 3.63107 88.6357 8.71845 93.3733C 18.4342 102.39 31.7455 103.574 44.1006 100.212C 46.6252 99.5246 49.035 99.7921 50.6415 102.123C 51.6361 103.574 52.0568 105.37 52.2863 107.128C 53.2809 114.769 52.1716 122.028 55.0404 129.44C 60.9311 144.761 76.7288 154.466 93.1384 152.364C 96.7723 151.906 100.33 151.065 103.734 149.804C 119.876 131.58 129.668 107.663 129.668 81.4147C 129.668 69.9528 127.794 58.9111 124.313 48.5954ZM 41.1936 45.5389C 41.1936 45.5389 41.1936 45.5006 41.1936 45.5389C 41.2701 45.6535 41.3466 45.7299 41.3466 45.7681C 41.3083 45.6917 41.2318 45.6153 41.1936 45.5389ZM 60.5868 33.7712C 60.7781 34.1533 60.8928 34.5354 60.9311 34.9939C 60.8546 34.6118 60.7398 34.1915 60.5868 33.7712Z\"\n                    transform=\"translate(269.663 468.538)\"\n                    fill=\"#2B01B3\"\n                  />\n                  <path\n                    id=\"Vector_24\"\n                    d=\"M 22.2238 23.3824C 28.1527 20.7079 33.1636 12.761 35.3057 5.15789C 25.1309 1.79572 14.2676 1.86555e-05 2.98357 1.86555e-05C 1.98905 1.86555e-05 0.994526 9.32832e-06 0 0.0382158C 1.41529 6.34229 2.60108 12.9902 6.46443 18.2627C 10.0218 23.1531 16.3332 26.0568 22.2238 23.3824Z\"\n                    transform=\"translate(293.07 446.031)\"\n                    fill=\"#2B01B3\"\n                  />\n                  <path\n                    id=\"Vector_25\"\n                    d=\"M 1.5142 13.3341C 1.24645 16.5052 0.749194 19.6381 0.328433 22.7711C -0.054077 25.4837 -0.321815 28.3874 0.825715 30.9854C 3.73279 37.557 12.3775 36.4872 17.5031 33.4307C 19.7982 32.0552 21.5195 29.9921 23.6615 28.4256C 17.6944 17.6132 9.89117 7.98515 0.596171 0C 1.7437 4.27913 1.89671 8.82571 1.5142 13.3341Z\"\n                    transform=\"translate(362.932 471.133)\"\n                    fill=\"#1CD2F2\"\n                  />\n                  <path\n                    id=\"Vector_26\"\n                    d=\"M 0.045886 5.57816C 0.313643 8.48186 2.18794 10.8507 5.20977 11.1181C 7.61958 11.3473 9.83812 9.97189 11.0621 7.94695C 11.6742 6.95358 12.0185 5.84559 12.095 4.6994C 8.72886 2.9419 5.248 1.37541 1.65241 -1.86555e-05C 0.237122 1.45183 -0.145369 3.59143 0.045886 5.57816Z\"\n                    transform=\"translate(331.428 452.87)\"\n                    fill=\"#2B01B3\"\n                  />\n                  <path\n                    id=\"Vector_27\"\n                    d=\"M 7.4972 14.9769C 11.6378 14.9769 14.9944 11.6243 14.9944 7.48849C 14.9944 3.35272 11.6378 -1.86555e-05 7.4972 -1.86555e-05C 3.35661 -1.86555e-05 9.33862e-06 3.35272 9.33862e-06 7.48849C 9.33862e-06 11.6243 3.35661 14.9769 7.4972 14.9769Z\"\n                    transform=\"translate(268.551 496.043)\"\n                    fill=\"#1CD2F2\"\n                  />\n                </g>\n                <g id=\"Group 3\">\n                  <path\n                    id=\"Vector_28\"\n                    d=\"M 50.711 33.3873L 16.4777 3.28016e-05L -8.20996e-06 20.7579L 40.1518 47.4947C 40.2864 47.629 40.4209 47.7634 40.5554 47.8305C 43.6491 49.9802 48.4244 48.5023 51.1818 44.4717C 54.0066 40.5082 53.8048 35.537 50.711 33.3873Z\"\n                    transform=\"translate(332.871 272.939)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_29\"\n                    d=\"M 49.8289 2.88866C 38.2609 16.7273 27.4327 11.4874 14.7885 7.5911C 6.17975 4.97117 -2.49627 5.77728 0.664761 10.0095C 5.84347 16.9288 30.3246 34.1934 37.5883 35.6713C 39.4042 36.0744 49.2236 23.5122 57.1598 13.234C 55.5457 7.72547 53.6625 3.22451 52.1829 -1.64008e-05L 49.8289 2.88866Z\"\n                    transform=\"translate(220.494 336.288)\"\n                    fill=\"#171A21\"\n                  />\n                  <path\n                    id=\"Vector_30\"\n                    d=\"M 5.31323 42.3891L 34.0316 7.25523L 24.2122 0L -8.20996e-06 29.6254C 1.47962 32.8499 3.29555 37.3509 4.97695 42.8594C 5.04421 42.7251 5.17872 42.5235 5.31323 42.3891Z\"\n                    transform=\"translate(272.677 306.662)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_31\"\n                    d=\"M 7.96711 36.9477C 1.2415 42.9266 -2.8611 50.5176 2.38487 50.1146C 6.95828 49.7787 17.7193 44.7403 26.8661 42.0532C 34.8695 39.702 41.3934 39.7692 43.8146 37.2836C 44.958 36.0744 45.2269 19.8174 46.9756 6.31471C 42.604 3.69478 38.2323 1.54507 34.9368 -1.64008e-05C 28.8838 22.3702 19.9387 26.4008 7.96711 36.9477Z\"\n                    transform=\"translate(266.593 411.191)\"\n                    fill=\"#171A21\"\n                  />\n                  <path\n                    id=\"Vector_32\"\n                    d=\"M 12.8459 81.4866L 22.9343 2.55274L 10.6937 3.28016e-05L 0.134528 81.7553C 0.0672724 81.8897 0.0672642 82.024 8.20996e-06 82.1584C 3.29555 83.6363 7.66717 85.8532 12.0388 88.4731C 12.3078 86.6593 12.5769 84.8455 12.8459 83.166C 12.9804 82.6286 12.9804 82.024 12.8459 81.4866Z\"\n                    transform=\"translate(301.53 329.032)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_33\"\n                    d=\"M 40.2191 27.7444C 36.789 28.7521 33.0227 29.8269 29.1218 30.7674C 25.8935 31.5735 23.2706 30.9689 20.9166 24.7886L 11.4335 -3.28016e-05L 1.64199e-05 4.03063L 11.4335 33.3202C 17.4193 48.7039 20.1768 47.6962 28.9201 44.5388L 37.5962 41.3815C 38.6722 40.9785 39.6811 40.6425 40.6899 40.3066C 40.2864 37.7539 39.681 32.514 40.2191 27.7444Z\"\n                    transform=\"translate(336.638 323.591)\"\n                    fill=\"#828C99\"\n                  />\n                  <path\n                    id=\"Vector_34\"\n                    d=\"M 39.1538 34.8395C 38.2122 26.2408 28.0566 5.07978 22.5416 0.175804C 21.4655 -0.831862 12.6549 2.66135 0.212549 6.35612C -0.325499 11.1257 0.279855 16.3656 0.683391 18.9183C 14.6726 14.2831 16.4213 17.7092 26.9132 28.1889C 33.3026 34.5708 39.7591 40.0794 39.1538 34.8395Z\"\n                    transform=\"translate(376.644 344.979)\"\n                    fill=\"#171A21\"\n                  />\n                  <g id=\"Group 2_2\">\n                    <path\n                      id=\"Vector_35\"\n                      d=\"M 100.212 55.9591C 100.951 56.6309 101.826 56.9667 102.7 57.0339C 103.843 57.1011 105.054 56.698 105.928 55.7575C 107.475 54.1453 107.408 51.5925 105.794 50.0474L 86.693 31.9766C 85.0789 30.4315 82.5231 30.4987 80.9763 32.111C 79.4294 33.7233 79.4966 36.276 81.1108 37.8211L 88.3744 44.6732L 83.801 49.8458L 32.6192 0L -8.20996e-06 41.1127L 39.6138 67.4465L 24.5484 85.8532L 34.3678 93.1083L 39.5465 86.7264L 43.3801 88.6746L 39.8828 108.223L 52.1234 110.776L 55.6207 91.2274L 58.1764 91.093L 64.2968 106.745L 75.7303 102.715L 69.9463 87.5998L 79.5639 93.9817C 79.8329 94.2504 80.1019 94.4519 80.4382 94.6534C 86.5585 98.8856 95.9743 95.9298 101.489 88.07C 107.004 80.143 106.534 70.3351 100.413 66.0357L 100.48 65.9685L 89.6523 55.4216L 94.2929 50.1146L 100.212 55.9591Z\"\n                      transform=\"translate(272.341 220.675)\"\n                      fill=\"#7B16FF\"\n                    />\n                    <g id=\"Group_2\">\n                      <path\n                        id=\"Vector_36\"\n                        d=\"M 8.20996e-06 21.6313L 2.35397 -1.64008e-05\"\n                        transform=\"translate(292.114 182.787)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                      <path\n                        id=\"Vector_37\"\n                        d=\"M 2.4212 8.26289L 0 0\"\n                        transform=\"translate(269.785 178.689)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                      <path\n                        id=\"Vector_38\"\n                        d=\"M 2.28669 7.92699L 8.20996e-06 -1.64008e-05\"\n                        transform=\"translate(275.3 196.894)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                      <path\n                        id=\"Vector_39\"\n                        d=\"M 11.7698 14.7119L -1.64199e-05 -1.64008e-05\"\n                        transform=\"translate(253.375 197.565)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                      <path\n                        id=\"Vector_40\"\n                        d=\"M 1.64199e-05 15.9211L 8.60878 1.64008e-05\"\n                        transform=\"translate(305.7 192.729)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                      <path\n                        id=\"Vector_41\"\n                        d=\"M -8.20996e-06 16.5257L 20.3786 -1.64008e-05\"\n                        transform=\"translate(316.73 201.26)\"\n                        stroke=\"#EAA736\"\n                        strokeWidth=\"4\"\n                        strokeMiterlimit=\"10\"\n                        strokeLinecap=\"round\"\n                      />\n                    </g>\n                    <path\n                      id=\"Vector_42\"\n                      d=\"M -8.20996e-06 3.28016e-05L 31.6103 20.2205\"\n                      transform=\"translate(298.234 279.993)\"\n                      stroke=\"#F6F7F8\"\n                      strokeWidth=\"2\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_43\"\n                      d=\"M 6.5911 3.28016e-05C 8.74329 10.0767 6.12031 20.2205 1.64199e-05 27.8788\"\n                      transform=\"translate(314.107 233.976)\"\n                      stroke=\"#F6F7F8\"\n                      strokeWidth=\"2\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_44\"\n                      d=\"M 26.1994 52.4594C 40.669 52.4594 52.3989 40.716 52.3989 26.2297C 52.3989 11.7434 40.669 -3.28397e-05 26.1994 -3.28397e-05C 11.7299 -3.28397e-05 -8.20045e-06 11.7434 -8.20045e-06 26.2297C -8.20045e-06 40.716 11.7299 52.4594 26.1994 52.4594Z\"\n                      transform=\"matrix(0.0659777 -0.997795 0.997805 0.0658249 260.205 265.414)\"\n                      fill=\"#1CD2F2\"\n                    />\n                    <g id=\"Group_3\">\n                      <path\n                        id=\"Vector_45\"\n                        d=\"M 15.6587 11.1551L 20.6357 3.22816C 20.7702 2.95944 20.7702 2.62351 20.5012 2.42197C 18.2817 0.809708 15.5915 -0.0635861 12.565 0.00359164C 6.44466 0.137947 1.26593 4.70605 0.189835 10.6849C -1.22254 18.9477 5.4358 26.3373 13.8428 25.7327C 19.2233 25.3968 23.864 21.5677 25.3436 16.395C 25.6799 15.253 25.8144 14.1109 25.8144 12.9689C 25.8144 12.633 25.5453 12.4315 25.2763 12.3643L 15.7932 11.5582C 15.6587 11.491 15.5915 11.2894 15.6587 11.1551Z\"\n                        transform=\"translate(275.177 228.128)\"\n                        fill=\"#171A21\"\n                      />\n                    </g>\n                  </g>\n                </g>\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </InlineSvg>\n  </SvgWrapper>\n);\n\nexport const Ideas = () => (\n  <SvgWrapper>\n    <InlineSvg\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      strokeLinejoin=\"round\"\n      strokeMiterlimit=\"1.414\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      aria-labelledby=\"title\"\n      viewBox=\"0 0 620 454\"\n      preserveAspectRatio=\"xMidYMid meet\"\n      fit\n      id={'ideas'}\n    >\n      <title id=\"title\">{'ideas'}</title>\n      <g id=\"Canvas\" fill=\"none\">\n        <g id=\"ideas\">\n          <mask\n            id=\"mask3\"\n            mask-type=\"alpha\"\n            maskUnits=\"userSpaceOnUse\"\n            x=\"-1\"\n            y=\"-4\"\n            width=\"621\"\n            height=\"458\"\n          >\n            <path\n              id=\"Union\"\n              fillRule=\"evenodd\"\n              clipRule=\"evenodd\"\n              d=\"M 421.015 0L 58.6842 0L 58.6842 263.75C -29.9225 261.284 -8.4684 295.332 58.6842 334.842L 58.6842 458L 421.015 458L 421.015 448.396C 606.994 446.15 620 341.231 620 270.508C 620 220.867 502.811 45.5466 421.015 10.5862L 421.015 0Z\"\n              transform=\"translate(620 -4) scale(-1 1)\"\n              fill=\"#C4C4C4\"\n            />\n          </mask>\n          <g mask=\"url(#mask3)\">\n            <path\n              id=\"Ellipse\"\n              d=\"M 620 266.013C 620 337.504 606.71 443.938 414.893 443.938C 223.076 443.938 -218.83 217.202 130.287 266.013C 479.404 314.824 316.23 266.013 346.588 64.1906C 376.946 -137.632 620 194.522 620 266.013Z\"\n              transform=\"translate(620 0.495117) scale(-1 1)\"\n              fill=\"white\"\n            />\n            <g id=\"Group 6\">\n              <g id=\"Group 5\">\n                <g id=\"Group 5_2\">\n                  <g id=\"Group 5_3\">\n                    <path\n                      id=\"Vector\"\n                      d=\"M 31.836 67.901C 31.836 67.901 56.8385 48.4318 63.1896 31.2152L 41.6441 1.96415e-05L 0 28.8016L 31.836 67.901Z\"\n                      transform=\"translate(208.326 110.287) scale(-1 1)\"\n                      fill=\"#16171A\"\n                    />\n                    <path\n                      id=\"Vector_2\"\n                      d=\"M 9.81371e-06 16.3328C 9.81371e-06 16.3328 27.0928 -0.159743 45.4226 0.00115991L 66.9681 31.2163L 25.3241 60.018L 9.81371e-06 16.3328Z\"\n                      transform=\"translate(239.519 70.3823) scale(-1 1)\"\n                      fill=\"#16171A\"\n                    />\n                    <path\n                      id=\"Vector_3\"\n                      d=\"M 80.3135 1.96415e-05L 69.7819 7.24065L 9.81371e-06 55.431L 4.66285 62.189C 40.4381 42.6393 52.7384 59.6145 76.3742 71.8432C 92.6942 80.2906 97.6786 80.1297 113.114 69.9928C 116.169 67.9815 119.626 65.568 123.646 62.7522L 80.3135 1.96415e-05Z\"\n                      transform=\"translate(264.039 152.122) scale(-1 1)\"\n                      fill=\"#C5D3E7\"\n                    />\n                    <path\n                      id=\"Vector_4\"\n                      d=\"M 41.644 9.82073e-06C 37.6243 2.81581 34.087 5.14888 31.1928 7.32107C 16.2396 18.182 14.3101 22.7678 16.4004 41.0303C 19.4553 67.4988 30.9517 85.0372 0 111.586L 4.66284 118.344L 74.4447 70.1537L 84.9764 62.9131L 41.644 9.82073e-06Z\"\n                      transform=\"translate(302.387 40.5359) scale(-1 1)\"\n                      fill=\"#C5D3E7\"\n                    />\n                    <path\n                      id=\"Vector_5\"\n                      d=\"M 37.5439 32.1001C 33.6046 31.4565 27.0123 29.1234 23.2338 23.7332C 19.6161 18.4234 19.7769 11.585 20.42 7.64291C 16.5611 6.91885 9.48649 5.14891 5.86876 1.96415e-05L 1.96274e-05 21.8023C 4.2609 23.9745 8.28055 27.4339 11.4159 31.9392C 14.5513 36.4445 16.32 41.4325 16.8023 46.1791L 39.3126 48.3513C 35.8557 43.0415 36.74 35.8813 37.5439 32.1001Z\"\n                      transform=\"translate(352.311 192.75) scale(-1 1)\"\n                      fill=\"#EAA736\"\n                    />\n                    <path\n                      id=\"Vector_6\"\n                      d=\"M 14.6317 74.3372C 13.9885 78.1988 13.8277 85.1177 17.4455 90.4275C 21.1436 95.8177 27.8163 98.1508 31.7556 98.7944C 30.9516 102.576 30.1477 109.736 33.4439 115.126L 33.7654 115.126L 129.917 48.7536L 96.2315 0L 0.0804037 66.3725L -1.96274e-05 66.7747C 3.6981 71.8431 10.7728 73.6131 14.6317 74.3372Z\"\n                      transform=\"translate(346.523 126.056) scale(-1 1)\"\n                      fill=\"#E2197A\"\n                    />\n                    <path\n                      id=\"Vector_7\"\n                      d=\"M 48.2364 50.4825C 50.4874 48.8734 52.0953 46.5403 52.5776 43.805C 53.462 38.817 51.6129 30.7718 42.9303 18.2214C 34.4086 5.83188 27.4947 1.24617 22.4299 0.200304C 19.6965 -0.362856 16.8023 0.280736 14.4709 1.88977L 1.96274e-05 11.8658L 33.6047 60.6193L 48.2364 50.4825Z\"\n                      transform=\"translate(228.505 99.2263) scale(-1 1)\"\n                      fill=\"#E2197A\"\n                    />\n                    <path\n                      id=\"Vector_8\"\n                      d=\"M 26.4557 -1.96369e-05L -9.81598e-06 -1.96369e-05L -9.81598e-06 59.279L 26.4557 59.279L 26.4557 -1.96369e-05Z\"\n                      transform=\"matrix(-0.82281 -0.568375 -0.567825 0.82319 250.276 126.082)\"\n                      fill=\"white\"\n                    />\n                    <path\n                      id=\"Vector_9\"\n                      d=\"M 5.45783 -1.96415e-05L 0.0714335 20.0324C -0.250142 21.1587 0.553797 22.2046 1.67931 22.285L 22.3406 24.2963C 21.8582 19.5497 20.0091 14.5617 16.9542 10.0564C 13.7384 5.55113 9.71871 2.17217 5.45783 -1.96415e-05Z\"\n                      transform=\"translate(357.85 214.633) scale(-1 1)\"\n                      fill=\"#E2197A\"\n                    />\n                    <path\n                      id=\"Vector_10\"\n                      d=\"M 0 34.6746L 50.1658 0\"\n                      transform=\"translate(318.466 192.831) scale(-1 1)\"\n                      stroke=\"#F6F7F8\"\n                      strokeWidth=\"2\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_11\"\n                      d=\"M -1.96274e-05 31.3761L 45.3422 1.96415e-05\"\n                      transform=\"translate(311.552 154.938) scale(-1 1)\"\n                      stroke=\"#F6F7F8\"\n                      strokeWidth=\"2\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_12\"\n                      d=\"M 1.96274e-05 11.0219L 15.918 9.82073e-06\"\n                      transform=\"translate(335.429 191.785) scale(-1 1)\"\n                      stroke=\"#F6F7F8\"\n                      strokeWidth=\"2\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                  </g>\n                  <g id=\"Group 5_4\">\n                    <path\n                      id=\"Vector_13\"\n                      d=\"M 93.9124 87.2972C 99.3792 80.8611 102.193 75.149 103.881 68.9542C 105.328 64.2881 106.132 59.3001 106.293 54.0707C 106.775 24.7059 83.3808 0.490041 54.037 0.00733236C 24.6932 -0.475376 0.494662 22.936 0.0122985 52.3008C -0.228883 67.7475 2.90648 78.9302 24.1305 101.537C 37.8778 116.179 31.7679 124.788 32.0091 141.763C 32.0895 145.464 59.5038 147.394 60.147 143.935C 63.2019 127.201 58.3783 117.708 74.1355 105.399C 82.5768 98.8017 88.6868 93.1701 93.1888 88.1017C 93.43 87.8603 93.6712 87.619 93.9124 87.2972Z\"\n                      transform=\"translate(493.656 190.008) scale(-1 1)\"\n                      fill=\"#FFCCE5\"\n                    />\n                    <path\n                      id=\"Vector_14\"\n                      d=\"M 24.0144 111.466C 24.0144 111.466 24.0144 12.6721 5.52376 17.4187C -10.6354 21.5217 12.0357 66.4941 30.2047 62.6324C 51.0267 58.1271 50.062 -3.98141 34.7872 0.20207C 22.2457 3.66148 34.0636 74.0565 104.408 30.2105\"\n                      transform=\"translate(474.487 210.971) scale(-1 1)\"\n                      stroke=\"#E2197A\"\n                      strokeWidth=\"4\"\n                      strokeMiterlimit=\"10\"\n                      strokeLinecap=\"round\"\n                    />\n                    <path\n                      id=\"Vector_15\"\n                      d=\"M 24.7038 3.77687C 24.7842 2.16784 23.3371 0.880675 21.8096 1.12203C 13.931 2.1679 6.29358 0.800185 3.23862 0.0761214C 1.87192 -0.245684 0.505252 0.478359 0.103282 1.76558C -0.298687 3.21371 0.505242 4.66183 1.95233 4.98364C 3.96218 5.3859 3.88179 8.36266 3.96218 9.56943C 4.20336 13.592 7.90146 16.7296 12.0819 16.8101C 15.8605 16.8905 19.0762 14.4769 20.1213 11.0979C 20.2821 10.3739 20.7645 8.52352 21.0861 7.31675C 21.2469 6.75359 21.6488 6.35137 22.2116 6.35137C 23.5783 6.02957 24.6234 5.06409 24.7038 3.77687Z\"\n                      transform=\"translate(460.143 337.164) scale(-1 1)\"\n                      fill=\"#171A21\"\n                    />\n                  </g>\n                </g>\n                <g id=\"Group 5_5\">\n                  <path\n                    id=\"Vector_16\"\n                    d=\"M 53.8639 86.6462L 29.9869 49.6385L 62.4661 28.6407L 43.9755 3.92829e-05L -1.96274e-05 28.3993L 49.7638 105.633L 93.8197 77.2334L 86.3431 65.7288L 53.8639 86.6462Z\"\n                    transform=\"translate(315.17 323.403) scale(-1 1)\"\n                    fill=\"#EAA736\"\n                  />\n                  <path\n                    id=\"Vector_17\"\n                    d=\"M 44.0558 0L -9.81371e-06 28.3994L 18.4906 57.0401L 51.0501 36.1227L 74.8467 73.1304L 42.3676 94.1282L 49.8442 105.633L 93.8197 77.2334L 44.0558 0Z\"\n                    transform=\"translate(271.194 295.004) scale(-1 1)\"\n                    fill=\"#EAA736\"\n                  />\n                  <path\n                    id=\"Vector_18\"\n                    d=\"M 38.6776 0L -9.81577e-06 0L -9.81577e-06 44.0782L 38.6776 44.0782L 38.6776 0Z\"\n                    transform=\"matrix(-0.840223 -0.542274 -0.541726 0.840577 252.716 352.145)\"\n                    fill=\"#7A16FF\"\n                  />\n                  <path\n                    id=\"Vector_19\"\n                    d=\"M 177.043 129.617C 181.867 126.479 186.771 123.181 191.756 119.48L 249.88 79.6564L 232.596 52.7856C 232.596 52.7856 201.322 76.1969 180.581 83.1158C 164.261 87.5406 146.494 85.0466 142.153 70.9676C 137.65 56.5668 144.886 40.3961 142.394 33.7186C 139.901 26.9607 136.605 26.9606 130.656 22.3749C 125.029 18.111 124.546 13.123 120.848 14.5711C 117.713 15.7779 111.924 22.6967 118.034 34.7644C 123.421 45.384 128.244 69.3586 95.4437 68.5541C 82.5807 68.2323 65.1352 54.636 66.0999 43.5337C 67.0646 32.4314 81.7767 28.7306 86.0376 17.7892C 89.3337 9.3418 84.8317 0.331262 81.1336 0.00945601C 77.4355 -0.31235 72.0491 7.65232 59.6684 15.3757C 49.378 21.7313 41.4993 27.2825 41.9013 36.293C 42.866 54.636 71.3255 73.3008 70.0392 76.3579C 68.3509 80.3 50.5035 65.9796 38.6052 47.154C 29.8423 33.3163 21.9636 24.3057 18.5871 23.9839C 15.2105 23.6621 11.0301 33.3968 18.5067 48.6826C 30.0834 72.3353 53.6388 87.6211 51.0662 92.1264C 48.4936 96.6317 31.5305 80.4609 20.2754 66.6232C 10.2262 54.2337 4.03582 46.9126 0.980854 51.257C -0.868206 53.9119 -0.868225 63.4857 7.89471 75.2316C 16.6576 87.0579 42.7857 104.435 39.7307 107.251C 36.6758 110.067 17.542 92.0459 12.7183 91.3219C 8.45747 90.6782 3.39267 94.0571 13.4419 106.849C 22.2048 117.951 46.725 146.672 86.118 153.35C 117.632 158.74 145.288 150.051 177.043 129.617L 177.043 129.617Z\"\n                    transform=\"translate(547.604 298.937) scale(-1 1)\"\n                    fill=\"#7B16FF\"\n                  />\n                  <path\n                    id=\"Vector_20\"\n                    d=\"M 6.91534 13.8348C 10.7346 13.8348 13.8306 10.7377 13.8306 6.91733C 13.8306 3.09697 10.7346 -1.96373e-05 6.91534 -1.96373e-05C 3.09611 -1.96373e-05 -1.96315e-05 3.09697 -1.96315e-05 6.91733C -1.96315e-05 10.7377 3.09611 13.8348 6.91534 13.8348Z\"\n                    transform=\"matrix(-0.840223 -0.542274 -0.541726 0.840577 297.33 354.322)\"\n                    fill=\"#ACC7FF\"\n                  />\n                  <path\n                    id=\"Vector_21\"\n                    d=\"M 10.3593 64.8323L 73.5489 24.0435L 69.1273 17.2051C 57.8721 -0.252844 34.6383 -5.24085 17.1928 6.02235C -0.252703 17.2856 -5.23709 40.536 6.01805 57.994L 10.3593 64.8323Z\"\n                    transform=\"translate(313.068 278.925) scale(-1 1)\"\n                    fill=\"#ACC7FF\"\n                  />\n                  <path\n                    id=\"Vector_22\"\n                    d=\"M 7.42019 39.5256L 43.8386 16.0338L 39.8993 9.91947C 33.3874 -0.136962 19.9616 -3.03321 9.91238 3.48335C -0.136854 9.99992 -3.03103 23.4354 3.48087 33.4918L 7.42019 39.5256Z\"\n                    transform=\"translate(296.783 295.624) scale(-1 1)\"\n                    fill=\"#171A21\"\n                  />\n                  <path\n                    id=\"Union_2\"\n                    fillRule=\"evenodd\"\n                    clipRule=\"evenodd\"\n                    d=\"M 4.51709 13.3328C 2.60986 10.3733 3.46143 6.42773 6.4176 4.51978C 9.3739 2.61182 13.3168 3.46313 15.224 6.42236C 16.796 8.86157 16.4939 11.9707 14.6838 14.0566L 11.3196 8.85522C 10.7947 8.0437 9.71118 7.81128 8.89966 8.33618C 8.08813 8.86108 7.85571 9.94458 8.38062 10.7561L 11.7529 15.97C 9.09131 16.7949 6.10168 15.7913 4.51709 13.3328ZM 13.7007 18.9814C 9.36609 20.814 4.21375 19.323 1.57629 15.2307C -1.37756 10.6472 -0.0595703 4.53442 4.52161 1.57788C 9.10278 -1.37891 15.2109 -0.0588379 18.1648 4.52441C 20.788 8.59473 20.0422 13.8711 16.634 17.072L 27.3983 33.7148C 27.9232 34.5264 27.6908 35.6096 26.8793 36.1345C 26.0677 36.6594 24.9844 36.4272 24.4595 35.6155L 13.7007 18.9814Z\"\n                    transform=\"translate(317.704 258.247) scale(-1 1)\"\n                    fill=\"#EAA736\"\n                  />\n                  <path\n                    id=\"Vector_23\"\n                    d=\"M 8.12147 16.2477C 12.6068 16.2477 16.243 12.6106 16.243 8.12387C 16.243 3.63717 12.6068 0 8.12147 0C 3.6361 0 0 3.63717 0 8.12387C 0 12.6106 3.6361 16.2477 8.12147 16.2477Z\"\n                    transform=\"matrix(-0.840223 -0.542274 -0.541726 0.840577 304.684 320.094)\"\n                    fill=\"white\"\n                  />\n                  <path\n                    id=\"Vector_24\"\n                    d=\"M 8.12148 16.2478C 12.6069 16.2478 16.243 12.6106 16.243 8.12393C 16.243 3.63723 12.6069 9.81867e-06 8.12148 9.81867e-06C 3.63611 9.81867e-06 9.81577e-06 3.63723 9.81577e-06 8.12393C 9.81577e-06 12.6106 3.63611 16.2478 8.12148 16.2478Z\"\n                    transform=\"matrix(-0.840223 -0.542274 -0.541726 0.840577 286.831 308.584)\"\n                    fill=\"white\"\n                  />\n                  <path\n                    id=\"Vector_25\"\n                    d=\"M 0 5.63162C 0 5.63162 1.2059 0.965437 8.68253 1.96415e-05\"\n                    transform=\"translate(288.318 313.83) scale(-1 1)\"\n                    stroke=\"white\"\n                    strokeWidth=\"4\"\n                    strokeMiterlimit=\"10\"\n                  />\n                  <path\n                    id=\"Vector_26\"\n                    d=\"M 21.3848 -1.96415e-05C 27.2535 9.17145 27.2535 19.6301 21.3848 23.4113C 15.516 27.1926 5.94916 22.9286 9.81371e-06 13.7572L 21.3848 -1.96415e-05Z\"\n                    transform=\"translate(229.47 397.66) scale(-1 1)\"\n                    fill=\"#171A21\"\n                  />\n                  <path\n                    id=\"Vector_27\"\n                    d=\"M 172.445 1.80339C 127.264 -5.03499 86.9862 8.15907 50.407 31.49C 50.005 31.6509 49.6834 31.8118 49.2815 32.0532C 48.4775 32.6163 47.754 33.099 46.95 33.6622C 42.2068 36.7998 37.4636 40.0983 32.8007 43.5577C 15.516 55.7863 -1.96274e-05 66.7277 -1.96274e-05 66.7277L 17.2043 93.679L 51.3717 73.1638C 62.6268 66.4059 93.0158 49.5916 120.752 49.9938C 150.578 50.3961 180.163 70.5089 169.711 99.7933C 162.637 119.504 133.454 135.594 112.632 129.963C 91.5686 124.25 76.5349 113.309 76.4546 121.596C 76.3742 128.917 90.0412 138.651 97.8394 141.789C 107.647 145.731 109.496 147.099 94.0608 150.719C 66.4053 157.236 46.4677 170.43 46.0657 177.188C 45.6638 183.946 70.7466 168.579 83.5293 168.579C 89.6392 168.579 72.1134 172.039 56.0346 196.576C 48.8795 207.598 53.8639 208.966 65.6819 199.392C 82.4038 185.715 93.4177 176.705 96.6335 178.475C 99.8493 180.245 94.3021 182.98 88.6745 198.024C 79.2684 223.447 88.6745 225.861 97.4374 210.494C 106.2 195.048 118.581 180.164 122.118 181.934C 125.656 183.704 118.822 192.554 115.365 212.264C 113.677 222.16 116.812 237.043 125.495 213.391C 133.775 190.945 146.156 181.612 162.315 177.188C 223.817 160.293 239.172 135.836 247.854 112.183C 269.963 52.5683 225.103 9.76808 172.445 1.80339Z\"\n                    transform=\"translate(227.138 228.276) scale(-1 1)\"\n                    fill=\"#7B16FF\"\n                  />\n                  <path\n                    id=\"Vector_28\"\n                    d=\"M 6.27072 -1.96415e-05C 7.15506 1.68946 6.51189 3.86167 4.74322 4.74664C 3.05495 5.6316 0.884343 4.98797 9.81371e-06 3.21804\"\n                    transform=\"translate(296.599 320.829) scale(-1 1)\"\n                    stroke=\"#7415FC\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_29\"\n                    d=\"M 6.27073 3.92829e-05C 7.15507 1.68952 6.5119 3.86163 4.74323 4.7466C 3.05496 5.63156 0.884353 4.98803 1.96274e-05 3.2181\"\n                    transform=\"translate(278.751 309.324) scale(-1 1)\"\n                    stroke=\"#7415FC\"\n                    strokeWidth=\"2\"\n                    strokeMiterlimit=\"10\"\n                    strokeLinecap=\"round\"\n                  />\n                  <path\n                    id=\"Vector_30\"\n                    d=\"M 37.6244 43.0415L 47.0304 37.0077L 23.1535 0L -1.96274e-05 14.964C 3.53731 20.0324 15.8376 35.4791 37.6244 43.0415Z\"\n                    transform=\"translate(275.776 352.124) scale(-1 1)\"\n                    fill=\"white\"\n                  />\n                  <path\n                    id=\"Vector_31\"\n                    d=\"M 9.32569 0L 1.96274e-05 6.03386L 23.877 43.0415L 47.0304 28.158C 25.2437 20.5956 12.9434 5.14889 9.32569 0Z\"\n                    transform=\"translate(285.183 367.008) scale(-1 1)\"\n                    fill=\"#ACC7FF\"\n                  />\n                </g>\n              </g>\n              <g id=\"Group 5_6\">\n                <path\n                  id=\"Vector_32\"\n                  d=\"M 228.476 149.606C 234.689 141.939 239.515 132.885 240.239 123.106C 240.963 112.602 236.861 102.34 231.311 93.4066C 225.762 84.4727 218.704 76.565 212.672 67.9329C 211.104 65.6391 209.535 63.2245 209.174 60.5081C 208.51 55.3772 212.129 50.7895 215.085 46.5036C 220.695 38.4752 224.676 28.7566 223.47 19.0379C 220.755 -3.41754 196.204 -5.46994 183.296 10.0437C 176.902 17.7703 173.343 28.8773 175.514 38.777C 177.022 45.5982 180.762 51.7553 181.788 58.6972C 182.813 65.6391 179.435 74.0901 172.498 74.9955C 168.336 75.5388 164.234 73.0638 161.52 69.8042C 158.805 66.5445 157.116 62.6208 155.066 58.9386C 150.481 50.7291 143.303 43.4854 134.195 41.2519C 119.657 37.7508 104.939 48.1334 97.2781 61.0514C 93.3572 67.6311 90.7031 74.9351 86.7219 81.5148C 82.7407 88.0342 76.8896 94.0706 69.4098 95.7608C 66.5747 96.4248 63.4983 96.3644 60.9045 95.0364C 56.2598 92.6822 54.4502 86.9476 54.0883 81.7563C 53.7264 76.565 54.3296 71.1926 52.6406 66.3031C 48.1165 53.4455 31.2266 51.5742 19.8863 55.1357C 9.75233 58.335 -3.69927 68.4762 0.945449 80.4886C 4.92663 90.7506 17.8957 97.8735 27.9693 100.59C 29.4773 101.012 31.0457 101.797 31.5282 103.306C 32.0108 104.755 31.4076 106.324 30.4424 107.532C 27.9089 110.791 24.7119 113.447 25.6167 118.035C 26.4612 122.2 30.6837 125.581 34.9665 125.037C 40.2144 124.373 44.3766 122.019 45.8243 129.021C 48.4181 141.396 44.256 156.608 53.4851 165.18C 60.5426 171.759 72.3655 170.25 80.0866 164.516C 87.8077 158.781 92.5127 149.907 96.9765 141.396C 101.44 132.885 106.326 124.072 114.228 118.578C 117.003 116.707 121.105 115.379 123.397 117.854C 124.302 118.76 124.664 120.088 124.845 121.355C 126.353 131.677 116.701 141.034 117.848 151.417C 118.692 159.566 126.051 165.602 133.833 168.198C 141.554 170.793 149.878 170.854 157.961 172.242C 164.415 173.389 171.533 176.105 173.765 182.263C 175.756 187.756 173.102 193.732 170.99 199.165C 167.914 207.012 165.923 215.523 166.828 223.914C 167.733 232.305 171.895 240.635 179.013 245.162C 188.302 251.078 200.97 249.508 210.199 243.472C 219.428 237.435 225.641 227.777 230.105 217.696C 236.439 203.571 239.153 185.281 228.597 173.993C 225.219 170.431 220.393 167.172 220.393 162.222C 220.393 158.54 223.168 155.582 225.581 152.865C 226.606 151.839 227.571 150.753 228.476 149.606Z\"\n                  transform=\"translate(189.504 4.12622) scale(-1 1)\"\n                  fill=\"#1CD2F2\"\n                />\n                <path\n                  id=\"Vector_33\"\n                  d=\"M 50.3632 22.9232C 50.122 9.48785 38.7864 -3.5453 23.6724 0.879529C 8.31716 5.30436 -3.90271 20.8315 1.1621 37.2436C 5.82495 52.2076 23.5116 51.7248 34.8472 45.6105C 38.6257 43.5992 42.3238 41.1857 45.1376 37.8872C 48.9161 33.5428 50.524 28.1526 50.3632 22.9232Z\"\n                  transform=\"translate(113.903 208.674) scale(-1 1)\"\n                  fill=\"#1CD2F2\"\n                />\n              </g>\n            </g>\n          </g>\n        </g>\n      </g>\n    </InlineSvg>\n  </SvgWrapper>\n);\n"
  },
  {
    "path": "src/components/inboxThread/activity.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport MessageCount from './messageCount';\nimport { ThreadActivityWrapper } from './style';\n\ntype Props = {\n  currentUser: ?Object,\n  thread: GetThreadType,\n  active: boolean,\n};\n\nclass ThreadActivity extends React.Component<Props> {\n  render() {\n    const { thread, active, currentUser } = this.props;\n\n    if (!thread) return null;\n\n    return (\n      <ThreadActivityWrapper>\n        <MessageCount\n          currentUser={currentUser}\n          thread={thread}\n          active={active}\n        />\n      </ThreadActivityWrapper>\n    );\n  }\n}\n\nexport default ThreadActivity;\n"
  },
  {
    "path": "src/components/inboxThread/header/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport ThreadHeader from './threadHeader';\nimport UserProfileThreadHeader from './userProfileThreadHeader';\n\nexport type HeaderProps = {\n  thread: GetThreadType,\n  active: boolean,\n  currentUser: ?Object,\n  viewContext?:\n    | ?'inbox'\n    | 'communityInbox'\n    | 'communityProfile'\n    | 'channelInbox'\n    | 'channelProfile'\n    | 'userProfile'\n    | 'userProfileReplies',\n};\n\nclass Header extends React.Component<HeaderProps> {\n  render() {\n    if (\n      this.props.viewContext === 'userProfile' ||\n      this.props.viewContext === 'userProfileReplies'\n    ) {\n      return <UserProfileThreadHeader {...this.props} />;\n    }\n\n    return <ThreadHeader {...this.props} />;\n  }\n}\n\nexport default Header;\n"
  },
  {
    "path": "src/components/inboxThread/header/style.js",
    "content": "// @flow\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { zIndex } from 'src/components/globals';\n\nexport const Container = styled.div`\n  display: flex;\n  width: 100%;\n  margin-bottom: 8px;\n`;\n\nexport const MetaContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  width: 100%;\n`;\n\nexport const AuthorAvatarContainer = styled.span`\n  margin-right: 8px;\n  display: flex;\n  align-items: center;\n`;\n\nexport const TextRow = styled.span`\n  display: flex;\n  flex: 1 0 auto;\n  width: 100%;\n  align-items: center;\n`;\n\nconst metaTitleStyles = css`\n  font-size: 15px;\n  font-weight: 600;\n  line-height: 1.2;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.default};\n  pointer-events: auto;\n  position: relative;\n  z-index: ${zIndex.card};\n\n  &:hover {\n    cursor: pointer;\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.text.default};\n  }\n`;\n\nexport const MetaTitle = styled(Link)`\n  ${metaTitleStyles};\n`;\n\nexport const MetaTitleText = styled.span`\n  ${metaTitleStyles} &:hover {\n    cursor: auto;\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.text.alt};\n  }\n`;\n\nconst metaSubtitleStyles = css`\n  font-size: 15px;\n  font-weight: 400;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.alt};\n  line-height: 1.2;\n  pointer-events: auto;\n  position: relative;\n  z-index: ${zIndex.card};\n\n  &:hover {\n    cursor: pointer;\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.text.default};\n  }\n`;\n\nexport const MetaSubtitle = styled(Link)`\n  ${metaSubtitleStyles};\n`;\n\nexport const MetaSubtitleText = styled.span`\n  display: flex;\n\n  ${metaSubtitleStyles} &:hover {\n    cursor: auto;\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.text.alt};\n  }\n`;\n\nexport const Timestamp = styled(MetaTitleText)`\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.alt};\n  font-weight: 400;\n`;\n\nexport const NewThreadTimestamp = styled(MetaSubtitleText)`\n  margin-left: 4px;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.brand.default};\n`;\n\nexport const MetaSubtitlePinned = styled(MetaSubtitleText)`\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.special.default};\n\n  &:hover {\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.special.default};\n  }\n`;\n\nexport const MetaSubtitleLocked = styled(MetaSubtitleText)`\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.secondary};\n\n  &:hover {\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.text.secondary};\n  }\n`;\n\nexport const MetaSubtitleWatercooler = styled(MetaSubtitleText)`\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.space.default};\n\n  &:hover {\n    color: ${props =>\n      props.active ? props.theme.text.reverse : props.theme.space.default};\n  }\n`;\n\nexport const Divider = styled.span`\n  margin: 0 4px;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.placeholder};\n`;\n\nexport const Dot = styled.span`\n  width: 8px;\n  height: 8px;\n  border-radius: 8px;\n  background-color: ${props => props.color(props.theme)};\n  margin-right: 8px;\n`;\n"
  },
  {
    "path": "src/components/inboxThread/header/threadHeader.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { UserHoverProfile } from 'src/components/hoverProfile';\nimport {\n  Container,\n  MetaContainer,\n  TextRow,\n  MetaTitle,\n  MetaTitleText,\n  MetaSubtitle,\n  Divider,\n  MetaSubtitleLocked,\n  MetaSubtitleWatercooler,\n  MetaSubtitlePinned,\n} from './style';\nimport Timestamp from './timestamp';\nimport type { HeaderProps } from './index';\n\nclass Header extends React.Component<HeaderProps> {\n  render() {\n    const {\n      active,\n      viewContext,\n      thread: { author, community, channel, id, watercooler, isLocked },\n    } = this.props;\n\n    const isPinned = id === community.pinnedThreadId;\n    return (\n      <Container active={active}>\n        <MetaContainer>\n          <TextRow>\n            {author.user.username ? (\n              <UserHoverProfile username={author.user.username}>\n                <MetaTitle\n                  active={active ? 'true' : undefined}\n                  to={`/users/${author.user.username}`}\n                >\n                  {author.user.name}\n                </MetaTitle>\n              </UserHoverProfile>\n            ) : (\n              <MetaTitleText active={active ? 'true' : undefined}>\n                {author.user.name}\n              </MetaTitleText>\n            )}\n\n            <Divider>·</Divider>\n            <Timestamp {...this.props} />\n\n            {watercooler && (\n              <MetaSubtitleWatercooler active={active ? 'true' : undefined}>\n                <Divider>·</Divider>\n                Watercooler\n              </MetaSubtitleWatercooler>\n            )}\n\n            {isLocked && (\n              <MetaSubtitleLocked active={active ? 'true' : undefined}>\n                <Divider>·</Divider>\n                Locked\n              </MetaSubtitleLocked>\n            )}\n\n            {isPinned && (\n              <MetaSubtitlePinned active={active ? 'true' : undefined}>\n                <Divider>·</Divider>\n                Pinned\n              </MetaSubtitlePinned>\n            )}\n          </TextRow>\n\n          <TextRow>\n            {viewContext !== 'channelProfile' &&\n              viewContext !== 'channelInbox' &&\n              viewContext !== 'communityProfile' &&\n              viewContext !== 'communityInbox' && (\n                <MetaSubtitle\n                  active={active ? 'true' : undefined}\n                  to={`/${community.slug}`}\n                >\n                  {community.name}\n                  <Divider>·</Divider>\n                </MetaSubtitle>\n              )}\n\n            <MetaSubtitle\n              active={active ? 'true' : undefined}\n              to={`/${community.slug}/${channel.slug}`}\n            >\n              # {channel.name}\n            </MetaSubtitle>\n          </TextRow>\n        </MetaContainer>\n      </Container>\n    );\n  }\n}\n\nexport default Header;\n"
  },
  {
    "path": "src/components/inboxThread/header/timestamp.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { timeDifferenceShort } from 'shared/time-difference';\nimport { Timestamp } from './style';\nimport type { HeaderProps } from './index';\n\nclass ThreadTimestamp extends React.Component<HeaderProps> {\n  render() {\n    const { thread, active } = this.props;\n\n    const now = new Date().getTime();\n    const then = thread.lastActive || thread.createdAt;\n    let timestamp = timeDifferenceShort(now, new Date(then).getTime());\n    // show 'just now' instead of '0s' for new threads\n    if (timestamp.slice(-1) === 's') {\n      timestamp = 'Just now';\n    }\n\n    return (\n      <React.Fragment>\n        <Timestamp active={active}>{timestamp}</Timestamp>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default ThreadTimestamp;\n"
  },
  {
    "path": "src/components/inboxThread/header/userProfileThreadHeader.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { UserHoverProfile } from 'src/components/hoverProfile';\nimport {\n  Container,\n  MetaContainer,\n  TextRow,\n  MetaTitle,\n  MetaSubtitle,\n  Divider,\n  MetaSubtitleText,\n  MetaSubtitleLocked,\n  MetaSubtitleWatercooler,\n  MetaSubtitlePinned,\n} from './style';\nimport Timestamp from './timestamp';\nimport type { HeaderProps } from './index';\n\nclass Header extends React.Component<HeaderProps> {\n  render() {\n    const {\n      active,\n      viewContext,\n      thread: { community, channel, id, watercooler, isLocked, author },\n    } = this.props;\n\n    const isPinned = id === community.pinnedThreadId;\n\n    return (\n      <Container active={active}>\n        <MetaContainer>\n          <TextRow>\n            <MetaTitle active={active} to={`/${community.slug}`}>\n              {community.name}\n            </MetaTitle>\n\n            <Divider>·</Divider>\n            <Timestamp {...this.props} />\n          </TextRow>\n\n          <TextRow>\n            {viewContext === 'userProfileReplies' && (\n              <MetaSubtitleText>\n                {author.user.username ? (\n                  <UserHoverProfile username={author.user.username}>\n                    <MetaSubtitle\n                      active={active}\n                      to={`/users/${author.user.username}`}\n                    >\n                      By {author.user.name}\n                    </MetaSubtitle>\n                  </UserHoverProfile>\n                ) : (\n                  <MetaSubtitleText active={active}>\n                    By {author.user.name}\n                  </MetaSubtitleText>\n                )}\n\n                <Divider>·</Divider>\n              </MetaSubtitleText>\n            )}\n\n            <MetaSubtitle\n              active={active}\n              to={`/${community.slug}/${channel.slug}`}\n            >\n              # {channel.name}\n            </MetaSubtitle>\n\n            {watercooler && (\n              <MetaSubtitleWatercooler active={active}>\n                <Divider>·</Divider>\n                Watercooler\n              </MetaSubtitleWatercooler>\n            )}\n\n            {isLocked && (\n              <MetaSubtitleLocked active={active}>\n                <Divider>·</Divider>\n                Locked\n              </MetaSubtitleLocked>\n            )}\n\n            {isPinned && (\n              <MetaSubtitlePinned active={active}>\n                <Divider>·</Divider>\n                Pinned\n              </MetaSubtitlePinned>\n            )}\n          </TextRow>\n        </MetaContainer>\n      </Container>\n    );\n  }\n}\n\nexport default Header;\n"
  },
  {
    "path": "src/components/inboxThread/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Header from './header';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport type { ThreadInfoType } from 'shared/graphql/fragments/thread/threadInfo';\nimport type { Dispatch } from 'redux';\nimport {\n  InboxThreadItem,\n  InboxLinkWrapper,\n  InboxThreadContent,\n  ThreadTitle,\n  ThreadSnippet,\n  Column,\n  AvatarLink,\n  CommunityAvatarLink,\n} from './style';\nimport { UserAvatar, CommunityAvatar } from 'src/components/avatar';\nimport ThreadActivity from './activity';\nimport { ErrorBoundary } from 'src/components/error';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport getSnippet from 'shared/clients/draft-js/utils/getSnippet';\nimport truncate from 'shared/truncate';\n\ntype Props = {\n  active: boolean,\n  dispatch: Dispatch<Object>,\n  history: Object,\n  location: Object,\n  match: Object,\n  staticContext: ?string,\n  data: ThreadInfoType,\n  viewContext?:\n    | ?'inbox'\n    | 'communityInbox'\n    | 'communityProfile'\n    | 'channelInbox'\n    | 'channelProfile'\n    | 'userProfile'\n    | 'userProfileReplies',\n  currentUser: ?Object,\n};\n\nclass InboxThread extends React.Component<Props> {\n  render() {\n    const {\n      data: thread,\n      active,\n      viewContext = null,\n      currentUser,\n    } = this.props;\n\n    return (\n      <ErrorBoundary>\n        <InboxThreadItem data-cy=\"thread-card\" active={active}>\n          <InboxLinkWrapper\n            to={{\n              pathname: getThreadLink(thread),\n              state: { modal: false },\n            }}\n          />\n\n          <InboxThreadContent>\n            {viewContext !== 'userProfile' &&\n              viewContext !== 'userProfileReplies' && (\n                <AvatarLink>\n                  <UserAvatar\n                    onlineBorderColor={active ? theme => theme.brand.alt : null}\n                    user={thread.author.user}\n                    size={40}\n                  />\n                </AvatarLink>\n              )}\n\n            {(viewContext === 'userProfile' ||\n              viewContext === 'userProfileReplies') && (\n              <CommunityAvatarLink>\n                <CommunityAvatar community={thread.community} size={40} />\n              </CommunityAvatarLink>\n            )}\n\n            <Column>\n              <ErrorBoundary>\n                <Header\n                  thread={thread}\n                  active={active}\n                  viewContext={viewContext}\n                  currentUser={currentUser}\n                />\n              </ErrorBoundary>\n\n              <ThreadTitle active={active}>\n                {truncate(thread.content.title, 80)}\n              </ThreadTitle>\n\n              <ThreadSnippet active={active}>\n                {getSnippet(JSON.parse(thread.content.body))}\n              </ThreadSnippet>\n\n              <ErrorBoundary>\n                <ThreadActivity\n                  thread={thread}\n                  active={active}\n                  currentUser={currentUser}\n                />\n              </ErrorBoundary>\n            </Column>\n          </InboxThreadContent>\n        </InboxThreadItem>\n      </ErrorBoundary>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  withCurrentUser,\n  connect()\n)(InboxThread);\n"
  },
  {
    "path": "src/components/inboxThread/messageCount.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport Icon from 'src/components/icon';\nimport { CountWrapper } from './style';\n\ntype Props = {\n  currentUser: ?Object,\n  thread: GetThreadType,\n  active: boolean,\n};\n\nclass MessageCount extends React.Component<Props> {\n  render() {\n    const {\n      thread: { messageCount },\n      active,\n    } = this.props;\n\n    return (\n      <CountWrapper active={active}>\n        <Icon\n          style={{ pointerEvents: 'none' }}\n          glyph=\"message-simple\"\n          size={24}\n        />\n        <span>{messageCount}</span>\n      </CountWrapper>\n    );\n  }\n}\n\nexport default MessageCount;\n"
  },
  {
    "path": "src/components/inboxThread/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { zIndex } from 'src/components/globals';\n\nexport const InboxThreadItem = styled.div`\n  display: flex;\n  flex-direction: column;\n  max-width: 100%;\n  min-width: 0;\n  overflow-x: hidden;\n  border-bottom: 1px solid\n    ${props => (props.active ? props.theme.brand.alt : props.theme.bg.divider)};\n  background: ${props =>\n    props.active ? props.theme.brand.alt : props.theme.bg.default};\n  position: relative;\n  padding: 12px 20px 12px 12px;\n\n  &:hover {\n    background: ${props =>\n      props.active ? props.theme.brand.alt : props.theme.bg.wash};\n  }\n\n  &:last-of-type {\n    border-bottom: 1px solid\n      ${props =>\n        props.active ? props.theme.brand.alt : props.theme.bg.divider};\n  }\n`;\n\nexport const InboxLinkWrapper = styled(Link)`\n  position: absolute;\n  display: inline-block;\n  height: 100%;\n  width: 100%;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: ${zIndex.card};\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nexport const InboxThreadContent = styled.div`\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-start;\n  align-self: stretch;\n  position: relative;\n  z-index: ${zIndex.card + 1};\n  align-items: flex-start;\n  pointer-events: none;\n`;\n\nexport const Column = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  align-items: flex-start;\n`;\n\nexport const ThreadTitle = styled.h3`\n  font-size: 15px;\n  font-weight: 600;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.default};\n  max-width: 100%;\n  line-height: 1.4;\n`;\n\nexport const ThreadSnippet = styled.h4`\n  font-size: 15px;\n  font-weight: 400;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.default};\n  max-width: 100%;\n  line-height: 1.4;\n  margin-top: 4px;\n  word-break: break-word;\n  white-space: pre-line;\n`;\n\nexport const ThreadActivityWrapper = styled.div`\n  display: flex;\n  margin-top: 8px;\n  align-items: center;\n  pointer-events: none;\n\n  .icon {\n    &:hover {\n      cursor: pointer;\n    }\n  }\n`;\n\nexport const ThreadStatusWrapper = styled(ThreadActivityWrapper)`\n  flex: auto;\n  justify-content: flex-start;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.alt};\n\n  .icon {\n    pointer-events: auto;\n\n    &:hover {\n      cursor: pointer;\n    }\n  }\n`;\n\nexport const CountWrapper = styled.div`\n  display: flex;\n  flex: none;\n  font-size: 13px;\n  pointer-events: none;\n  color: ${props =>\n    props.active ? props.theme.text.reverse : props.theme.text.alt};\n  font-weight: 500;\n  align-items: center;\n\n  .icon {\n    margin-right: 4px;\n  }\n\n  a {\n    font-weight: 600;\n  }\n\n  a:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nconst avatarLinkStyles = css`\n  display: flex;\n  flex: 1 0 auto;\n  margin-right: 12px;\n  margin-top: 4px;\n  pointer-events: auto;\n  max-width: 40px;\n`;\n\nexport const AvatarLink = styled.div`\n  ${avatarLinkStyles} border-radius: 32px;\n`;\n\nexport const CommunityAvatarLink = styled.div`\n  ${avatarLinkStyles} border-radius: 4px;\n`;\n"
  },
  {
    "path": "src/components/infiniteScroll/deduplicateChildren.js",
    "content": "// @flow\nexport const deduplicateChildren = (\n  array: Array<any>,\n  prop: string\n): Array<any> => {\n  if (!array || !Array.isArray(array) || array.length === 0) return array;\n\n  return array.filter((obj, pos, arr) => {\n    return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;\n  });\n};\n"
  },
  {
    "path": "src/components/infiniteScroll/index.js",
    "content": "// @flow\nimport React from 'react';\nimport InfiniteScroll from 'react-infinite-scroller-fork-mxstbr';\nimport { useAppScroller } from 'src/hooks/useAppScroller';\n\ntype Props = {\n  loadMore: Function,\n  hasMore: boolean,\n  loader: React$Node,\n  isReverse?: boolean,\n};\n\n/*\n  Because route modals (like the thread modal) share the same scroll container \n  as all other views, we want to make sure that if a modal is open that we\n  aren't performing unnecessary pagination in the background\n*/\nconst InfiniteScroller = (props: Props) => {\n  const { ref } = useAppScroller();\n\n  return (\n    <InfiniteScroll\n      useWindow={false}\n      initialLoad={false}\n      threshold={750}\n      getScrollParent={() => ref}\n      {...props}\n    />\n  );\n};\n\nexport default InfiniteScroller;\n"
  },
  {
    "path": "src/components/infiniteScroll/tallViewports.js",
    "content": "// @flow\nexport const fetchMoreOnInfiniteScrollLoad = (\n  scrollElement: any,\n  infiniteScrollerClass: string\n): boolean => {\n  if (!scrollElement) return false;\n  if (!window) return false;\n  if (!infiniteScrollerClass) return false;\n\n  let infiniteScroller = null;\n  const nodes = document.getElementsByClassName(infiniteScrollerClass);\n  if (!nodes || nodes.length === 0) return false;\n  infiniteScroller = nodes[0];\n\n  const windowHeight = window.innerHeight;\n\n  const scrollContainerHeight = scrollElement.clientHeight;\n\n  const infiniteScrollHeight = infiniteScroller.clientHeight;\n\n  if (\n    infiniteScrollHeight > windowHeight ||\n    infiniteScrollHeight > scrollContainerHeight\n  ) {\n    return false;\n  }\n\n  if (scrollContainerHeight > infiniteScrollHeight) {\n    return true;\n  }\n\n  return false;\n};\n"
  },
  {
    "path": "src/components/layout/index.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\n\nexport const NAVBAR_WIDTH = 72;\nexport const NAVBAR_EXPANDED_WIDTH = 256;\nexport const MIN_PRIMARY_COLUMN_WIDTH = 600;\nexport const MIN_SECONDARY_COLUMN_WIDTH = 320;\nexport const MAX_PRIMARY_COLUMN_WIDTH = 968;\nexport const MAX_SECONDARY_COLUMN_WIDTH = 400;\nexport const COL_GAP = 24;\nexport const TITLEBAR_HEIGHT = 62;\nexport const MIN_MAX_WIDTH =\n  MIN_PRIMARY_COLUMN_WIDTH + MIN_SECONDARY_COLUMN_WIDTH + COL_GAP;\nexport const MAX_WIDTH =\n  MAX_PRIMARY_COLUMN_WIDTH + MAX_SECONDARY_COLUMN_WIDTH + COL_GAP;\nexport const MIN_WIDTH_TO_EXPAND_NAVIGATION = MAX_WIDTH + 256;\nexport const SINGLE_COLUMN_WIDTH = MAX_WIDTH;\n// add 144 (72 * 2) to account for the left side nav\nexport const MEDIA_BREAK =\n  MIN_PRIMARY_COLUMN_WIDTH +\n  MIN_SECONDARY_COLUMN_WIDTH +\n  COL_GAP +\n  NAVBAR_WIDTH * 2;\n\n/* \n  do not remove this className.\n  see `src/routes.js` for an explanation of what's going on here\n*/\nexport const ViewGrid = styled.main.attrs({\n  id: 'main',\n  className: 'view-grid',\n})`\n  display: grid;\n  grid-area: main;\n  height: 100%;\n  max-height: calc(100vh - 48px);\n  overflow: hidden;\n  overflow-y: auto;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    max-height: calc(100vh - ${TITLEBAR_HEIGHT}px - 48px);\n  }\n`;\n\n/*\n┌──┬────────┬──┐\n│  │   xx   │  │\n│  │        │  │\n│  │   xx   │  │\n│  │        │  │\n│  │   xx   │  │\n└──┴────────┴──┘\n*/\nexport const SingleColumnGrid = styled.div`\n  display: grid;\n  justify-self: center;\n  grid-template-columns: ${MIN_MAX_WIDTH}px;\n  grid-template-areas: 'primary';\n  background: ${theme.bg.default};\n  overflow-y: auto;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n    max-width: 100%;\n    grid-template-columns: 1fr;\n    border-left: 0;\n    border-right: 0;\n  }\n`;\n\n/*\n┌──┬────┬─┬─┬──┐\n│  │ xx │ │x│  │\n│  │    │ │ │  │\n│  │ xx │ │x│  │\n│  │    │ │ │  │\n│  │ xx │ │x│  │\n└──┴────┴─┴─┴──┘\n*/\nexport const PrimarySecondaryColumnGrid = styled.div`\n  display: grid;\n  justify-self: center;\n  grid-template-columns:\n    minmax(${MIN_PRIMARY_COLUMN_WIDTH}px, ${MAX_PRIMARY_COLUMN_WIDTH}px)\n    minmax(${MIN_SECONDARY_COLUMN_WIDTH}px, ${MAX_SECONDARY_COLUMN_WIDTH}px);\n  grid-template-rows: 100%;\n  grid-template-areas: 'primary secondary';\n  grid-gap: ${COL_GAP}px;\n  max-width: ${MAX_WIDTH}px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-columns: 1fr;\n    grid-template-rows: min-content 1fr;\n    grid-gap: 0;\n    min-width: 100%;\n  }\n`;\n\n/*\n┌──┬─┬─┬────┬──┐\n│  │x│ │ xx │  │\n│  │ │ │    │  │\n│  │x│ │ xx │  │\n│  │ │ │    │  │\n│  │x│ │ xx │  │\n└──┴─┴─┴────┴──┘\n*/\nexport const SecondaryPrimaryColumnGrid = styled.div`\n  display: grid;\n  justify-self: center;\n  grid-template-columns:\n    minmax(${MIN_SECONDARY_COLUMN_WIDTH}px, ${MAX_SECONDARY_COLUMN_WIDTH}px)\n    minmax(${MIN_PRIMARY_COLUMN_WIDTH}px, ${MAX_PRIMARY_COLUMN_WIDTH}px);\n  grid-template-rows: 100%;\n  grid-template-areas: 'secondary primary';\n  grid-gap: ${COL_GAP}px;\n  max-width: ${MAX_WIDTH}px;\n  margin: 0 24px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-columns: 1fr;\n    grid-template-rows: 1fr;\n    grid-gap: 0;\n    min-width: 100%;\n    max-width: 100%;\n  }\n`;\n\n/*\n┌─────────────┐\n│             │\n│    ┌───┐    │\n│    │ x │    │\n│    └───┘    │\n│             │\n└─────────────┘\n*/\nexport const CenteredGrid = styled.div`\n  display: grid;\n  justify-self: center;\n  grid-template-columns: ${MAX_WIDTH}px;\n  align-self: center;\n  max-width: ${MAX_PRIMARY_COLUMN_WIDTH}px;\n  grid-template-columns: minmax(\n    ${MIN_PRIMARY_COLUMN_WIDTH}px,\n    ${MAX_PRIMARY_COLUMN_WIDTH}px\n  );\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    align-self: flex-start;\n    width: 100%;\n    max-width: 100%;\n    grid-template-columns: 1fr;\n    height: calc(100vh - ${TITLEBAR_HEIGHT}px - 48px);\n  }\n`;\n\nexport const PrimaryColumn = styled.section`\n  border-left: 1px solid ${theme.bg.border};\n  border-right: 1px solid ${theme.bg.border};\n  border-bottom: 1px solid ${theme.bg.border};\n  border-radius: 0 0 4px 4px;\n  height: 100%;\n  max-width: ${props =>\n    !props.fullWidth ? `${MAX_PRIMARY_COLUMN_WIDTH}px` : 'none'};\n  grid-area: primary;\n  display: grid;\n  grid-template-rows: 1fr;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-left: 0;\n    border-right: 0;\n    border-bottom: 0;\n    grid-column-start: 1;\n    max-width: 100vw;\n    height: calc(100vh - ${TITLEBAR_HEIGHT}px - 48px);\n  }\n`;\n\nexport const SecondaryColumn = styled.section`\n  height: calc(100vh - 48px);\n  overflow: hidden;\n  overflow-y: auto;\n  position: sticky;\n  top: 0;\n  padding-bottom: 48px;\n  grid-area: secondary;\n\n  &::-webkit-scrollbar {\n    width: 0px;\n    height: 0px;\n    background: transparent; /* make scrollbar transparent */\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    height: calc(100vh - ${TITLEBAR_HEIGHT}px - 48px);\n    display: none;\n  }\n`;\n"
  },
  {
    "path": "src/components/listItems/channel/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport {\n  ChannelContainer,\n  ChannelNameLink,\n  ChannelName,\n  ChannelActions,\n} from './style';\nimport type { ChannelInfoType } from 'shared/graphql/fragments/channel/channelInfo';\n\ntype Props = {\n  children: React$Node,\n  channel: ChannelInfoType,\n};\n\nclass ChannelListItem extends React.Component<Props> {\n  render() {\n    const { channel, children } = this.props;\n\n    return (\n      <ChannelContainer>\n        <ChannelNameLink to={`/${channel.community.slug}/${channel.slug}`}>\n          <ChannelName>{channel.name}</ChannelName>\n        </ChannelNameLink>\n\n        {children && <ChannelActions>{children}</ChannelActions>}\n      </ChannelContainer>\n    );\n  }\n}\n\nexport default ChannelListItem;\n"
  },
  {
    "path": "src/components/listItems/channel/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { Truncate } from 'src/components/globals';\nimport { Link } from 'react-router-dom';\n\nexport const ChannelContainer = styled.div`\n  display: flex;\n  align-items: center;\n  flex: 1;\n  justify-content: space-between;\n  color: ${theme.text.secondary};\n  min-width: 0;\n\n  border-top: 1px solid ${theme.bg.wash};\n\n  &:first-of-type {\n    border-top: 0;\n  }\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n\n  .icon {\n    color: ${theme.text.alt};\n  }\n`;\n\nexport const ChannelNameLink = styled(Link)`\n  display: flex;\n  align-items: center;\n  flex: 1;\n  padding: 8px 0;\n  min-width: 0;\n`;\n\nexport const ChannelName = styled.span`\n  font-size: 16px;\n  font-weight: 600;\n  color: ${theme.text.default};\n\n  ${Truncate};\n`;\n\nexport const ChannelActions = styled.div`\n  display: flex;\n  align-items: center;\n  flex: 0 1 auto;\n  min-width: 0;\n\n  a {\n    display: flex;\n    align-items: center;\n  }\n`;\n"
  },
  {
    "path": "src/components/listItems/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport Badge from 'src/components/badges';\nimport { UserAvatar, CommunityAvatar } from 'src/components/avatar';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport ChannelComponent from './channel';\nimport {\n  Wrapper,\n  Col,\n  Row,\n  Heading,\n  Meta,\n  Description,\n  ActionContainer,\n} from './style';\n\ntype CommunityProps = {\n  community: CommunityInfoType,\n  showDescription?: boolean,\n  showMeta?: boolean,\n  meta?: any,\n  children?: any,\n  showHoverProfile?: boolean,\n};\n\nexport class CommunityListItem extends React.Component<CommunityProps> {\n  render() {\n    const { community, showDescription, children } = this.props;\n\n    return (\n      <Wrapper>\n        <Row>\n          <CommunityAvatar\n            community={community}\n            size={32}\n            showHoverProfile={false}\n            isClickable={false}\n          />\n          <Col style={{ marginLeft: '12px' }}>\n            <Heading>{community.name}</Heading>\n          </Col>\n          <ActionContainer className={'action'}>{children}</ActionContainer>\n        </Row>\n        {showDescription && <Description>{community.description}</Description>}\n      </Wrapper>\n    );\n  }\n}\n\ntype CardProps = {\n  isClickable?: boolean,\n  contents: any,\n  meta?: string,\n  children?: any,\n};\n\nexport const ThreadListItem = (props: CardProps): React$Element<any> => {\n  return (\n    <Wrapper isClickable={props.isClickable}>\n      <Row>\n        <Col>\n          <Heading>{props.contents.content.title}</Heading>\n          <Meta>{props.meta}</Meta>\n        </Col>\n      </Row>\n    </Wrapper>\n  );\n};\n\nexport const UserListItem = ({\n  user,\n  children,\n  hideRep = false,\n}: Object): React$Element<any> => {\n  const role =\n    user.contextPermissions && user.contextPermissions.isOwner\n      ? 'Admin'\n      : user.contextPermissions && user.contextPermissions.isModerator\n      ? 'Moderator'\n      : null;\n\n  return (\n    <Wrapper border>\n      <Row>\n        <UserAvatar user={user} size={40} />\n        <Col\n          style={{\n            marginLeft: '16px',\n            display: 'flex',\n            justifyContent: 'center',\n            flexDirection: 'column',\n          }}\n        >\n          <Heading>\n            {user.username ? (\n              <Link to={`/users/${user.username}`}>{user.name}</Link>\n            ) : (\n              <span>{user.name}</span>\n            )}\n            {role && <Badge type={role} />}\n          </Heading>\n        </Col>\n        <ActionContainer className={'action'}>{children}</ActionContainer>\n      </Row>\n    </Wrapper>\n  );\n};\n\nexport const ChannelListItem = ChannelComponent;\n"
  },
  {
    "path": "src/components/listItems/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Link } from 'react-router-dom';\nimport { MEDIA_BREAK } from 'src/components/layout';\nimport {\n  Truncate,\n  FlexCol,\n  FlexRow,\n  H3,\n  H4,\n  Transition,\n} from 'src/components/globals';\n\nexport const Wrapper = styled(FlexCol)`\n  flex: 1 0 auto;\n  padding: 12px 0;\n  justify-content: center;\n  max-width: 100%;\n  border-top: 1px solid\n    ${props => (props.border ? props.theme.bg.border : 'transparent')};\n\n  &:first-of-type {\n    border-top: 0;\n  }\n\n  &:last-of-type:not(:first-of-type) {\n    padding-bottom: 0;\n  }\n\n  &:hover > div > div h3,\n  &:hover .action {\n    color: ${props => (props.isClickable ? props.theme.brand.alt : '')};\n  }\n`;\n\nexport const WrapperLi = styled.li`\n  display: flex;\n  flex-direction: column;\n  flex: 0 0 auto;\n  padding: 8px 0;\n  justify-content: center;\n  max-width: 100%;\n  list-style-type: none;\n`;\n\nexport const Col = styled(FlexCol)`\n  flex: auto;\n  min-width: 0;\n`;\n\nexport const Row = styled(FlexRow)`\n  flex: 1 0 auto;\n  align-items: flex-center;\n\n  a {\n    display: flex;\n    align-items: center;\n  }\n`;\n\nexport const Heading = styled(H3)`\n  font-weight: 500;\n  font-size: 16px;\n  transition: ${Transition.hover.off};\n  line-height: 1.2;\n  display: flex;\n  align-items: center;\n  ${Truncate};\n\n  > div {\n    color: ${theme.text.alt};\n    margin-right: 4px;\n  }\n`;\n\nexport const Meta = styled(H4)`\n  font-size: 14px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n\n  a {\n    display: inline-block;\n  }\n\n  ${props => (props.nowrap ? Truncate() : '')};\n`;\n\nexport const ActionContainer = styled(FlexCol)`\n  justify-content: center;\n  align-items: center;\n  color: ${theme.text.placeholder};\n  transition: ${Transition.hover.off};\n`;\n\nexport const StyledCard = styled.div`\n  flex-direction: column;\n  display: ${props => (props.smallOnly ? 'none' : 'flex')};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: ${props => (props.largeOnly ? 'none' : 'flex')};\n  }\n`;\n\nexport const ListHeading = styled(H3)`\n  font-weight: 500;\n  font-size: 18px;\n  padding: 16px;\n  padding-left: 0;\n  color: ${theme.text.default};\n`;\n\nexport const ListContainer = styled(FlexCol)`\n  align-items: stretch;\n  width: 100%;\n`;\n\nexport const MoreLink = styled(Link)`\n  display: flex;\n  align-items: center;\n  font-size: 14px;\n  font-weight: 700;\n  line-height: 1;\n  color: ${theme.text.alt};\n  transition: ${Transition.hover.off};\n  padding: 0;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n\n  > div {\n    margin-right: 12px;\n  }\n`;\n\nexport const ListFooter = styled(FlexRow)`\n  padding-top: 8px;\n  border-top: 2px solid ${theme.bg.wash};\n  justify-content: flex-start;\n  width: 100%;\n`;\n\nexport const ListHeader = styled(FlexRow)`\n  justify-content: space-between;\n  width: 100%;\n  border-bottom: 2px solid ${theme.bg.border};\n  margin-top: ${props => (props.secondary ? '24px' : '0')};\n`;\n\nexport const LargeListHeading = styled(H3)`\n  font-weight: 800;\n  font-size: 20px;\n  color: ${theme.text.default};\n`;\nexport const Description = styled.div`\n  margin-top: 8px;\n  font-weight: 400;\n  font-size: 14px;\n  line-height: 1.4;\n  color: ${theme.text.alt};\n\n  strong {\n    font-weight: 600;\n    color: ${theme.text.default};\n  }\n\n  &:last-of-type {\n    margin-bottom: 16px;\n  }\n\n  &:only-of-type {\n    margin-bottom: 0;\n  }\n`;\n\nexport const Notice = styled(Description)`\n  padding: 8px 12px;\n  margin: 16px 0;\n  border-radius: 4px;\n  background: #fff1cc;\n  border: 1px solid #ffd566;\n  color: #715818;\n\n  a {\n    text-decoration: underline;\n  }\n\n  strong {\n    font-weight: 600;\n  }\n`;\n\nexport const InlineIcon = styled.span`\n  position: relative;\n  top: 2px;\n`;\n\nexport const BadgeContainer = styled(FlexCol)`\n  justify-content: center;\n  flex: 0 0 40px;\n  margin-right: 8px;\n`;\n\nexport const Lock = styled.span`\n  color: ${theme.text.alt};\n  position: relative;\n  top: 2px;\n  margin-left: -2px;\n  margin-right: 4px;\n`;\n"
  },
  {
    "path": "src/components/loading/index.js",
    "content": "// @flow\nimport React from 'react';\nimport branch from 'recompose/branch';\nimport renderComponent from 'recompose/renderComponent';\nimport styled from 'styled-components';\nimport { Spinner, FlexCol } from '../globals';\nimport { Card } from '../card';\nimport { ThreadViewContainer, Detail, Content } from '../../views/thread/style';\nimport {\n  ShimmerList,\n  ShimmerListLite,\n  ShimmerInboxThread,\n  ShimmerThread,\n  ShimmerThreadDetail,\n  ShimmerThreadContent,\n  ShimmerProfile,\n  ShimmerProfileLite,\n  ShimmerListItem,\n  ShimmerDM,\n  ShimmerInboxComposer,\n  ShimmerComposer,\n  ShimmerBase,\n  ShimmerLine,\n  ShimmerSelect,\n  StyledErrorSelect,\n  Cover,\n  CircularCover,\n  LoadingOverlay,\n  LoadingNavbarContainer,\n  LogoLink,\n  Logo,\n} from './style';\n\n/*\n  Creates a container that fills the width and height of its parent\n  and absolutely centers a loading spinner inside.\n\n  Loading spinner takes a size and color.\n*/\nconst LoadingContainer = styled.div`\n  display: flex;\n  flex: auto;\n  align-self: stretch;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n`;\n\nconst LoadingCardContainer = styled(Card)`\n  flex: 1 1 auto;\n  align-self: stretch;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  padding: 1rem;\n`;\n\n/*\n  Outputs a spinner only with a transparent background that will fill to the width\n  and height of its parent. Useful for inline spinners.\n*/\nexport const Loading = ({\n  size,\n  color,\n  ...rest\n}: {\n  size?: number,\n  color?: string,\n}): React$Element<any> => (\n  <LoadingContainer {...rest}>\n    <Spinner size={size} color={color} />\n  </LoadingContainer>\n);\n\n/*\n  Outputs a spinner on top of a card. The card will fill the size of its parent.\n  Useful for adding loading states to threads, profile components, the composer,\n  etc\n*/\nexport const LoadingCard = ({\n  size,\n  color,\n}: {\n  size?: Number,\n  color?: String,\n}): React$Element<any> => (\n  <LoadingCardContainer>\n    <Spinner size={size} color={color} />\n  </LoadingCardContainer>\n);\n\nexport const LoadingGallery = (): React$Element<any> => (\n  <LoadingOverlay>\n    <Spinner size={'32'} color={'bg.default'} />\n  </LoadingOverlay>\n);\n\nexport const LoadingNavbar = (): React$Element<any> => (\n  <LoadingNavbarContainer>\n    <LogoLink to=\"/\">\n      <Logo src=\"/img/mark-white.png\" role=\"presentation\" />\n    </LogoLink>\n    <LoadingContainer>\n      <Spinner size={'20'} color={'bg.default'} />\n    </LoadingContainer>\n  </LoadingNavbarContainer>\n);\n\nexport const LoadingThread = () => (\n  <ShimmerThread>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '0',\n          left: '0',\n          height: '4px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '16px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '4px',\n          left: '120px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '24px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '60px',\n          left: '0',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '24px',\n          height: '24px',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '52px',\n          height: '24px',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '80px',\n          height: '24px',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '108px',\n          height: '24px',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '136px',\n          height: '24px',\n          width: '100%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerThread>\n);\n\nexport const LoadingInboxThread = () => (\n  <ShimmerInboxThread>\n    <ShimmerBase>\n      <ShimmerLine />\n      <CircularCover\n        style={{\n          top: 0,\n          left: 0,\n          height: '40px',\n          width: '40px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          left: '40px',\n          height: '40px',\n          width: '8px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          left: '50%',\n          height: '40px',\n          width: '50%',\n        }}\n      />\n\n      <Cover\n        style={{\n          top: '20px',\n          left: '40px',\n          height: '8px',\n          width: '50%',\n        }}\n      />\n\n      <Cover\n        style={{\n          top: '40px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '40px',\n          left: '0',\n          height: '100%',\n          width: '48px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '48px',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          left: '35%',\n          height: '24px',\n          width: '100%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerInboxThread>\n);\n\nexport const LoadingFeed = () => (\n  <FlexCol>\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n    <LoadingThread />\n  </FlexCol>\n);\n\nexport const LoadingThreadDetail = () => (\n  <ShimmerThreadDetail>\n    <ShimmerBase>\n      <ShimmerLine />\n      <CircularCover\n        style={{\n          top: 0,\n          left: 0,\n          height: '41px',\n          width: '41px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          left: '40px',\n          height: '40px',\n          width: '12px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '40px',\n          left: '0',\n          height: '24px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '20px',\n          left: '40px',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '0',\n          height: '20px',\n          width: 'calc(100% - 240px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '28px',\n          right: '0',\n          height: '12px',\n          width: 'calc(100% - 200px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '64px',\n          right: '0',\n          height: '40px',\n          width: '20%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '104px',\n          left: '0',\n          height: '24px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '148px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '128px',\n          right: '0',\n          height: '20px',\n          width: '48px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '176px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '184px',\n          right: '0',\n          height: '20px',\n          width: '24px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '204px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '212px',\n          right: '0',\n          height: '20px',\n          width: '80%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '232px',\n          left: '0',\n          height: '28px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '280px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '288px',\n          right: '0',\n          height: '20px',\n          width: '40%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerThreadDetail>\n);\n\nexport const LoadingThreadContent = () => (\n  <ShimmerThreadContent>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '20px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0px',\n          right: '0px',\n          height: '20px',\n          width: '20%',\n        }}\n      />\n\n      <Cover\n        style={{\n          top: '48px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '28px',\n          right: '0px',\n          height: '20px',\n          width: '10%',\n        }}\n      />\n\n      <Cover\n        style={{\n          top: '76px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '56px',\n          right: '0px',\n          height: '20px',\n          width: '10%',\n        }}\n      />\n\n      <Cover\n        style={{\n          top: '104px',\n          left: '0',\n          height: '8px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '84px',\n          right: '0px',\n          height: '20px',\n          width: '30%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '112px',\n          right: '0px',\n          height: '20px',\n          width: '70%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerThreadContent>\n);\n\nexport const LoadingListItem = () => (\n  <ShimmerListItem>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '16px',\n          left: '40px',\n          height: '8px',\n          width: 'calc(100% - 72px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          left: '32px',\n          height: '32px',\n          width: '12px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '32px',\n          height: '20px',\n          width: '96px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '26px',\n          height: '32px',\n          width: '64px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '0',\n          height: '32px',\n          width: '2px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '0',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '0',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerListItem>\n);\n\nexport const LoadingListItemLite = () => (\n  <ShimmerListItem>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '10px',\n          left: '0px',\n          height: '14px',\n          width: 'calc(100% - 72px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '32px',\n          height: '20px',\n          width: '96px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '26px',\n          height: '32px',\n          width: '64px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '0',\n          height: '32px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '0',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          right: '0',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerListItem>\n);\n\nexport const LoadingList = () => (\n  <ShimmerList>\n    <LoadingListItem />\n    <LoadingListItem />\n    <LoadingListItem />\n    <LoadingListItem />\n    <LoadingListItem />\n  </ShimmerList>\n);\n\nexport const LoadingListThreadDetail = () => (\n  <ShimmerListLite>\n    <LoadingListItemLite />\n    <LoadingListItemLite />\n    <LoadingListItemLite />\n    <LoadingListItemLite />\n    <LoadingListItemLite />\n  </ShimmerListLite>\n);\n\nexport const LoadingDM = () => (\n  <ShimmerDM>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '0',\n          left: '40px',\n          height: '4px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '20px',\n          left: '40px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          left: '40px',\n          height: '40px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '40px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '64px',\n          height: '20px',\n          width: '8px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '0px',\n          height: '8px',\n          width: '64px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0',\n          right: '0px',\n          height: '20px',\n          width: '16px',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerDM>\n);\n\nexport const LoadingComposer = () => (\n  <ShimmerComposer>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '0',\n          left: '28px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          left: '28px',\n          height: '16px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          right: '0',\n          height: '16px',\n          width: '30%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0px',\n          left: '0px',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0px',\n          left: '0px',\n          height: '100%',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          left: '8px',\n          height: '16px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0px',\n          left: '0px',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          left: '28px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerComposer>\n);\n\nexport const LoadingInboxComposer = () => (\n  <ShimmerInboxComposer>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '0',\n          left: '28px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          left: '28px',\n          height: '16px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          right: '0',\n          height: '16px',\n          width: '30%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0px',\n          left: '0px',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '0px',\n          left: '0px',\n          height: '100%',\n          width: '4px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '8px',\n          left: '8px',\n          height: '16px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0px',\n          left: '0px',\n          height: '4px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          bottom: '0',\n          left: '28px',\n          height: '12px',\n          width: '100%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerInboxComposer>\n);\n\nexport const LoadingProfile = () => (\n  <ShimmerProfile>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '0',\n          left: '40px',\n          height: '10px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '24px',\n          left: '40px',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '10px',\n          left: '40px',\n          height: '18px',\n          width: '16px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '40px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '64px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '88px',\n          left: '0',\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '48px',\n          right: '0',\n          height: '16px',\n          width: '32px',\n        }}\n      />\n      <Cover\n        style={{\n          top: '72px',\n          right: '0',\n          height: '16px',\n          width: '64px',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerProfile>\n);\n\nexport const LoadingProfileThreadDetail = () => (\n  <ShimmerProfileLite>\n    <ShimmerBase>\n      <ShimmerLine />\n      <Cover\n        style={{\n          top: '70px',\n          left: '0',\n          height: '24px',\n          width: 'calc(50% - 24px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '70px',\n          right: '0',\n          height: '24px',\n          width: 'calc(50% - 24px)',\n        }}\n      />\n      <Cover\n        style={{\n          top: '94px',\n          left: 0,\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '110px',\n          left: 0,\n          height: '20px',\n          width: '25%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '110px',\n          right: 0,\n          height: '20px',\n          width: '25%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '130px',\n          left: 0,\n          height: '16px',\n          width: '100%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '146px',\n          left: 0,\n          height: '16px',\n          width: '35%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '146px',\n          right: 0,\n          height: '16px',\n          width: '35%',\n        }}\n      />\n      <Cover\n        style={{\n          top: '162px',\n          left: 0,\n          height: '100%',\n          width: '100%',\n        }}\n      />\n    </ShimmerBase>\n  </ShimmerProfileLite>\n);\n\nexport const LoadingSelect = () => (\n  <ShimmerSelect>\n    <ShimmerBase />\n  </ShimmerSelect>\n);\n\ntype Props = { children: any };\nexport const ErrorSelect = ({ children }: Props) => (\n  <StyledErrorSelect>{children}</StyledErrorSelect>\n);\n\nexport const LoadingThreadView = (): React$Element<any> => (\n  <ThreadViewContainer>\n    <Content>\n      <Detail type=\"only\">\n        <LoadingThreadDetail />\n      </Detail>\n    </Content>\n  </ThreadViewContainer>\n);\n\nexport const displayLoadingState = branch(\n  props => !props.data || props.data.loading,\n  renderComponent(Loading)\n);\n\nexport const displayLoadingGallery = branch(\n  props => !props.data || props.data.loading,\n  renderComponent(LoadingGallery)\n);\n\nexport const displayLoadingNavbar = branch(\n  props => !props.data || props.data.loading || renderComponent(LoadingNavbar)\n);\n\nexport const displayLoadingCard = branch(\n  props => !props.data || props.data.loading,\n  renderComponent(LoadingCard)\n);\n\nexport const displayLoadingThreadView = branch(\n  props => !props.data,\n  renderComponent(LoadingThreadView)\n);\n\nexport const displayLoadingComposer = branch(\n  props => !props.data.user && !props.data.error,\n  renderComponent(LoadingComposer)\n);\n"
  },
  {
    "path": "src/components/loading/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { keyframes } from 'styled-components';\nimport { Card } from 'src/components/card';\nimport { hexa, FlexCol, zIndex } from 'src/components/globals';\nimport { Link } from 'react-router-dom';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ShimmerList = styled(Card)`\n  padding: 16px;\n\n  section {\n    min-height: 164px;\n  }\n`;\n\nexport const ShimmerListLite = styled(Card)`\n  padding: 16px;\n  border-radius: 4px;\n  box-shadow: none;\n\n  section {\n    min-height: 164px;\n  }\n`;\n\nexport const ShimmerThreadDetail = styled(FlexCol)`\n  padding: 36px 32px;\n  display: inline-block;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 16px;\n  }\n\n  section {\n    min-height: 308px;\n  }\n`;\n\nexport const ShimmerThreadContent = styled(FlexCol)`\n  padding: 0;\n  margin-top: 32px;\n  display: block;\n  width: 100%;\n\n  section {\n    min-height: 132px;\n  }\n`;\n\nexport const ShimmerThread = styled(Card)`\n  padding: 16px;\n\n  section {\n    min-height: 96px;\n  }\n`;\n\nexport const ShimmerInboxThread = styled.div`\n  background: ${theme.bg.default};\n  padding: 16px;\n  border-bottom: 1px solid ${theme.bg.border};\n\n  section {\n    min-height: 96px;\n  }\n\n  &:last-of-type {\n    border-bottom: 0;\n  }\n`;\n\nexport const ShimmerProfile = styled(Card)`\n  padding: 16px;\n\n  section {\n    min-height: 96px;\n  }\n`;\n\nexport const ShimmerProfileLite = styled(Card)`\n  border-radius: 4px;\n  padding: 0;\n  padding-bottom: 16px;\n  box-shadow: none;\n\n  section {\n    min-height: 238px;\n  }\n`;\n\nexport const ShimmerListItem = styled(FlexCol)`\n  padding: 8px 0;\n\n  section {\n    min-height: 32px;\n  }\n`;\n\nexport const ShimmerDM = styled(ShimmerProfile)`\n  padding: 16px;\n  margin: 0;\n  box-shadow: none;\n  border-radius: 0;\n  border-bottom: 2px solid ${theme.bg.wash};\n\n  section {\n    min-height: 40px;\n  }\n\n  + div {\n    margin: 0;\n  }\n`;\n\nexport const ShimmerComposer = styled(Card)`\n  padding: 16px;\n\n  section {\n    min-height: 32px;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const ShimmerInboxComposer = styled.div`\n  padding: 16px;\n  background: ${theme.bg.default};\n  margin: 8px 0;\n  border-top: 1px solid ${theme.bg.border};\n  border-bottom: 1px solid ${theme.bg.border};\n\n  section {\n    min-height: 32px;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const ShimmerSelect = styled.div`\n  padding: 10px 12px;\n  display: flex;\n  align-items: center;\n  width: 196px;\n  max-height: 38px;\n  margin-left: 8px;\n  border-radius: 8px;\n  background: ${theme.bg.default};\n  border: 2px solid ${theme.bg.border};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: calc(50% - 12px);\n  }\n\n  section {\n    min-height: 12px;\n    width: calc(100% - 16px);\n  }\n`;\n\nexport const StyledErrorSelect = styled.div`\n  padding: 4px 12px;\n  margin-left: 8px;\n  display: flex;\n  align-items: center;\n  max-height: 38px;\n  border-radius: 8px;\n  background: ${theme.bg.default};\n  border: 2px solid ${theme.warn.default};\n  color: ${theme.warn.default};\n`;\n\nconst placeHolderShimmer = keyframes`\n  0%{\n    transform: translateX(-100%) translateY(0%);\n    background-size: 100%;\n    opacity: 1;\n  }\n  100%{\n    transform: translateX(200%) translateY(0%);\n    background-size: 500%;\n    opacity: 0;\n  }\n`;\n\nexport const ShimmerBase = styled.section`\n  width: 100%;\n  height: 100%;\n  position: relative;\n  z-index: ${zIndex.loading};\n  background: ${theme.bg.wash};\n  overflow: hidden;\n`;\n\nexport const ShimmerLine = styled.span`\n  width: 100%;\n  height: 100%;\n  position: absolute;\n  z-index: ${zIndex.loading + 1};\n  animation-duration: 2.5s;\n  animation-fill-mode: forwards;\n  animation-iteration-count: infinite;\n  animation-timing-function: ease-in-out;\n  background: linear-gradient(\n    to right,\n    ${theme.bg.wash} 10%,\n    ${({ theme }) => hexa(theme.generic.default, 0.65)} 20%,\n    ${theme.bg.wash} 30%\n  );\n  ${/* background-size: 100%; */ ''} animation-name: ${placeHolderShimmer};\n`;\n\nexport const Cover = styled.span`\n  position: absolute;\n  background: ${theme.bg.default};\n  z-index: ${zIndex.loading + 2};\n`;\n\nexport const CircularCover = styled(Cover)`\n  background: radial-gradient(\n    transparent 20px,\n    ${({ theme }) => theme.bg.default} 10px\n  );\n`;\n\nexport const LoadingOverlay = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: ${theme.bg.reverse};\n  opacity: 0.95;\n  width: 100%;\n  height: 100%;\n  z-index: ${zIndex.fullscreen};\n`;\n\nexport const LoadingNavbarContainer = styled.nav`\n  width: 100%;\n  background: ${theme.text.default};\n  display: flex;\n  align-items: center;\n  color: #fff;\n  justify-content: space-between;\n  height: 48px;\n  padding: 0 32px 0 16px;\n  line-height: 1;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);\n  z-index: ${zIndex.chrome};\n\n  span {\n    position: relative;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    bottom: 0;\n    top: auto;\n    box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.15);\n    padding: 0;\n  }\n`;\n\nexport const LogoLink = styled(Link)`\n  margin-right: 32px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const Logo = styled.img`\n  width: 16px;\n  height: 16px;\n  align-self: center;\n  position: relative;\n  top: 1px;\n  left: 1px;\n`;\n\nexport const GridProfile = styled.div`\n  display: grid;\n  grid-template-columns: minmax(320px, 1fr) 3fr;\n  grid-template-rows: 160px 1fr;\n  grid-template-areas: 'cover cover' 'meta content';\n  grid-column-gap: 32px;\n  width: 100%;\n  max-width: 1280px;\n  height: 100%;\n  min-height: 100vh;\n  background-color: ${theme.bg.default};\n\n  @media (max-width: 1028px) {\n    grid-template-columns: 240px 1fr;\n    grid-template-rows: 80px 1fr;\n    grid-template-areas: 'cover cover' 'meta content';\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-rows: 80px auto 1fr;\n    grid-template-columns: 100%;\n    grid-column-gap: 0;\n    grid-row-gap: 16px;\n    grid-template-areas: 'cover' 'meta' 'content';\n  }\n`;\n\nconst Column = styled.div`\n  display: flex;\n  flex-direction: column;\n`;\n\nexport const Meta = styled(Column)`\n  grid-area: meta;\n`;\n\nexport const GridContent = styled(Column)`\n  grid-area: content;\n`;\n\nexport const LoadingCoverPhoto = styled.div`\n  grid-area: cover;\n  width: 100%;\n  background-color: ${theme.bg.wash};\n`;\n"
  },
  {
    "path": "src/components/loginButtonSet/facebook.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { ButtonProps } from './';\nimport { FacebookButton, Label, A } from './style';\nimport Icon from 'src/components/icon';\n\nexport const FacebookSigninButton = (props: ButtonProps) => {\n  const { href, preferred, showAfter, onClickHandler } = props;\n\n  return (\n    <A onClick={() => onClickHandler && onClickHandler('facebook')} href={href}>\n      <FacebookButton showAfter={showAfter} preferred={preferred}>\n        <Icon glyph={'facebook'} />\n        <Label>Log in with Facebook</Label>\n      </FacebookButton>\n    </A>\n  );\n};\n"
  },
  {
    "path": "src/components/loginButtonSet/github.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { ButtonProps } from './';\nimport { GithubButton, Label, A } from './style';\nimport Icon from 'src/components/icon';\n\nexport const GithubSigninButton = (props: ButtonProps) => {\n  const { href, preferred, showAfter, onClickHandler, githubOnly } = props;\n\n  return (\n    <A\n      githubOnly={githubOnly}\n      onClick={() => onClickHandler && onClickHandler('github')}\n      href={href}\n    >\n      <GithubButton showAfter={showAfter} preferred={preferred}>\n        <Icon glyph={'github'} />\n        <Label>Log in with GitHub</Label>\n      </GithubButton>\n    </A>\n  );\n};\n"
  },
  {
    "path": "src/components/loginButtonSet/google.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { ButtonProps } from './';\nimport { GoogleButton, Label, A } from './style';\nimport Icon from 'src/components/icon';\n\nexport const GoogleSigninButton = (props: ButtonProps) => {\n  const { href, preferred, showAfter, onClickHandler } = props;\n\n  return (\n    <A onClick={() => onClickHandler && onClickHandler('google')} href={href}>\n      <GoogleButton showAfter={showAfter} preferred={preferred}>\n        <Icon glyph={'google'} />\n        <Label>Log in with Google</Label>\n      </GoogleButton>\n    </A>\n  );\n};\n"
  },
  {
    "path": "src/components/loginButtonSet/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { getItemFromStorage, storeItem } from 'src/helpers/localStorage';\nimport { withRouter } from 'react-router';\nimport queryString from 'query-string';\nimport { SERVER_URL, CLIENT_URL } from 'src/api/constants';\nimport { Container } from './style';\nimport { TwitterSigninButton } from './twitter';\nimport { FacebookSigninButton } from './facebook';\nimport { GoogleSigninButton } from './google';\nimport { GithubSigninButton } from './github';\n\ntype Props = {\n  redirectPath: ?string,\n  location: Object,\n  githubOnly?: boolean,\n};\n\nexport type ButtonProps = {\n  onClickHandler?: ?Function,\n  href: string,\n  preferred: boolean,\n  showAfter: boolean,\n  githubOnly?: boolean,\n};\n\nclass LoginButtonSet extends React.Component<Props> {\n  saveLoginMethod = (type: string) => {\n    return storeItem('preferred_signin_method', type);\n  };\n\n  render() {\n    const { redirectPath, location, githubOnly } = this.props;\n\n    let r;\n    if (location) {\n      const searchObj = queryString.parse(this.props.location.search);\n      r = searchObj.r;\n    }\n\n    const postAuthRedirectPath =\n      redirectPath !== undefined || r !== undefined\n        ? // $FlowFixMe\n          `${redirectPath || r}`\n        : `${CLIENT_URL}/home`;\n\n    const preferredSigninMethod = getItemFromStorage('preferred_signin_method');\n\n    let nonePreferred = false;\n    if (!preferredSigninMethod) {\n      nonePreferred = true;\n    }\n\n    return (\n      <React.Fragment>\n        <Container>\n          {!githubOnly && (\n            <React.Fragment>\n              <TwitterSigninButton\n                onClickHandler={this.saveLoginMethod}\n                href={`${SERVER_URL}/auth/twitter?r=${postAuthRedirectPath}`}\n                preferred={\n                  nonePreferred ? true : preferredSigninMethod === 'twitter'\n                }\n                showAfter={preferredSigninMethod === 'twitter'}\n              />\n\n              <FacebookSigninButton\n                onClickHandler={this.saveLoginMethod}\n                href={`${SERVER_URL}/auth/facebook?r=${postAuthRedirectPath}`}\n                preferred={\n                  nonePreferred ? true : preferredSigninMethod === 'facebook'\n                }\n                showAfter={preferredSigninMethod === 'facebook'}\n              />\n\n              <GoogleSigninButton\n                onClickHandler={this.saveLoginMethod}\n                href={`${SERVER_URL}/auth/google?r=${postAuthRedirectPath}`}\n                preferred={\n                  nonePreferred ? true : preferredSigninMethod === 'google'\n                }\n                showAfter={preferredSigninMethod === 'google'}\n              />\n            </React.Fragment>\n          )}\n\n          <GithubSigninButton\n            githubOnly={githubOnly}\n            onClickHandler={this.saveLoginMethod}\n            href={`${SERVER_URL}/auth/github?r=${postAuthRedirectPath}`}\n            preferred={\n              githubOnly\n                ? true\n                : nonePreferred\n                ? true\n                : preferredSigninMethod === 'github'\n            }\n            showAfter={preferredSigninMethod === 'github'}\n          />\n        </Container>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default withRouter(LoginButtonSet);\n"
  },
  {
    "path": "src/components/loginButtonSet/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { zIndex } from 'src/components/globals';\n\nexport const Container = styled.div`\n  display: grid;\n  grid-gap: 16px;\n  align-items: flex-end;\n  padding: 16px 0;\n  grid-template-columns: repeat(2, 1fr);\n`;\n\nexport const A = styled.a`\n  display: flex;\n  grid-column: 1 / 2 span;\n`;\n\nexport const SigninButton = styled.div`\n  display: flex;\n  flex: 1;\n  z-index: ${zIndex.card + 1};\n  flex-direction: flex-row;\n  align-self: flex-start;\n  align-items: center;\n  justify-content: flex-start;\n  color: ${theme.text.reverse};\n  border-radius: 32px;\n  padding: 8px 16px;\n  font-size: 15px;\n  font-weight: 600;\n  position: relative;\n  width: 100%;\n  cursor: pointer;\n  ${props => props.showAfter && `margin-top: 32px`};\n\n  ${props =>\n    props.showAfter &&\n    `\n    &:after {\n        content: 'Previously signed in with';\n        position: absolute;\n        top: -32px;\n        font-size: 14px;\n        font-weight: 600;\n        left: 50%;\n        transform: translateX(-50%);\n        width: 100%;\n        text-align: center;\n        color: ${props.theme.text.alt};\n      }\n    `} svg {\n    fill: currentColor !important;\n  }\n`;\n\nexport const Label = styled.span`\n  display: flex;\n  flex: 1 0 auto;\n  justify-content: center;\n  margin-top: -1px;\n  margin-left: 8px;\n  line-height: 2.45;\n  word-break: keep-all;\n  white-space: nowrap;\n  color: currentColor;\n`;\n\nexport const TwitterButton = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.twitter.default : 'none'};\n  color: ${props =>\n    props.preferred ? '#fff' : props.theme.social.twitter.default};\n\n  &:after {\n    color: ${theme.social.twitter.default};\n  }\n`;\n\nexport const FacebookButton = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.facebook.default : 'none'};\n  color: ${props =>\n    props.preferred ? '#fff' : props.theme.social.facebook.default};\n\n  &:after {\n    color: ${theme.social.facebook.default};\n  }\n`;\n\nexport const GoogleButton = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.google.default : 'none'};\n  color: ${props =>\n    props.preferred ? '#fff' : props.theme.social.google.default};\n\n  &:after {\n    color: ${theme.social.google.default};\n  }\n`;\n\nexport const GithubButton = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.github.default : 'none'};\n  color: ${props =>\n    props.preferred ? '#fff' : props.theme.social.github.default};\n\n  &:after {\n    color: ${theme.text.default};\n  }\n`;\n"
  },
  {
    "path": "src/components/loginButtonSet/twitter.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { ButtonProps } from './';\nimport { TwitterButton, Label, A } from './style';\nimport Icon from 'src/components/icon';\n\nexport const TwitterSigninButton = (props: ButtonProps) => {\n  const { href, preferred, showAfter, onClickHandler } = props;\n\n  return (\n    <A onClick={() => onClickHandler && onClickHandler('twitter')} href={href}>\n      <TwitterButton showAfter={showAfter} preferred={preferred}>\n        <Icon glyph={'twitter'} />\n        <Label>Log in with Twitter</Label>\n      </TwitterButton>\n    </A>\n  );\n};\n"
  },
  {
    "path": "src/components/logo/index.js",
    "content": "// @flow\nimport React from 'react';\n//$FlowFixMe\nimport styled from 'styled-components';\n\nexport const Svg = styled.svg`\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  height: 100%;\n  width: 100%;\n  color: inherit;\n  fill: currentColor;\n`;\n\nexport const SvgWrapper = styled.div`\n  display: inline-block;\n  flex: none;\n  width: 160px;\n  height: 24px;\n  top: 4px;\n  position: relative;\n  color: inherit;\n`;\n\nexport const Logo = () => {\n  return (\n    <SvgWrapper>\n      <Svg\n        viewBox=\"0 0 389 62\"\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        strokeLinejoin=\"round\"\n        strokeMiterlimit=\"1.414\"\n        id=\"logo\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        aria-labelledby=\"title\"\n      >\n        <title id=\"title\">Logo</title>\n        <g>\n          <path d=\"M0,3.356c0,-1.767 1.433,-3.2 3.2,-3.2l2.8,0c23.196,0 42,18.804 42,42l0,2.8c0,1.768 -1.433,3.2 -3.2,3.2l-17.6,0c-1.767,0 -3.2,-1.432 -3.2,-3.2l0,-2.8c0,-9.941 -8.059,-18 -18,-18l-2.8,0c-1.767,0 -3.2,-1.432 -3.2,-3.2l0,-17.6Z\" />\n          <g>\n            <path d=\"M71.872,38.004c0.288,3.96 3.888,11.232 15.12,11.232c9.576,0 14.256,-5.976 14.256,-12.096c0,-5.256 -3.6,-9.72 -11.016,-11.232l-4.752,-0.936c-1.584,-0.288 -2.808,-1.152 -2.808,-2.664c0,-1.872 1.8,-3.096 3.888,-3.096c3.312,0 4.824,2.016 5.112,4.392l9.072,-1.656c-0.36,-4.176 -3.96,-10.656 -14.328,-10.656c-7.992,0 -13.752,5.328 -13.752,11.88c0,5.04 3.024,9.36 10.656,11.016l4.104,0.936c2.664,0.576 3.528,1.656 3.528,2.952c0,1.584 -1.368,3.096 -4.176,3.096c-3.744,0 -5.472,-2.376 -5.616,-4.824l-9.288,1.656Z\" />\n            <path d=\"M119.307,61.836l0,-16.488c1.656,2.016 5.112,3.6 9.72,3.6c10.008,0 17.064,-7.848 17.064,-18.792c0,-10.728 -6.264,-18.648 -16.632,-18.648c-5.112,0 -9,2.232 -10.512,4.536l0,-3.672l-10.584,0l0,49.464l10.944,0Zm16.056,-31.608c0,5.976 -3.816,8.928 -8.136,8.928c-4.248,0 -8.064,-3.024 -8.064,-8.928c0,-5.976 3.816,-8.856 8.064,-8.856c4.32,0 8.136,2.88 8.136,8.856Z\" />\n            <path d=\"M161.432,25.98c0.216,-2.664 2.52,-6.048 7.128,-6.048c5.184,0 7.056,3.312 7.2,6.048l-14.328,0Zm15.12,9.288c-1.008,2.808 -3.24,4.68 -7.2,4.68c-4.248,0 -7.92,-2.88 -8.136,-6.912l24.912,0c0.072,-0.216 0.216,-1.872 0.216,-3.384c0,-11.52 -6.84,-18.36 -17.928,-18.36c-9.288,0 -17.856,7.344 -17.856,18.864c0,12.024 8.784,19.08 18.648,19.08c9.072,0 14.76,-5.184 16.488,-11.376l-9.144,-2.592Z\" />\n            <path d=\"M209.859,21.372c4.248,0 6.408,2.592 7.2,5.328l9.792,-2.952c-1.584,-6.408 -7.344,-12.456 -17.208,-12.456c-10.512,0 -18.864,7.848 -18.864,19.008c0,11.088 8.568,18.936 19.224,18.936c9.576,0 15.48,-6.192 17.064,-12.456l-9.648,-2.952c-0.792,2.664 -3.168,5.328 -7.416,5.328c-4.536,0 -8.352,-3.168 -8.352,-8.856c0,-5.76 3.672,-8.928 8.208,-8.928Z\" />\n            <path d=\"M246.834,1.932l-9.792,0l0,4.608c0,3.312 -1.8,5.832 -5.544,5.832l-1.8,0l0,9.576l6.336,0l0,15.336c0,7.128 4.536,11.52 11.952,11.52c3.456,0 5.256,-0.792 5.688,-1.008l0,-9.072c-0.648,0.144 -1.728,0.36 -2.88,0.36c-2.376,0 -3.96,-0.792 -3.96,-3.744l0,-13.392l6.984,0l0,-9.576l-6.984,0l0,-10.44Z\" />\n            <path d=\"M283.904,12.372c-0.72,-0.216 -1.8,-0.36 -2.88,-0.36c-2.88,0 -7.416,1.152 -9.288,5.184l0,-4.824l-10.584,0l0,35.784l10.944,0l0,-15.624c0,-7.128 3.96,-9.72 8.352,-9.72c1.08,0 2.232,0.072 3.456,0.36l0,-10.8Z\" />\n            <path d=\"M313.373,48.156l10.513,0c-0.073,-0.576 -0.36,-3.168 -0.36,-6.408l0,-29.376l-10.944,0l0,20.376c0,3.6 -2.304,6.12 -5.976,6.12c-3.888,0 -5.761,-2.736 -5.761,-6.192l0,-20.304l-10.944,0l0,22.608c0,7.632 4.896,13.968 13.608,13.968c3.601,0 7.705,-1.296 9.577,-4.392c0,0.936 0.143,2.952 0.287,3.6Z\" />\n            <path d=\"M344.096,48.156l0,-20.592c0,-3.24 2.088,-6.192 5.904,-6.192c3.96,0 5.76,2.664 5.76,6.048l0,20.736l10.8,0l0,-20.664c0,-3.168 2.088,-6.12 5.976,-6.12c3.888,0 5.688,2.664 5.688,6.048l0,20.736l10.584,0l0,-23.184c0,-9.72 -6.48,-13.68 -13.248,-13.68c-4.824,0 -8.28,1.584 -11.088,5.616c-1.8,-3.528 -5.472,-5.616 -10.584,-5.616c-3.888,0 -8.496,2.016 -10.296,5.184l0,-4.104l-10.44,0l0,35.784l10.944,0Z\" />\n          </g>\n        </g>\n      </Svg>\n    </SvgWrapper>\n  );\n};\n"
  },
  {
    "path": "src/components/maintenance/index.js",
    "content": "// @flow\nimport React from 'react';\nimport styled from 'styled-components';\nimport { FlexCol } from 'src/components/globals';\nimport { Tagline, Copy } from 'src/views/pages/style';\nimport ViewSegment from 'src/components/themedSection';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst Emoji = styled.div`\n  font-size: 3em;\n  text-align: center;\n  line-height: 1.5em;\n  margin-bottom: 0.25em;\n`;\n\nconst Wrapper = styled(FlexCol)`\n  margin: 0 auto;\n  text-align: center;\n`;\nconst Text = styled(Copy)`\n  font-size: 20px;\n  line-height: 1.3;\n  font-weight: 500;\n  opacity: 0.95;\n  margin: 0 auto;\n  max-width: none;\n\n  a {\n    text-decoration: underline;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    font-size: 20px;\n    text-align: center;\n  }\n`;\n\nconst MaintenanceDowntime = () => {\n  return (\n    <ViewSegment background=\"constellations\">\n      <Wrapper>\n        <Emoji>🛠</Emoji>\n        <Tagline>Spectrum is currently undergoing maintenance</Tagline>\n        <Text>\n          We’ll be back soon, check{' '}\n          <a href=\"https://twitter.com/withspectrum\">\n            @withspectrum on Twitter\n          </a>{' '}\n          for updates!\n        </Text>\n      </Wrapper>\n    </ViewSegment>\n  );\n};\n\nexport default MaintenanceDowntime;\n"
  },
  {
    "path": "src/components/menu/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Icon from 'src/components/icon';\nimport { Wrapper, MenuContainer, MenuOverlay, Absolute } from './style';\n\ntype Props = {\n  hasNavBar?: boolean,\n  darkContext?: boolean,\n  hasTabBar?: boolean,\n  children: React$Node,\n};\n\ntype State = {\n  menuIsOpen: boolean,\n};\nclass Menu extends React.Component<Props, State> {\n  state = {\n    menuIsOpen: false,\n  };\n\n  toggleMenu() {\n    this.setState({ menuIsOpen: !this.state.menuIsOpen });\n  }\n\n  render() {\n    const { hasNavBar, darkContext, hasTabBar } = this.props;\n    const { menuIsOpen } = this.state;\n    return (\n      <Wrapper darkContext={darkContext}>\n        <Icon\n          data-cy={'community-menu-open'}\n          glyph={'menu'}\n          onClick={() => this.toggleMenu()}\n        />\n        <Absolute open={this.state.menuIsOpen} hasNavBar={hasNavBar}>\n          <MenuContainer hasNavBar={hasNavBar} hasTabBar={hasTabBar}>\n            {menuIsOpen && this.props.children}\n          </MenuContainer>\n          <Icon\n            glyph={'view-close'}\n            onClick={() => this.toggleMenu()}\n            hasNavBar={hasNavBar}\n          />\n          <MenuOverlay\n            data-cy={'community-menu-close'}\n            onClick={() => this.toggleMenu()}\n          />\n        </Absolute>\n      </Wrapper>\n    );\n  }\n}\n\nexport default Menu;\n"
  },
  {
    "path": "src/components/menu/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Transition, Shadow, zIndex, hexa } from 'src/components/globals';\n\nexport const Wrapper = styled.div`\n  display: inline-block;\n\n  ${props =>\n    props.darkContext &&\n    css`\n      > button {\n        color: ${theme.text.reverse};\n        transition: ${Transition.hover.off};\n\n        &:hover {\n          color: ${theme.text.reverse};\n          transform: scale(1.1);\n          transition: ${Transition.hover.on};\n        }\n      }\n    `};\n`;\n\nexport const Absolute = styled.div`\n  display: ${props => (props.open ? 'flex' : 'none')};\n  position: fixed;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 100vw;\n  min-width: 100vw;\n  height: 100%;\n  min-height: 100%;\n  z-index: 1;\n\n  button {\n    color: ${theme.text.reverse};\n    z-index: 2;\n    align-self: flex-start;\n    margin-top: ${props => (props.hasNavBar ? '56px' : '8px')};\n    margin-left: 8px;\n  }\n\n  button:hover {\n    color: ${theme.text.reverse};\n  }\n`;\n\nexport const MenuContainer = styled.div`\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  align-content: start;\n  justify-content: stretch;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  height: 100%;\n  width: 300px;\n  color: ${theme.brand.alt};\n  background-color: ${theme.bg.wash};\n  box-shadow: ${Shadow.high} ${props => hexa(props.theme.bg.reverse, 0.25)};\n  padding-top: ${props => (props.hasNavBar ? '48px' : '0')};\n  z-index: ${zIndex.fullscreen + 1};\n`;\n\nexport const MenuOverlay = styled.div`\n  position: absolute;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 100vw;\n  min-width: 100vw;\n  height: 100vh;\n  min-height: 100vh;\n  background-color: ${props => hexa(props.theme.bg.reverse, 0.5)};\n`;\n"
  },
  {
    "path": "src/components/message/authorByline.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { convertTimestampToTime } from 'shared/time-formatting';\nimport ConditionalWrap from 'src/components/conditionalWrap';\nimport { UserHoverProfile } from 'src/components/hoverProfile';\nimport { Link } from 'react-router-dom';\nimport Badge from '../badges';\nimport {\n  BadgesContainer,\n  Byline,\n  GutterTimestamp,\n  Name,\n  Username,\n} from './style';\n\ntype Props = {\n  user: Object,\n  timestamp: string,\n  roles?: Array<string>,\n  bot?: boolean,\n  messageUrl: string,\n};\n\nexport default (props: Props) => {\n  const { user, roles, timestamp, messageUrl } = props;\n  return (\n    <Byline>\n      <ConditionalWrap\n        condition={!!user.username}\n        wrap={children => (\n          <UserHoverProfile\n            username={user.username}\n            style={{ flexWrap: 'wrap', flex: '0 1 auto' }}\n          >\n            <Link\n              to={`/users/${user.username}`}\n              onClick={e => e.stopPropagation()}\n            >\n              {children}\n              <Username>{user.username && `@${user.username}`}</Username>\n            </Link>\n          </UserHoverProfile>\n        )}\n      >\n        <Name>{user.name}</Name>\n      </ConditionalWrap>\n\n      <BadgesContainer>\n        {roles &&\n          roles.map((role, index) => (\n            <Badge type={role} key={index} onClick={e => e.stopPropagation()} />\n          ))}\n        {user.betaSupporter && (\n          <Badge\n            type=\"beta-supporter\"\n            label={'β'}\n            style={{ textTransform: 'none' }}\n          />\n        )}\n      </BadgesContainer>\n      <GutterTimestamp to={messageUrl} data-cy=\"message-timestamp\">\n        {convertTimestampToTime(new Date(timestamp))}\n      </GutterTimestamp>\n    </Byline>\n  );\n};\n"
  },
  {
    "path": "src/components/message/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { btoa } from 'b2a';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport { withRouter, type Location, type History } from 'react-router';\nimport queryString from 'query-string';\nimport Clipboard from 'react-clipboard.js';\nimport { openGallery } from 'src/actions/gallery';\nimport Tooltip from 'src/components/tooltip';\nimport Reaction from 'src/components/reaction';\nimport { ReactionWrapper } from 'src/components//reaction/style';\nimport OutsideClickHandler from 'src/components/outsideClickHandler';\nimport { Body } from './view';\nimport { openModal } from 'src/actions/modals';\nimport { CLIENT_URL } from 'src/api/constants';\nimport type { MessageInfoType } from 'shared/graphql/fragments/message/messageInfo';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { UserAvatar } from 'src/components/avatar';\nimport AuthorByline from './authorByline';\nimport Icon from 'src/components/icon';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport {\n  convertTimestampToTime,\n  convertTimestampToDate,\n} from 'shared/time-formatting';\nimport ConditionalWrap from 'src/components/conditionalWrap';\nimport {\n  OuterMessageContainer,\n  InnerMessageContainer,\n  GutterContainer,\n  GutterTimestamp,\n  AuthorAvatarContainer,\n  ActionsContainer,\n  Actions,\n  Action,\n  EditedIndicator,\n} from './style';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport deleteMessage from 'shared/graphql/mutations/message/deleteMessage';\nimport { deleteMessageWithToast } from 'src/components/modals/DeleteDoubleCheckModal';\n\ntype Props = {|\n  me: boolean,\n  showAuthorContext: boolean,\n  message: MessageInfoType,\n  canModerateMessage: boolean,\n  thread: GetThreadType,\n  threadType: 'directMessageThread' | 'story',\n  location: Location,\n  history: History,\n  dispatch: Dispatch<Object>,\n  currentUser: UserInfoType,\n  deleteMessage: Function,\n|};\n\nclass Message extends React.Component<Props> {\n  wrapperRef: React$Node;\n\n  setWrapperRef = (node: React$Node) => {\n    this.wrapperRef = node;\n  };\n\n  shouldComponentUpdate(nextProps) {\n    const newMessage = nextProps.message.id !== this.props.message.id;\n    const updatedReactionCount =\n      nextProps.message.reactions.count !== this.props.message.reactions.count;\n    const updatedReactionState =\n      nextProps.message.reactions.hasReacted !==\n      this.props.message.reactions.hasReacted;\n\n    if (newMessage || updatedReactionCount || updatedReactionState) {\n      return true;\n    }\n\n    return false;\n  }\n\n  toggleOpenGallery = (e: any, selectedMessageId: string) => {\n    e.stopPropagation();\n\n    const { thread } = this.props;\n    this.props.dispatch(openGallery(thread.id, selectedMessageId));\n  };\n\n  deleteMessage = (e: any) => {\n    e.stopPropagation();\n\n    if (e.shiftKey) {\n      // If Shift key is pressed, we assume confirmation\n      return deleteMessageWithToast(\n        this.props.dispatch,\n        this.props.deleteMessage,\n        this.props.message.id\n      );\n    }\n\n    const message = 'Are you sure you want to delete this message?';\n\n    return this.props.dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: this.props.message.id,\n        entity: 'message',\n        message,\n        threadType: this.props.threadType,\n        threadId: this.props.thread.id,\n      })\n    );\n  };\n\n  // prettier-ignore\n  handleSelectMessage = (e: any, selectMessage: Function,\tmessageId: string) => {\n    // $FlowFixMe\n    if (window && window.innerWidth < 768 && this.wrapperRef && this.wrapperRef.contains(e.target)) {\n      e.stopPropagation();\n      return selectMessage(messageId);\n    }\n  };\n\n  clearSelectedMessage = () => {\n    const { history, location } = this.props;\n    const { pathname } = location;\n    history.push({ pathname });\n  };\n\n  render() {\n    const {\n      showAuthorContext,\n      me,\n      currentUser,\n      dispatch,\n      message,\n      canModerateMessage,\n      thread,\n      threadType,\n      location,\n    } = this.props;\n\n    const selectedMessageId = btoa(new Date(message.timestamp).getTime() - 1);\n    const messageUrl =\n      threadType === 'story' && thread\n        ? `${getThreadLink(thread)}?m=${selectedMessageId}`\n        : threadType === 'directMessageThread'\n        ? `/messages/${thread.id}?m=${selectedMessageId}`\n        : `/thread/${thread.id}?m=${selectedMessageId}`;\n\n    const searchObj = queryString.parse(location.search);\n    const { m = null } = searchObj;\n    const isSelected = m && m === selectedMessageId;\n    const isOptimistic =\n      message && typeof message.id === 'number' && message.id < 0;\n    return (\n      <ConditionalWrap\n        condition={!!isSelected}\n        wrap={children => (\n          <OutsideClickHandler\n            onOutsideClick={this.clearSelectedMessage}\n            style={{ width: '100%' }}\n          >\n            {children}\n          </OutsideClickHandler>\n        )}\n      >\n        <OuterMessageContainer\n          data-cy={isSelected ? 'message-selected' : 'message'}\n          selected={isSelected}\n          ref={this.setWrapperRef}\n          tabIndex={0}\n        >\n          <GutterContainer>\n            {showAuthorContext ? (\n              <AuthorAvatarContainer onClick={e => e.stopPropagation()}>\n                <UserAvatar user={message.author.user} size={40} />\n              </AuthorAvatarContainer>\n            ) : (\n              <GutterTimestamp to={messageUrl}>\n                {convertTimestampToTime(new Date(message.timestamp))}\n              </GutterTimestamp>\n            )}\n          </GutterContainer>\n\n          <InnerMessageContainer>\n            {showAuthorContext && (\n              <AuthorByline\n                timestamp={message.timestamp}\n                user={message.author.user}\n                roles={message.author.roles}\n                bot={message.bot}\n                messageUrl={messageUrl}\n              />\n            )}\n\n            <Body\n              me={me}\n              openGallery={e => this.toggleOpenGallery(e, message.id)}\n              message={message}\n            />\n\n            {message.modifiedAt && (\n              <Tooltip\n                content={`Edited ${convertTimestampToDate(\n                  new Date(message.modifiedAt)\n                )}`}\n              >\n                <EditedIndicator data-cy=\"edited-message-indicator\">\n                  Edited\n                </EditedIndicator>\n              </Tooltip>\n            )}\n\n            {message.reactions.count > 0 && (\n              <Reaction\n                message={message}\n                me={me}\n                currentUser={currentUser}\n                dispatch={dispatch}\n                render={({ me, count, hasReacted }) => (\n                  <ReactionWrapper\n                    hasCount={count}\n                    hasReacted={hasReacted}\n                    me={me}\n                  >\n                    <Icon\n                      data-cy={\n                        hasReacted\n                          ? 'inline-unlike-action'\n                          : 'inline-like-action'\n                      }\n                      glyph=\"like-fill\"\n                      size={16}\n                      color={'text.reverse'}\n                    />\n                    <span>{count}</span>\n                  </ReactionWrapper>\n                )}\n              />\n            )}\n\n            {!isOptimistic && (\n              <ActionsContainer>\n                <Actions>\n                  {canModerateMessage && (\n                    <Tooltip content={'Delete'}>\n                      <Action onClick={this.deleteMessage}>\n                        <Icon\n                          data-cy=\"delete-message\"\n                          glyph=\"delete\"\n                          size={20}\n                        />\n                      </Action>\n                    </Tooltip>\n                  )}\n\n                  {threadType === 'story' && (\n                    <Clipboard\n                      style={{\n                        background: 'none',\n                      }}\n                      data-clipboard-text={\n                        thread\n                          ? `${CLIENT_URL}${getThreadLink(\n                              thread\n                            )}?m=${selectedMessageId}`\n                          : `${CLIENT_URL}/thread/${\n                              thread.id\n                            }?m=${selectedMessageId}`\n                      }\n                      onSuccess={() =>\n                        this.props.dispatch(\n                          addToastWithTimeout('success', 'Copied to clipboard')\n                        )\n                      }\n                    >\n                      <Tooltip content={'Link to message'}>\n                        <Action>\n                          <Icon\n                            data-cy=\"link-to-message\"\n                            glyph=\"link\"\n                            size={20}\n                          />\n                        </Action>\n                      </Tooltip>\n                    </Clipboard>\n                  )}\n                </Actions>\n              </ActionsContainer>\n            )}\n          </InnerMessageContainer>\n        </OuterMessageContainer>\n      </ConditionalWrap>\n    );\n  }\n}\n\nexport default compose(\n  deleteMessage,\n  withCurrentUser,\n  withRouter,\n  connect()\n)(Message);\n"
  },
  {
    "path": "src/components/message/messageErrorFallback.js",
    "content": "// @flow\nimport * as React from 'react';\nimport {\n  Text,\n  OuterMessageContainer,\n  GutterContainer,\n  InnerMessageContainer,\n} from './style';\n\nclass MessageErrorFallback extends React.Component<{}> {\n  render() {\n    return (\n      <OuterMessageContainer error data-cy=\"message\">\n        <GutterContainer />\n\n        <InnerMessageContainer>\n          <Text error>\n            Something went wrong loading this message. The Spectrum team has\n            been alerted and will investigate soon.\n          </Text>\n        </InnerMessageContainer>\n      </OuterMessageContainer>\n    );\n  }\n}\n\nexport default MessageErrorFallback;\n"
  },
  {
    "path": "src/components/message/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { SvgWrapper } from 'src/components/icon';\nimport { Truncate, monoStack, hexa } from 'src/components/globals';\nimport { Wrapper as EditorWrapper } from '../rich-text-editor/style';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Byline = styled.span`\n  display: flex;\n  font-size: 14px;\n  line-height: 16px;\n  font-weight: 500;\n  margin-bottom: 4px;\n  user-select: none;\n  color: ${theme.text.default};\n  max-width: 100%;\n  position: relative;\n  flex-wrap: wrap;\n  align-items: center;\n\n  a {\n    display: flex;\n    flex-wrap: wrap;\n  }\n`;\n\nexport const Name = styled.span`\n  font-weight: 600;\n  font-size: 15px;\n  color: ${theme.text.default};\n  margin-right: 2px;\n  display: flex;\n\n  &:hover {\n    color: ${theme.text.default};\n    cursor: pointer;\n  }\n\n  @media (max-width: 400px) {\n    line-height: 1.4;\n  }\n`;\n\nexport const Username = styled(Name)`\n  font-weight: 400;\n  margin-left: 2px;\n  margin-right: 2px;\n  color: ${theme.text.alt};\n  display: flex;\n\n  @media (max-width: 400px) {\n    line-height: 1.4;\n  }\n`;\n\nexport const ActionsContainer = styled.span`\n  position: absolute;\n  top: -16px;\n  right: -16px;\n  height: 28px;\n  width: 50%;\n  pointer-events: none;\n  opacity: 0;\n`;\n\nexport const Actions = styled.ul`\n  position: absolute;\n  top: 0;\n  right: 16px;\n  border-radius: 4px;\n  border: 1px solid ${theme.bg.border};\n  background: ${theme.bg.default};\n  list-style-type: none;\n  display: flex;\n  margin-left: 30px;\n\n  &:hover {\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n  }\n`;\n\nexport const Action = styled.li`\n  padding: 3px 10px;\n  display: flex;\n  flex: 0 1 auto;\n  color: ${theme.text.secondary};\n\n  &:hover {\n    cursor: pointer;\n    color: ${theme.text.default};\n  }\n\n  &:first-child {\n    border-left: 0;\n  }\n`;\n\nexport const LikeAction = styled(Action)`\n  color: ${props =>\n    props.hasReacted ? props.theme.warn.alt : props.theme.text.secondary};\n\n  &:hover {\n    color: ${props =>\n      props.hasReacted ? props.theme.warn.alt : props.theme.text.default};\n  }\n`;\n\nexport const GutterTimestamp = styled(Link)`\n  display: flex;\n  align-content: center;\n  align-items: center;\n  justify-content: center;\n  width: 72px;\n  font-size: 14px;\n  font-weight: 400;\n  color: ${theme.text.secondary};\n  opacity: 0;\n  ${Truncate};\n\n  @media (max-width: 400px) {\n    display: none !important;\n  }\n`;\n\nexport const OuterMessageContainer = styled.div`\n  display: grid;\n  grid-template-columns: 72px minmax(0, 1fr);\n  padding-right: 16px;\n  align-self: stretch;\n  position: relative;\n  padding-right: 16px;\n  background: ${props =>\n    props.selected\n      ? props.theme.special.wash\n      : props.error\n      ? props.theme.warn.wash\n      : 'transparent'};\n\n  ${props =>\n    props.selected &&\n    css`\n      background: ${props.theme.special.wash};\n\n      ${ActionsContainer} {\n        opacity: 1;\n        pointer-events: auto;\n      }\n\n      ${GutterTimestamp} {\n        opacity: 1;\n      }\n    `}\n\n  &:hover,\n  &:focus,\n  &:active {\n    background: ${props =>\n      props.selected\n        ? props.theme.special.wash\n        : props.error\n        ? props.theme.warn.border\n        : props.theme.bg.wash};\n\n    ${ActionsContainer} {\n      opacity: 1;\n      pointer-events: auto;\n    }\n\n    ${GutterTimestamp} {\n      opacity: 1;\n    }\n  }\n`;\n\nexport const InnerMessageContainer = styled.div`\n  display: flex;\n  flex: 1 1 auto;\n  padding-right: 32px;\n  flex-direction: column;\n  padding: 4px 0;\n  position: relative;\n`;\n\nexport const GutterContainer = styled.div`\n  display: flex;\n  width: 72px;\n  min-width: 72px;\n  max-width: 72px;\n`;\n\nexport const AuthorAvatarContainer = styled.div`\n  padding-left: 16px;\n  padding-right: 16px;\n  padding-top: 4px;\n`;\n\nconst Bubble = styled.div`\n  display: inline-block;\n  border-radius: 16px;\n  vertical-align: middle;\n  white-space: pre-line;\n  word-wrap: break-word;\n  word-break: break-word;\n  align-self: flex-start;\n  clear: both;\n\n  &::selection {\n    background-color: ${theme.brand.alt};\n  }\n\n  code {\n    border-radius: 4px;\n    padding: 2px 4px;\n    background: ${theme.bg.wash};\n    border: 1px solid ${theme.bg.border};\n    color: ${theme.text.secondary};\n  }\n\n  pre {\n    font-size: 14px;\n    margin: 8px 0;\n    width: 100%;\n    border-radius: 8px;\n    padding: 8px 16px;\n    background: ${theme.bg.wash};\n    border: 1px solid ${theme.bg.border};\n    color: ${theme.text.secondary};\n  }\n\n  pre code {\n    padding: 0;\n    background: none;\n    border: none;\n    color: inherit;\n  }\n`;\n\nexport const Text = styled(Bubble)`\n  font-size: 16px;\n  line-height: 1.4;\n  color: ${props =>\n    props.error ? props.theme.warn.default : props.theme.text.default};\n  font-weight: 400;\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  width: 100%;\n\n  a {\n    text-decoration: underline;\n    word-break: break-word;\n  }\n\n  ul,\n  ol {\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n`;\n\nexport const Emoji = styled(Bubble)`\n  font-size: 48px;\n  line-height: 1;\n  vertical-align: middle;\n  clear: both;\n  display: block;\n  margin-top: 12px;\n  display: flex;\n  align-self: flex-start;\n\n  &:last-of-type {\n    margin-bottom: 0;\n  }\n\n  &:first-of-type:not(:last-of-type) {\n    /* if two emojis are posted back to back, don't add margin to the first one */\n    margin-bottom: 0;\n  }\n\n  & + & {\n    margin: 0; /* if two emojis are next to each other, no margin needed */\n  }\n\n  & + img {\n    margin-top: 8px; /* if emoji is followed by an image */\n    margin-bottom: 8px;\n  }\n\n  & + p {\n    margin-top: 8px; /* if emoji is followed by a bubble, add margin to the bubble */\n  }\n`;\n\nexport const Image = styled.img`\n  display: block;\n  clear: both;\n  flex: 0 0 auto;\n  vertical-align: middle;\n  border-radius: 16px;\n  max-width: 100%;\n  display: flex;\n  align-self: flex-start;\n  opacity: 1;\n  transition: opacity 0.2s ease-out;\n  border: 1px solid #f6f7f8;\n  margin-top: 0;\n  margin-bottom: 0;\n  cursor: pointer;\n`;\n\nexport const Code = styled(Bubble)`\n  padding: 12px 16px;\n  font-size: 14px;\n  font-weight: 500;\n  background-color: ${theme.bg.reverse};\n  border: 1px solid ${theme.bg.border};\n  color: ${theme.text.reverse};\n  max-width: 100%;\n  overflow-x: scroll;\n  list-style: none;\n`;\n\nexport const Line = styled.pre`\n  display: inline-block;\n  line-height: 1.5;\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n  ${monoStack};\n  border: 1px solid ${theme.bg.border};\n`;\n\nexport const Paragraph = styled.div`\n  white-space: pre-wrap;\n  word-break: break-word;\n\n  &:not(:empty) ~ &:not(:empty) {\n    margin-top: 8px;\n  }\n`;\n\nexport const BlockQuote = styled.blockquote`\n  line-height: 1.5;\n  border-left: 4px solid ${theme.bg.border};\n  color: ${theme.text.alt};\n  padding: 4px 12px 4px 16px;\n`;\n\nexport const QuotedParagraph = styled.div`\n  color: ${theme.text.alt};\n\n  code {\n    color: ${theme.text.alt};\n  }\n  /* overrides Bubble component styles to fix #3098 */\n  pre {\n    margin: 0;\n    margin-top: 8px;\n    width: 100%;\n    border: 1px solid ${props => hexa(props.theme.brand.border, 0.5)};\n    color: ${theme.text.alt};\n  }\n`;\n\nexport const QuoteWrapperGradient = styled.div`\n  background: linear-gradient(\n    to top,\n    rgba(255, 255, 255, 1),\n    rgba(255, 255, 255, 0)\n  );\n  height: 2em;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n`;\n\nexport const QuoteWrapper = styled.div`\n  border-left: 4px solid ${theme.bg.border};\n  color: ${theme.text.alt};\n  padding: 4px 12px 4px 16px;\n  max-height: ${props => (props.expanded ? 'none' : '7em')};\n  margin-top: 4px;\n  margin-bottom: 8px;\n  overflow-y: hidden;\n  cursor: pointer;\n  position: relative;\n\n  ${SvgWrapper} {\n    margin-left: -3px;\n    margin-right: 2px;\n  }\n\n  /* Don't change the color of the name and username on hover since they aren't clickable in quotes */\n  ${Username}:hover, ${Byline}:hover {\n    color: ${theme.text.secondary};\n  }\n\n  ${Name} {\n    font-size: 14px;\n    font-weight: 600;\n    color: ${theme.text.secondary};\n  }\n\n  ${Name}:hover {\n    color: ${theme.text.default};\n  }\n\n  ${Username} {\n    font-size: 13px;\n    font-weight: 500;\n    color: ${theme.text.alt};\n  }\n`;\n\nexport const BadgesContainer = styled.div`\n  display: flex;\n  margin-left: 4px;\n\n  @media (max-width: 400px) {\n    margin-top: 4px;\n  }\n`;\n\nexport const EditorInput = styled(EditorWrapper)`\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  flex: auto;\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 20px;\n  min-height: 40px;\n  padding: 8px 16px;\n  transition: padding 0.2s ease-in-out;\n  border-radius: 4px;\n  border: 1px solid ${props => props.theme.bg.border};\n  transition: border 0.3s ease-out;\n  color: ${props => props.theme.text.secondary};\n  background: ${props => props.theme.bg.default};\n  max-width: 100%;\n  word-break: break-all;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    font-size: 16px;\n    padding-left: 16px;\n  }\n\n  &::placeholder {\n    color: ${props => props.theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${props => props.theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${props => props.theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${props => props.theme.text.placeholder};\n  }\n\n  &:hover {\n    border-color: ${props => props.theme.text.alt};\n    transition: border-color 0.2s ease-in;\n  }\n\n  pre {\n    ${monoStack};\n    font-size: 15px;\n    font-weight: 500;\n    background-color: ${theme.bg.wash};\n    border: 1px solid ${theme.bg.border};\n    border-radius: 2px;\n    padding: 4px;\n    margin-right: 16px;\n  }\n\n  blockquote {\n    line-height: 1.5;\n    border-left: 4px solid ${theme.bg.border};\n    color: ${theme.text.alt};\n    padding: 4px 12px 4px 16px;\n  }\n`;\n\nexport const EditActions = styled.div`\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n  margin-top: 8px;\n`;\n\nexport const EditedIndicator = styled.span`\n  display: block;\n  font-size: 11px;\n  color: ${props => props.theme.text.alt};\n`;\n\nexport const ThreadAttachmentsContainer = styled.ul``;\n"
  },
  {
    "path": "src/components/message/threadAttachment/attachment.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport type { Props } from './';\nimport compose from 'recompose/compose';\nimport { Loading } from 'src/components/loading';\nimport { Container, LinkWrapper, AvatarWrapper, Column } from './style';\nimport Activity from 'src/components/inboxThread/activity';\nimport { ThreadTitle } from 'src/components/inboxThread/style';\nimport { UserAvatar } from 'src/components/avatar';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport getThreadLink from 'src/helpers/get-thread-link';\n\nclass Attachment extends React.Component<Props> {\n  render() {\n    const { data, currentUser, id } = this.props;\n    const { thread, loading, error } = data;\n\n    if (loading)\n      return (\n        <div className=\"attachment-container\">\n          <Container style={{ padding: '16px 12px' }}>\n            <Loading />\n          </Container>\n        </div>\n      );\n\n    if (error || !thread)\n      return (\n        <Link to={`/thread/${id}`}>https://spectrum.chat/thread/{id}</Link>\n      );\n\n    return (\n      <div className=\"attachment-container\">\n        <Container data-cy=\"thread-attachment\">\n          <LinkWrapper\n            onClick={e => e.stopPropagation()}\n            to={{ pathname: getThreadLink(thread), state: { modal: true } }}\n          />\n          <AvatarWrapper>\n            <UserAvatar user={thread.author.user} size={32} />\n          </AvatarWrapper>\n          <Column>\n            <ThreadTitle>{thread.content.title}</ThreadTitle>\n            <Activity\n              currentUser={currentUser}\n              thread={thread}\n              active={false}\n            />\n          </Column>\n        </Container>\n      </div>\n    );\n  }\n}\n\nexport default compose(withCurrentUser)(Attachment);\n"
  },
  {
    "path": "src/components/message/threadAttachment/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport {\n  getThreadById,\n  type GetThreadType,\n} from 'shared/graphql/queries/thread/getThread';\nimport type { MessageInfoType } from 'shared/graphql/fragments/message/messageInfo.js';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo.js';\nimport Attachment from './attachment';\n\nexport type Props = {\n  currentUser: UserInfoType,\n  message: MessageInfoType,\n  id: string,\n  data: {\n    thread: GetThreadType,\n    loading: boolean,\n    error: ?string,\n  },\n};\n\nconst Query = ({ data, message, id, ...rest }: Props) => (\n  <Attachment message={message} id={id} data={data} />\n);\n\nconst ThreadAttachment = compose(getThreadById)(Query);\n\nexport default ThreadAttachment;\n"
  },
  {
    "path": "src/components/message/threadAttachment/style.js",
    "content": "// @flow\nimport styled, { createGlobalStyle } from 'styled-components';\nimport theme from 'shared/theme';\nimport { Link } from 'react-router-dom';\nimport { tint, zIndex } from 'src/components/globals';\n\nexport const Container = styled.div``;\nexport const LinkWrapper = styled(Link)``;\nexport const Column = styled.div``;\nexport const AvatarWrapper = styled.div``;\n\nexport const GlobalThreadAttachmentStyles = createGlobalStyle`\n  .attachment-container {\n\n    h3 {\n      font-size: 16px;\n      font-weight: 500;\n      color: ${theme.text.default};\n      max-width: 100%;\n      line-height: 1.4;\n      margin-bottom: -4px;\n      margin-top: 0;\n    }\n\n    img {\n      border-radius: 100px;\n    }\n\n    ${Container} {\n      position: relative;\n      list-style-type: none;\n      border-left: 1px solid ${theme.bg.border};\n      border-right: 1px solid ${theme.bg.border};\n      border-radius: 0px;\n      background: ${theme.bg.default};\n      padding: 8px 12px;\n      z-index: 0;\n      display: flex;\n\n      a {\n        text-decoration: none;\n      }\n\n      > a {\n        display: block;\n        padding: 8px 12px;\n      }\n\n      &:hover {\n        background: ${tint(theme.bg.wash, 1)};\n      }\n\n      &:only-child {\n        border-radius: 4px;\n        border-top: 1px solid ${theme.bg.border};\n        border-bottom: 1px solid ${theme.bg.border};\n        margin: 8px 0;\n      }\n\n      &:not(:first-child):not(:last-child) {\n        border-top: 1px solid ${theme.bg.border};\n      }\n\n      &:first-child:not(:last-child) {\n        border-radius: 4px 4px 0 0;\n        border-top: 1px solid ${theme.bg.border};\n        margin-top: 8px;\n      }\n\n      &:last-child:not(:first-child) {\n        border-radius: 0 0 4px 4px;\n        border-bottom: 1px solid ${theme.bg.border};\n        border-top: 1px solid ${theme.bg.border};\n        margin-bottom: 8px;\n      }\n    }\n\n\n    ${LinkWrapper} {\n      position: absolute;\n      display: inline-block;\n      height: 100%;\n      width: 100%;\n      top: 0;\n      bottom: 0;\n      left: 0;\n      right: 0;\n      z-index: ${zIndex.card};\n\n      &:hover {\n        cursor: pointer;\n      }\n    }\n    \n    ${Column} {\n      display: flex;\n      flex-direction: column;\n    }\n\n    ${AvatarWrapper} {\n      padding-top: 4px;\n      margin-right: 12px;\n    }\n  }\n`;\n"
  },
  {
    "path": "src/components/message/view.js",
    "content": "// @flow\nimport React from 'react';\nimport redraft from 'redraft';\nimport { Text, Emoji, Image, QuotedParagraph } from './style';\nimport { messageRenderer } from 'shared/clients/draft-js/message/renderer';\nimport { draftOnlyContainsEmoji } from 'shared/only-contains-emoji';\nimport type { MessageInfoType } from 'shared/graphql/fragments/message/messageInfo.js';\nimport { messageTypeObj } from 'shared/draft-utils/message-types';\n\ntype BodyProps = {\n  openGallery: Function,\n  me: boolean,\n  message: MessageInfoType,\n  bubble?: boolean,\n  showParent?: boolean,\n};\n\n// This regexp matches /community/channel/slug~id, /?thread=id, /?t=id etc.\n// see https://regex101.com/r/aGamna/2/\nexport const Body = (props: BodyProps) => {\n  const { message, openGallery, me, bubble = true } = props;\n  const emojiOnly =\n    message.messageType === messageTypeObj.draftjs &&\n    draftOnlyContainsEmoji(JSON.parse(message.content.body));\n  const WrapperComponent = bubble ? Text : QuotedParagraph;\n  switch (message.messageType) {\n    case 'optimistic':\n      return (\n        <div key={message.id} className=\"markdown\">\n          <WrapperComponent me={me}>\n            <div dangerouslySetInnerHTML={{ __html: message.content.body }} />\n          </WrapperComponent>\n        </div>\n      );\n    case messageTypeObj.text:\n    default:\n      return (\n        <WrapperComponent key={message.id} me={me}>\n          {message.content.body}\n        </WrapperComponent>\n      );\n    case messageTypeObj.media: {\n      if (typeof message.id === 'number' && message.id < 0) {\n        return null;\n      }\n      return (\n        <Image\n          key={message.id}\n          onClick={openGallery}\n          src={message.content.body}\n        />\n      );\n    }\n    case messageTypeObj.draftjs: {\n      const parsed = JSON.parse(message.content.body);\n      return (\n        <WrapperComponent key={message.id} me={me}>\n          {emojiOnly ? (\n            <Emoji>\n              {parsed && Array.isArray(parsed.blocks) && parsed.blocks[0].text}\n            </Emoji>\n          ) : (\n            <div key={message.id} className=\"markdown\">\n              {redraft(parsed, messageRenderer)}\n            </div>\n          )}\n        </WrapperComponent>\n      );\n    }\n  }\n};\n"
  },
  {
    "path": "src/components/messageGroup/directMessage.js",
    "content": "// @flow\nimport React from 'react';\nimport { convertTimestampToDate } from 'shared/time-formatting';\nimport { ErrorBoundary } from 'src/components/error';\nimport Message from 'src/components/message';\nimport MessageErrorFallback from '../message/messageErrorFallback';\nimport type { Props } from './';\nimport type { GetDirectMessageThreadType } from 'shared/graphql/queries/directMessageThread/getDirectMessageThread';\nimport {\n  MessagesWrapper,\n  MessageGroupContainer,\n  Timestamp,\n  Time,\n} from './style';\n\nconst DirectMessages = (props: {\n  ...Props,\n  thread: GetDirectMessageThreadType,\n}) => {\n  const { thread, messages, threadType, currentUser } = props;\n\n  if (!messages) return null;\n\n  return (\n    <MessagesWrapper data-cy=\"message-group\">\n      {messages.map(group => {\n        // eliminate groups where there are no messages\n        if (!Array.isArray(group) || group.length === 0) return null;\n        // Since all messages in the group have the same Author and same initial timestamp, we only need to pull that data from the first message in the group. So let's get that message and then check who sent it.\n        const initialMessage = group[0];\n        const { author } = initialMessage;\n        const roboText = author.user.id === 'robo';\n        const me = currentUser\n          ? author.user && author.user.id === currentUser.id\n          : false;\n        const canModerateMessage = me;\n\n        if (roboText) {\n          if (initialMessage.type === 'timestamp') {\n            return (\n              <Timestamp key={initialMessage.timestamp}>\n                <hr />\n                <Time>\n                  {convertTimestampToDate(\n                    new Date(initialMessage.timestamp).getTime()\n                  )}\n                </Time>\n                <hr />\n              </Timestamp>\n            );\n          } else {\n            // Ignore unknown robo messages\n            return null;\n          }\n        }\n\n        return (\n          <React.Fragment key={initialMessage.id}>\n            <MessageGroupContainer key={initialMessage.id}>\n              {group.map((message, index) => {\n                return (\n                  <ErrorBoundary\n                    fallbackComponent={() => <MessageErrorFallback />}\n                    key={message.id}\n                  >\n                    <Message\n                      me={me}\n                      key={message.id}\n                      showAuthorContext={index === 0}\n                      message={message}\n                      canModerateMessage={canModerateMessage}\n                      thread={thread}\n                      threadType={threadType}\n                    />\n                  </ErrorBoundary>\n                );\n              })}\n            </MessageGroupContainer>\n          </React.Fragment>\n        );\n      })}\n    </MessagesWrapper>\n  );\n};\n\nexport default DirectMessages;\n"
  },
  {
    "path": "src/components/messageGroup/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport type { GetDirectMessageThreadType } from 'shared/graphql/queries/directMessageThread/getDirectMessageThread';\nimport type { MessageInfoType } from 'shared/graphql/fragments/message/messageInfo';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport ThreadMessages from './thread';\nimport DirectMessages from './directMessage';\n\ntype DirectMessageThreadProps = {\n  threadType: 'directMessageThread',\n  thread?: GetDirectMessageThreadType,\n  messages: Array<?MessageInfoType>,\n  currentUser: ?UserInfoType,\n};\n\ntype StoryProps = {\n  threadType: 'story',\n  thread?: GetThreadType,\n  messages: Array<?MessageInfoType>,\n  currentUser: ?UserInfoType,\n};\n\nexport type Props = DirectMessageThreadProps | StoryProps;\n\nconst ChatMessages = (props: Props) => {\n  if (props.threadType === 'story') return <ThreadMessages {...props} />;\n\n  // $FlowIssue\n  return <DirectMessages {...props} />;\n};\n\nexport default compose(withCurrentUser)(ChatMessages);\n"
  },
  {
    "path": "src/components/messageGroup/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { HorizontalRule } from '../globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const MessagesWrapper = styled.div`\n  flex: 1 0 auto;\n  padding-bottom: 8px;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  max-width: 100%;\n  justify-content: flex-end;\n  background: ${theme.bg.default};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding-bottom: 72px;\n  }\n`;\n\nexport const MessageGroupContainer = styled.div`\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  align-items: flex-start;\n  position: relative;\n  margin-top: 8px;\n`;\n\nexport const Timestamp = styled(HorizontalRule)`\n  margin: 24px 0;\n  text-align: center;\n  user-select: none;\n\n  hr {\n    border-color: ${theme.bg.divider};\n  }\n`;\n\nexport const Time = styled.span`\n  text-align: center;\n  color: ${theme.text.alt};\n  font-size: 14px;\n  font-weight: 500;\n  margin: 0 24px;\n`;\n\nexport const MessageLink = styled.a`\n  position: absolute;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  flex-wrap: nowrap;\n  white-space: nowrap;\n  font-size: 12px;\n  top: 0;\n  color: ${theme.text.alt};\n  left: calc(100% + 4px);\n`;\n\nexport const MessageNonLink = MessageLink.withComponent('span');\n"
  },
  {
    "path": "src/components/messageGroup/thread.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { convertTimestampToDate } from 'shared/time-formatting';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { ErrorBoundary } from 'src/components/error';\nimport Message from 'src/components/message';\nimport MessageErrorFallback from '../message/messageErrorFallback';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport type { Props } from './';\nimport {\n  MessagesWrapper,\n  MessageGroupContainer,\n  Timestamp,\n  Time,\n} from './style';\n\nconst ChatMessages = (props: { ...Props, thread: GetThreadType }) => {\n  const { messages, thread, threadType, currentUser } = props;\n  if (!thread || !messages) return null;\n  const { community } = thread;\n  const { communityPermissions } = community;\n  const { isOwner, isModerator } = communityPermissions;\n  const canModerate = isOwner || isModerator;\n\n  return (\n    <MessagesWrapper data-cy=\"message-group\">\n      {messages.map(group => {\n        // eliminate groups where there are no messages\n        if (!Array.isArray(group) || group.length === 0) return null;\n        // Since all messages in the group have the same Author and same initial timestamp, we only need to pull that data from the first message in the group. So let's get that message and then check who sent it.\n        const initialMessage = group[0];\n        const { author } = initialMessage;\n        const roboText = author.user.id === 'robo';\n        const me = currentUser\n          ? author.user && author.user.id === currentUser.id\n          : false;\n        const canModerateMessage = me || canModerate;\n\n        if (roboText) {\n          if (initialMessage.type === 'timestamp') {\n            return (\n              <Timestamp key={initialMessage.timestamp}>\n                <hr />\n                <Time>\n                  {convertTimestampToDate(\n                    new Date(initialMessage.timestamp).getTime()\n                  )}\n                </Time>\n                <hr />\n              </Timestamp>\n            );\n          } else {\n            // Ignore unknown robo messages\n            return null;\n          }\n        }\n\n        return (\n          <React.Fragment key={initialMessage.id}>\n            <MessageGroupContainer key={initialMessage.id}>\n              {group.map((message, index) => {\n                return (\n                  <ErrorBoundary\n                    fallbackComponent={() => <MessageErrorFallback />}\n                    key={message.id}\n                  >\n                    <Message\n                      me={me}\n                      key={message.id}\n                      showAuthorContext={index === 0}\n                      message={message}\n                      canModerateMessage={canModerateMessage}\n                      thread={thread}\n                      threadType={threadType}\n                    />\n                  </ErrorBoundary>\n                );\n              })}\n            </MessageGroupContainer>\n          </React.Fragment>\n        );\n      })}\n    </MessagesWrapper>\n  );\n};\n\nexport default compose(withCurrentUser)(ChatMessages);\n"
  },
  {
    "path": "src/components/modals/BanUserModal/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport Modal from 'react-modal';\nimport compose from 'recompose/compose';\nimport { closeModal } from 'src/actions/modals';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport banUserMutation from 'shared/graphql/mutations/user/banUser';\nimport type { Dispatch } from 'redux';\nimport ModalContainer from '../modalContainer';\nimport { TextButton, WarnButton } from 'src/components/button';\nimport { modalStyles } from '../styles';\nimport { TextArea, Error } from '../../formElements';\nimport { Form, Actions, Subtitle } from './style';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype State = {\n  reason: ?string,\n  reasonError: boolean,\n  isLoading: boolean,\n};\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  isOpen: boolean,\n  user: GetUserType,\n  currentUser: Object,\n  banUser: Function,\n};\n\nclass BanUserModal extends React.Component<Props, State> {\n  state = {\n    reason: '',\n    reasonError: false,\n    isLoading: false,\n  };\n\n  close = () => {\n    this.props.dispatch(closeModal());\n  };\n\n  changeReason = e => {\n    const reason = e.target.value;\n\n    this.setState({\n      reason,\n      reasonError: false,\n    });\n  };\n\n  submit = e => {\n    e.preventDefault();\n    const { reason } = this.state;\n    const { user, dispatch, banUser } = this.props;\n\n    if (!reason || reason.length === 0) {\n      return this.setState({ reasonError: false });\n    }\n\n    this.setState({\n      isLoading: true,\n    });\n\n    const input = {\n      userId: user.id,\n      reason,\n    };\n\n    banUser(input)\n      .then(() => {\n        this.setState({ isLoading: false });\n        this.close();\n        return dispatch(\n          addToastWithTimeout('success', 'User has been banned.')\n        );\n      })\n      .catch(err => {\n        this.setState({ isLoading: false });\n        return dispatch(addToastWithTimeout('error', err.toString()));\n      });\n  };\n\n  render() {\n    const { isOpen, user } = this.props;\n    const { reason, reasonError, isLoading } = this.state;\n\n    const styles = modalStyles(420);\n\n    return (\n      <Modal\n        /* TODO(@mxstbr): Fix this */\n        ariaHideApp={false}\n        isOpen={isOpen}\n        contentLabel={`Ban ${user.name}`}\n        onRequestClose={this.close}\n        shouldCloseOnOverlayClick={true}\n        style={styles}\n        closeTimeoutMS={330}\n      >\n        <ModalContainer\n          title={`Ban ${user.name} (@${user.username})`}\n          closeModal={this.close}\n        >\n          <Subtitle>\n            Banning a user is very hard to undo. Please be sure you want this\n            user to be permanently banned before completing this step.\n          </Subtitle>\n          <Form>\n            <TextArea\n              defaultValue={reason}\n              onChange={this.changeReason}\n              placeholder={'Add a reason for banning this user...'}\n            />\n\n            {reasonError && (\n              <Error>\n                Please be sure to add a reason for banning this user for our\n                records.\n              </Error>\n            )}\n\n            <Actions>\n              <TextButton onClick={this.close}>Cancel</TextButton>\n              <WarnButton\n                disabled={!reason || reason.length === 0}\n                loading={isLoading}\n                onClick={this.submit}\n              >\n                {isLoading ? 'Banning...' : 'Ban User'}\n              </WarnButton>\n            </Actions>\n          </Form>\n        </ModalContainer>\n      </Modal>\n    );\n  }\n}\n\nconst map = state => ({\n  isOpen: state.modals.isOpen,\n});\n\nexport default compose(\n  // $FlowIssue\n  connect(map),\n  withCurrentUser,\n  banUserMutation\n)(BanUserModal);\n"
  },
  {
    "path": "src/components/modals/BanUserModal/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { FlexRow } from '../../globals';\n\nexport const Form = styled.form`\n  display: flex;\n  flex-direction: column;\n  align-self: stretch;\n  flex: 1 0 auto;\n  padding: 0 24px 24px;\n`;\n\nexport const Actions = styled(FlexRow)`\n  margin-top: 24px;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 8px;\n  }\n`;\n\nexport const Subtitle = styled.h3`\n  font-size: 16px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n  margin-left: 24px;\n  margin-top: 16px;\n  margin-right: 24px;\n`;\n"
  },
  {
    "path": "src/components/modals/DeleteDoubleCheckModal/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport Modal from 'react-modal';\nimport compose from 'recompose/compose';\nimport { withRouter, type History } from 'react-router';\nimport { closeModal } from 'src/actions/modals';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport deleteCommunityMutation from 'shared/graphql/mutations/community/deleteCommunity';\nimport type { DeleteCommunityType } from 'shared/graphql/mutations/community/deleteCommunity';\nimport deleteChannelMutation from 'shared/graphql/mutations/channel/deleteChannel';\nimport type { DeleteChannelType } from 'shared/graphql/mutations/channel/deleteChannel';\nimport deleteThreadMutation from 'shared/graphql/mutations/thread/deleteThread';\nimport type { DeleteThreadType } from 'shared/graphql/mutations/thread/deleteThread';\nimport deleteMessage from 'shared/graphql/mutations/message/deleteMessage';\nimport type { DeleteMessageType } from 'shared/graphql/mutations/message/deleteMessage';\n\nimport ModalContainer from '../modalContainer';\nimport { TextButton, WarnButton } from 'src/components/button';\nimport { modalStyles } from '../styles';\nimport { Actions, Message } from './style';\nimport type { Dispatch } from 'redux';\n\n/*\n  Generic component that should be used to confirm any 'delete' action.\n  Takes modalProps as an object with four fields:\n\n  entity => represents the table for lookup in the backend. Currently can\n  be either 'thread', 'channel', or 'community'\n\n  id => id of the entity to be deleted\n\n  message => components can construct a custom confirmation message\n\n  redirect => optional => string which represents the path a user should return\n  too after deleting a thing (e.g. '/foo/bar')\n*/\ntype State = {\n  isLoading: boolean,\n};\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  modalProps: {\n    id: string,\n    entity: string,\n    redirect?: ?string,\n    message?: ?string,\n    buttonLabel?: string,\n    extraProps?: any,\n  },\n  deleteMessage: Function,\n  deleteCommunity: Function,\n  deleteThread: Function,\n  deleteChannel: Function,\n  dispatch: Dispatch<Object>,\n  isOpen: boolean,\n  history: History,\n};\n\nexport const deleteMessageWithToast = (\n  dispatch: Function,\n  deleteMessage: Function,\n  id: string\n) => {\n  return deleteMessage(id)\n    .then(({ data }: DeleteMessageType) => {\n      const { deleteMessage } = data;\n      if (deleteMessage) {\n        dispatch(addToastWithTimeout('neutral', 'Message deleted.'));\n      }\n    })\n    .catch(err => {\n      dispatch(\n        addToastWithTimeout(\n          'error',\n          `Sorry, we weren't able to delete this message. ${err.message}`\n        )\n      );\n    });\n};\n\nclass DeleteDoubleCheckModal extends React.Component<Props, State> {\n  state = {\n    isLoading: false,\n  };\n\n  close = () => {\n    this.props.dispatch(closeModal());\n  };\n\n  triggerDelete = () => {\n    const {\n      history,\n      modalProps: { id, entity, redirect, extraProps },\n      dispatch,\n    } = this.props;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    switch (entity) {\n      case 'message':\n        return deleteMessageWithToast(\n          this.props.dispatch,\n          this.props.deleteMessage,\n          id\n        ).then(() => {\n          this.setState({\n            isLoading: false,\n          });\n          this.close();\n        });\n      case 'thread': {\n        if (!extraProps) return;\n        const { community } = extraProps.thread;\n        return this.props\n          .deleteThread(id)\n          .then(({ data }: DeleteThreadType) => {\n            const { deleteThread } = data;\n            if (deleteThread) {\n              history.replace(`/${community.slug}?tab=posts`);\n              dispatch(addToastWithTimeout('neutral', 'Thread deleted.'));\n              this.setState({\n                isLoading: false,\n              });\n              this.close();\n            }\n            return;\n          })\n          .catch(err => {\n            dispatch(\n              addToastWithTimeout(\n                'error',\n                `Sorry, we weren't able to delete this thread. ${err.message}`\n              )\n            );\n          });\n      }\n      case 'channel': {\n        return this.props\n          .deleteChannel(id)\n          .then(({ data }: DeleteChannelType) => {\n            const { deleteChannel } = data;\n            if (deleteChannel) {\n              // TODO: When we figure out the mutation reducers in apollo\n              // client we can just history push and trust the store to update\n              // eslint-disable-next-line\n              window.location.href = redirect ? redirect : '/';\n              // history.push(redirect ? redirect : '/');\n              dispatch(addToastWithTimeout('neutral', 'Channel deleted.'));\n              this.setState({\n                isLoading: false,\n              });\n              this.close();\n            }\n            return;\n          })\n          .catch(err => {\n            dispatch(\n              addToastWithTimeout(\n                'error',\n                `Sorry, we weren't able to delete this channel. ${err.message}`\n              )\n            );\n          });\n      }\n      case 'community': {\n        return this.props\n          .deleteCommunity(id)\n          .then(({ data }: DeleteCommunityType) => {\n            const { deleteCommunity } = data;\n            if (deleteCommunity) {\n              // TODO: When we figure out the mutation reducers in apollo\n              // client we can just history push and trust the store to update\n              // eslint-disable-next-line\n              window.location.href = redirect ? redirect : '/';\n              // history.push(redirect ? redirect : '/');\n              dispatch(addToastWithTimeout('neutral', 'Community deleted.'));\n              this.setState({\n                isLoading: false,\n              });\n              this.close();\n            }\n            return;\n          })\n          .catch(err => {\n            dispatch(\n              addToastWithTimeout(\n                'error',\n                `Sorry, we weren't able to delete this community. ${\n                  err.message\n                }`\n              )\n            );\n            this.setState({\n              isLoading: false,\n            });\n          });\n      }\n      default: {\n        this.setState({\n          isLoading: false,\n        });\n\n        return dispatch(\n          addToastWithTimeout(\n            'error',\n            'Unable to figure out what you wanted to delete. Whoops!'\n          )\n        );\n      }\n    }\n  };\n\n  render() {\n    const {\n      isOpen,\n      modalProps: { message, buttonLabel },\n    } = this.props;\n    const styles = modalStyles();\n\n    return (\n      <Modal\n        /* TODO(@mxstbr): Fix this */\n        ariaHideApp={false}\n        isOpen={isOpen}\n        contentLabel={'Are you sure?'}\n        onRequestClose={this.close}\n        shouldCloseOnOverlayClick={true}\n        style={styles}\n        closeTimeoutMS={330}\n      >\n        {/*\n          We pass the closeModal dispatch into the container to attach\n          the action to the 'close' icon in the top right corner of all modals\n        */}\n        <ModalContainer title={'Are you sure?'} closeModal={this.close}>\n          <Message>{message ? message : 'Are you sure?'}</Message>\n\n          <Actions>\n            <TextButton onClick={this.close}>Cancel</TextButton>\n            <WarnButton\n              loading={this.state.isLoading}\n              onClick={this.triggerDelete}\n              data-cy={'delete-button'}\n            >\n              {buttonLabel || 'Delete'}\n            </WarnButton>\n          </Actions>\n        </ModalContainer>\n      </Modal>\n    );\n  }\n}\n\nconst DeleteDoubleCheckModalWithMutations = compose(\n  deleteCommunityMutation,\n  deleteChannelMutation,\n  deleteThreadMutation,\n  deleteMessage,\n  withRouter\n)(DeleteDoubleCheckModal);\n\nconst map = state => ({\n  isOpen: state.modals.isOpen,\n  modalProps: state.modals.modalProps,\n});\n\n// $FlowIssue\nexport default connect(map)(DeleteDoubleCheckModalWithMutations);\n"
  },
  {
    "path": "src/components/modals/DeleteDoubleCheckModal/style.js",
    "content": "// @flow\n// $FlowFixMe\nimport styled from 'styled-components';\nimport { FlexRow } from '../../globals';\n\nexport const Actions = styled(FlexRow)`\n  margin-top: 24px;\n  padding: 0 24px 24px;\n  justify-content: flex-end;\n\n  button + button {\n    margin-left: 8px;\n  }\n`;\n\nexport const Message = styled.div`\n  line-height: 1.4;\n  margin: 8px 24px;\n\n  p {\n    margin-top: 8px;\n  }\n\n  b {\n    font-weight: 700;\n  }\n`;\n"
  },
  {
    "path": "src/components/modals/modalContainer.js",
    "content": "import React from 'react';\nimport { ModalBody, Header, ModalContent, Title, CloseButton } from './styles';\n\n/*\n  ModalContainer is included around all modal components in order to have a\n  consistent wrapper and consistent close-button behavior. Otherwise it will\n  accept any arbitrary content via `props.children`\n*/\n\nconst ModalContainer = ({\n  closeModal,\n  children,\n  title,\n  noHeader,\n  dataCy,\n}: {\n  closeModal: Function,\n  children?: Object,\n  title: string,\n  dataCy?: string,\n}): React$Element<any> => {\n  return (\n    <ModalBody data-cy={dataCy}>\n      <Header noHeader={noHeader}>\n        <Title>{title}</Title>\n        <CloseButton onClick={() => closeModal()} glyph=\"view-close\" />\n      </Header>\n\n      <ModalContent>{children}</ModalContent>\n    </ModalBody>\n  );\n};\n\nexport default ModalContainer;\n"
  },
  {
    "path": "src/components/modals/modalRoot.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport BanUserModal from './BanUserModal';\nimport DeleteDoubleCheckModal from './DeleteDoubleCheckModal';\n\nconst MODAL_COMPONENTS = {\n  DELETE_DOUBLE_CHECK_MODAL: DeleteDoubleCheckModal,\n  BAN_USER_MODAL: BanUserModal,\n};\n\nexport type ModalTypes = $Keys<typeof MODAL_COMPONENTS>;\n\n/*\n  Takes a modalType and modalProps to dynamically return the\n  modal component we imported above\n*/\nconst modalRoot = ({ modalType, modalProps }) => {\n  if (!modalType) {\n    return null;\n  }\n\n  const SpecificModal = MODAL_COMPONENTS[modalType];\n  return <SpecificModal {...modalProps} />;\n};\n\nconst mapStateToProps = state => ({\n  modalProps: state.modals.modalProps,\n  modalType: state.modals.modalType,\n});\n\n// $FlowIssue\nexport default connect(mapStateToProps)(modalRoot);\n"
  },
  {
    "path": "src/components/modals/styles.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { zIndex } from '../globals';\nimport { isMobile } from 'src/helpers/utils';\nimport Icon from 'src/components/icon';\n\n/*\n  This is the global stylesheet for all modal components. Its styles will wrap\n  all modal content, so we should be selective about what is included here\n*/\n\nconst mobile = isMobile();\n/*\n  modalStyles are defined as a JS object because it gets passed in as inline\n  styles to the react-modal component. Takes an optional maxWidth argument for\n  desktop sizing.\n*/\nexport const modalStyles = (maxWidth: number = 360) => {\n  return {\n    // dark background behind all modals\n    overlay: {\n      background: 'rgba(0, 0, 0, 0.75)',\n      display: 'flex',\n      alignItems: mobile ? 'flex-start' : 'center',\n      justifyContent: 'center',\n      position: 'fixed',\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n      overflowY: 'visible',\n      overflowX: 'hidden',\n      zIndex: 9998,\n      padding: '1.2rem',\n    },\n    // modal root\n    content: {\n      position: 'relative',\n      background: '#ffffff',\n      backgroundClip: 'padding-box',\n      borderRadius: '12px',\n      border: '0',\n      padding: '0',\n      zIndex: 9999,\n      width: '100%',\n      maxWidth: `${maxWidth}px`,\n      top: 'auto',\n      bottom: 'auto',\n      left: 'auto',\n      right: 'auto',\n      backgroundColor: 'rgba(0,0,0,0)',\n      boxShadow: '0 4px 24px rgba(0,0,0,0.40)',\n      fontFamily:\n        '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n    },\n  };\n};\n\nexport const ModalBody = styled.div`\n  /* modal content should always flow top-to-bottom. inner components can\n  have a flex-row property defined */\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  height: 100%;\n  background-color: ${theme.bg.default};\n  overflow: visible;\n`;\n\nexport const Title = styled.div`\n  font-weight: 800;\n  font-size: 20px;\n  line-height: 28px;\n`;\n\nexport const Header = styled.div`\n  padding: 20px 24px 0;\n  display: ${props => (props.noHeader ? 'none' : 'flex')};\n  justify-content: space-between;\n`;\n\nexport const ModalContent = styled.div``;\n\nexport const Footer = styled.div``;\n\nexport const CloseButton = styled(Icon)`\n  position: absolute;\n  right: 8px;\n  top: 8px;\n  z-index: ${zIndex.modal + 1};\n  color: ${theme.text.placeholder};\n\n  &:hover {\n    color: ${theme.warn.alt};\n  }\n`;\n\nexport const Description = styled.p`\n  font-size: 14px;\n  color: ${theme.text.default};\n  padding: 8px 0 16px;\n  line-height: 1.4;\n\n  a {\n    color: ${theme.brand.default};\n  }\n`;\n\nexport const UpsellDescription = styled(Description)`\n  padding: 8px 12px;\n  margin: 8px 0;\n  border-radius: 4px;\n  border: 1px solid ${theme.success.border};\n  background: ${theme.success.wash};\n  color: ${theme.success.dark};\n\n  a {\n    color: ${theme.success.default};\n    font-weight: 700;\n    display: block;\n    margin-top: 4px;\n  }\n`;\n\nexport const Notice = styled(Description)`\n  padding: 8px 16px;\n  margin: 8px 0;\n  border-radius: 4px;\n  background: ${theme.special.wash};\n  border: 2px solid ${theme.special.border};\n  color: ${theme.special.dark};\n`;\n"
  },
  {
    "path": "src/components/nextPageButton/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { Spinner } from '../globals';\nimport { HasNextPage, NextPageButton } from './style';\nimport VisibilitySensor from 'react-visibility-sensor';\nimport { Link, type Location } from 'react-router-dom';\n\ntype Props = {\n  isFetchingMore?: boolean,\n  href?: Location,\n  fetchMore: () => any,\n  children?: string,\n  automatic?: boolean,\n  topOffset?: number,\n  bottomOffset?: number,\n};\n\nconst NextPageButtonWrapper = (props: Props) => {\n  const {\n    isFetchingMore,\n    fetchMore,\n    href,\n    children,\n    automatic = true,\n    topOffset = -250,\n    bottomOffset = -250,\n  } = props;\n  const onChange = (isVisible: boolean) => {\n    if (isFetchingMore || !isVisible) return;\n    return fetchMore();\n  };\n  return (\n    <HasNextPage\n      as={href ? Link : 'div'}\n      to={href}\n      onClick={evt => {\n        evt.preventDefault();\n        onChange(true);\n      }}\n      data-cy=\"load-previous-messages\"\n    >\n      <VisibilitySensor\n        active={automatic !== false && !isFetchingMore}\n        delayedCall\n        partialVisibility\n        scrollCheck\n        intervalDelay={150}\n        onChange={onChange}\n        offset={{\n          top: topOffset,\n          bottom: bottomOffset,\n        }}\n      >\n        <NextPageButton loading={isFetchingMore}>\n          {isFetchingMore ? (\n            <Spinner size={16} color={'brand.default'} />\n          ) : (\n            children || 'Load more'\n          )}\n        </NextPageButton>\n      </VisibilitySensor>\n    </HasNextPage>\n  );\n};\n\nexport default NextPageButtonWrapper;\n"
  },
  {
    "path": "src/components/nextPageButton/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { hexa, tint } from 'src/components/globals';\nimport { Link } from 'react-router-dom';\n\nexport const HasNextPage = styled(Link)`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  text-decoration: none;\n  background: ${theme.bg.default};\n  width: 100%;\n`;\n\nexport const NextPageButton = styled.span`\n  display: flex;\n  flex: 1;\n  margin-top: 16px;\n  justify-content: center;\n  padding: 8px;\n  background: ${hexa(theme.brand.default, 0.04)};\n  color: ${tint(theme.brand.default, -8)};\n  border-top: 1px solid ${hexa(theme.brand.default, 0.06)};\n  border-bottom: 1px solid ${hexa(theme.brand.default, 0.06)};\n  font-size: 15px;\n  font-weight: 500;\n  position: relative;\n  min-height: 40px;\n  width: 100%;\n\n  &:hover {\n    color: ${theme.brand.default};\n    cursor: pointer;\n    background: ${hexa(theme.brand.default, 0.08)};\n  }\n`;\n"
  },
  {
    "path": "src/components/outsideClickHandler/index.js",
    "content": "// @flow\nimport * as React from 'react';\n\ntype Props = {\n  children: React$Node,\n  style?: Object,\n  onOutsideClick: Function,\n};\n\nclass OutsideAlerter extends React.Component<Props> {\n  wrapperRef: React$Node;\n\n  // iOS bug, see: https://stackoverflow.com/questions/10165141/jquery-on-and-delegate-doesnt-work-on-ipad\n  componentDidMount() {\n    // $FlowFixMe\n    document\n      .getElementById('root')\n      .addEventListener('mousedown', this.handleClickOutside);\n  }\n\n  componentWillUnmount() {\n    // $FlowFixMe\n    document\n      .getElementById('root')\n      .removeEventListener('mousedown', this.handleClickOutside);\n  }\n\n  setWrapperRef = (node: React$Node) => {\n    this.wrapperRef = node;\n  };\n\n  /**\n   * Alert if clicked on outside of element\n   */\n  handleClickOutside = (event: any) => {\n    // $FlowFixMe\n    if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {\n      this.props.onOutsideClick();\n    }\n  };\n\n  render() {\n    const { style = {}, children } = this.props;\n    return (\n      // $FlowFixMe\n      <div style={style} ref={this.setWrapperRef}>\n        {children}\n      </div>\n    );\n  }\n}\n\nexport default OutsideAlerter;\n"
  },
  {
    "path": "src/components/profile/coverPhoto.js",
    "content": "// @flow\nimport React from 'react';\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { ProfileHeaderAction } from './style';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst PhotoContainer = styled.div`\n  grid-area: cover;\n  position: relative;\n  width: 100%;\n  flex: 0 0 ${props => (props.large ? '320px' : '96px')};\n  background-color: ${theme.bg.reverse};\n  background-image: ${props =>\n    props.coverURL ? `url(${props.coverURL})` : 'none'};\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  border-radius: ${props => (props.large ? '0' : '12px 12px 0 0')};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex: 0 0 ${props => (props.large ? '160px' : '64px')};\n    border-radius: 0;\n  }\n`;\n\nconst CoverAction = styled(ProfileHeaderAction)`\n  position: absolute;\n  top: 12px;\n  right: 12px;\n`;\n\nexport const CoverPhoto = (props: Object) => {\n  if (props.user) {\n    return (\n      <PhotoContainer coverURL={props.user.coverPhoto}>\n        {props.currentUser && props.currentUser.id === props.user.id ? (\n          <Link to={`../users/${props.user.username}/settings`}>\n            <CoverAction\n              glyph=\"settings\"\n              color=\"text.reverse\"\n              opacity=\"0.5\"\n              hoverColor=\"text.reverse\"\n            />\n          </Link>\n        ) : props.currentUser ? (\n          <CoverAction\n            glyph=\"message-fill\"\n            color=\"text.reverse\"\n            hoverColor=\"text.reverse\"\n            onClick={props.onClick}\n          />\n        ) : null}\n        {props.children}\n      </PhotoContainer>\n    );\n  } else {\n    return (\n      <PhotoContainer large coverURL={props.src}>\n        {props.children}\n      </PhotoContainer>\n    );\n  }\n};\n"
  },
  {
    "path": "src/components/profile/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport Thread from './thread';\n\nconst ProfilePure = (props: Object): ?React$Element<any> => {\n  const { type } = props;\n  switch (type) {\n    case 'thread': {\n      return <Thread {...props} />;\n    }\n    default: {\n      return null;\n    }\n  }\n};\n\nexport type ProfileSizeProps =\n  | 'mini'\n  | 'full'\n  | 'miniWithAction'\n  | 'upsell'\n  | 'simple'\n  | 'listItemWithAction';\n\ntype ProfileProps = {\n  data: Object,\n  profileSize?: ProfileSizeProps,\n};\n\n/*\n  Create exportables which just wrap a type prop, so in the UI we can Write\n  <UserProfile /> and this file will handle the type declaration, which will\n  then get passed to our switch statement above to return the right component.\n*/\nexport const Profile = compose()(ProfilePure);\nexport const ThreadProfile = (props: ProfileProps) => (\n  <Profile type=\"thread\" {...props} />\n);\n"
  },
  {
    "path": "src/components/profile/metaData.js",
    "content": "//@flow\nimport React from 'react';\nimport Icon from 'src/components/icon';\nimport { Meta, MetaList, MetaListItem, Label, Count } from './style';\n\n/*\n  Brian:\n  Given the type of metadata we want to render, we need to hardcode a label and\n  icon for the UI. A big if-return function like this feels messy, but is relatively\n  easy to extend or modify as needed\n*/\nconst buildArray = (meta: Object): Array<any> => {\n  // Apollo returns a __typename field in the data object; filter it out\n  return Object.keys(meta)\n    .filter(item => item !== '__typename')\n    .map(item => {\n      if (item === 'threads') {\n        return Object.assign(\n          {},\n          {\n            icon: 'post',\n            label: 'Threads',\n            count: meta[item],\n          }\n        );\n      }\n\n      if (item === 'channels') {\n        return Object.assign(\n          {},\n          {\n            icon: 'channel',\n            label: 'Channels',\n            count: meta[item],\n          }\n        );\n      }\n\n      if (item === 'subscribers') {\n        return Object.assign(\n          {},\n          {\n            icon: 'person',\n            label: 'Subscribers',\n            count: meta[item],\n          }\n        );\n      }\n\n      if (item === 'members') {\n        return Object.assign(\n          {},\n          {\n            icon: 'person',\n            label: 'Members',\n            count: meta[item],\n          }\n        );\n      }\n\n      return {};\n    });\n};\n\nexport const MetaData = ({ data }: any) => {\n  const arr = buildArray(data);\n\n  return (\n    <Meta>\n      <MetaList>\n        {arr.map((item, i) => {\n          return (\n            <MetaListItem key={i}>\n              <Label>\n                <Icon glyph={item.icon} />\n                <span>{item.label}</span>\n              </Label>\n              <Count>{item.count}</Count>\n            </MetaListItem>\n          );\n        })}\n      </MetaList>\n    </Meta>\n  );\n};\n"
  },
  {
    "path": "src/components/profile/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport {\n  FlexRow,\n  FlexCol,\n  Truncate,\n  Transition,\n  zIndex,\n  Shadow,\n  hexa,\n} from 'src/components/globals';\nimport { Button, OutlineButton } from 'src/components/button';\nimport Icon from 'src/components/icon';\nimport Card from 'src/components/card';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ProfileHeader = styled(FlexRow)`\n  padding: 16px;\n  width: 100%;\n  display: flex;\n  flex-wrap: nowrap;\n`;\n\nexport const ProfileHeaderLink = styled(Link)`\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  flex-wrap: nowrap;\n  flex: auto;\n  min-width: 0;\n\n  &:hover h3 {\n    transition: ${Transition.hover.on};\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const ProfileHeaderNoLink = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  flex-wrap: nowrap;\n  flex: auto;\n  min-width: 0;\n\n  &:hover h3 {\n    transition: ${Transition.hover.on};\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const ProfileHeaderMeta = styled(FlexCol)`\n  flex: 1 1 auto;\n  flex-wrap: nowrap;\n  min-width: 0;\n`;\n\nexport const ProfileHeaderAction = styled(Icon)`\n  margin-left: 16px;\n  flex: 0 0 auto;\n`;\n\nexport const Title = styled.h3`\n  font-size: 16px;\n  color: ${theme.text.default};\n  font-weight: 700;\n  line-height: 1.2;\n  transition: ${Transition.hover.off};\n`;\n\nexport const FullTitle = styled(Title)`\n  font-size: 24px;\n  margin-top: 16px;\n`;\n\nexport const FullProfile = styled.div`\n  margin-left: 32px;\n  margin-top: -64px;\n  background-color: ${theme.bg.default};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-top: -48px;\n  }\n`;\n\nexport const Subtitle = styled.div`\n  display: flex;\n  align-items: center;\n  font-size: 16px;\n  color: ${theme.text.alt};\n  line-height: 1.2;\n  margin-top: 4px;\n\n  ${Truncate};\n\n  overflow: visible;\n`;\n\nexport const Description = styled.div`\n  font-size: 16px;\n  color: ${theme.text.alt};\n  padding: 0 16px 16px;\n  line-height: 1.4;\n  white-space: pre-wrap;\n\n  a {\n    font-weight: 500;\n    color: ${theme.brand.alt};\n\n    &:hover {\n      text-decoration: underline;\n    }\n  }\n`;\n\nexport const FullDescription = styled.div`\n  padding: 0;\n  margin-top: 16px;\n  color: ${theme.text.alt};\n\n  p {\n    white-space: pre-wrap;\n    margin-bottom: 24px;\n  }\n\n  a {\n    color: ${theme.text.secondary};\n  }\n\n  a:hover {\n    color: ${theme.text.default};\n    text-decoration: none;\n  }\n`;\n\nexport const Actions = styled(FlexRow)`\n  padding: 16px;\n  padding-top: 0;\n  flex: 1 0 100%;\n  justify-content: flex-end;\n`;\n\nexport const Action = styled(Button)`\n  &:last-of-type:not(:first-of-type) {\n    margin-left: 8px;\n  }\n`;\n\nexport const ActionOutline = styled(OutlineButton)`\n  flex-grow: 1;\n\n  &:last-of-type:not(:first-of-type) {\n    margin-left: 8px;\n  }\n`;\n\nexport const Meta = styled.div`\n  background: #f8fbfe;\n  border-top: 2px solid ${theme.bg.border};\n  padding: 8px 16px;\n  width: 100%;\n  border-radius: 0 0 4px 4px;\n`;\n\nexport const MetaList = styled.ul``;\n\nexport const MetaListItem = styled.li`\n  list-style-type: none;\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  padding: 8px 0;\n  border-top: 2px solid ${theme.bg.border};\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n\n  &:first-child {\n    border-top: none;\n    padding-top: 0;\n  }\n\n  &:last-child {\n    padding-bottom: 0;\n  }\n`;\n\nexport const Label = styled.span`\n  display: flex;\n  align-items: center;\n\n  /* icon */\n  div {\n    margin-right: 8px;\n  }\n`;\n\nexport const Count = styled.span`\n  font-weight: 500;\n`;\n\nexport const CoverLink = styled(ProfileHeaderLink)`\n  flex: none;\n  margin-top: -32px;\n  flex-direction: column;\n  align-items: center;\n  padding: 0 16px;\n`;\n\nexport const CoverTitle = styled(Title)`\n  font-size: 20px;\n  margin-top: 16px;\n  text-align: center;\n`;\n\nexport const CoverSubtitle = styled(Subtitle)`\n  text-align: center;\n  margin-bottom: 16px;\n  justify-content: center;\n`;\n\nexport const CoverDescription = styled(Description)`\n  flex: auto;\n  margin-top: 8px;\n`;\n\n// had a hard time targeting the ChannelListItem component, so this is a janky way to get the overrides I needed.\nexport const ProfileCard = styled(Card)`\n  > div:first-of-type,\n  > a > div {\n    padding: 16px;\n\n    h4 > a:hover {\n      color: ${theme.brand.alt};\n      text-decoration: underline;\n    }\n  }\n`;\n\nexport const ThreadProfileCard = styled(ProfileCard)`\n  border-radius: 4px;\n  box-shadow: ${Shadow.low} ${({ theme }) => hexa(theme.text.default, 0.1)};\n`;\n\nexport const CoverPhoto = styled.div`\n  position: relative;\n  width: 100%;\n  height: ${props => (props.large ? '320px' : '96px')};\n  background-color: ${theme.brand.default};\n  background-image: url('${props => props.url}');\n  background-size: cover;\n  background-repeat: no-repeat;\n  background-position: center;\n  border-radius: ${props => (props.large ? '4px' : '4px 4px 0 0')};\n`;\n\nexport const Container = styled.div`\n  background: ${theme.bg.default};\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.08);\n  flex: 0 0 22%;\n  display: flex;\n  flex-direction: column;\n  border-radius: 4px;\n  position: relative;\n  z-index: ${zIndex.card};\n  margin: 16px;\n\n  @media (max-width: 1168px) {\n    flex-basis: 44%;\n  }\n\n  @media (max-width: 540px) {\n    flex-basis: 100%;\n  }\n`;\n\nexport const ButtonContainer = styled.div`\n  padding: 8px 16px 16px;\n\n  button {\n    width: 100%;\n  }\n`;\n\nexport const MessageButtonContainer = styled.div`\n  width: 100%;\n  display: flex;\n  padding: 0 8px 8px;\n  align-items: stretch;\n\n  a,\n  button {\n    width: 100%;\n    display: flex;\n    flex: auto;\n    justify-content: center;\n    text-align: center;\n  }\n`;\n"
  },
  {
    "path": "src/components/profile/thread.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { withRouter } from 'react-router';\nimport compose from 'recompose/compose';\nimport { Link } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport { ThreadListItem } from '../listItems';\nimport { ThreadProfileCard } from './style';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\n\ntype Props = {\n  data: {\n    thread: GetThreadType,\n    error: ?string,\n  },\n  setName: Function,\n  markAsDeleted: Function,\n  id: string,\n  children: any,\n};\n\nclass ThreadWithData extends React.Component<Props> {\n  componentDidMount() {\n    const {\n      data: { thread },\n      data,\n      setName,\n      markAsDeleted,\n      id,\n    } = this.props;\n\n    if (setName && thread) {\n      setName(thread.community.name);\n    }\n\n    // if the query finished loading but no thread was returned,\n    // clear this notification out\n    if (data.networkStatus === 7 && !data.thread && markAsDeleted) {\n      markAsDeleted(id);\n    }\n  }\n\n  render() {\n    const {\n      data: { thread, error },\n    } = this.props;\n    if (error || !thread) {\n      return null;\n    }\n\n    return (\n      <ThreadProfileCard>\n        <Link\n          to={{\n            pathname: getThreadLink(thread),\n            state: {\n              modal: true,\n            },\n          }}\n        >\n          <ThreadListItem\n            contents={thread}\n            withDescription={false}\n            meta={`${thread.messageCount} message${\n              thread.messageCount === 1 ? '' : 's'\n            }`}\n          />\n        </Link>\n      </ThreadProfileCard>\n    );\n  }\n}\n\nexport default compose(\n  connect(),\n  withRouter\n)(ThreadWithData);\n"
  },
  {
    "path": "src/components/reaction/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { GetMessageType } from 'shared/graphql/queries/message/getMessage';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  currentUser?: Object,\n  me: boolean,\n  message: GetMessageType,\n  render: Function,\n};\n\nclass Reaction extends React.Component<Props> {\n  render() {\n    const {\n      me,\n      message: {\n        reactions: { hasReacted, count },\n      },\n    } = this.props;\n    return this.props.render({ me, hasReacted, count });\n  }\n}\n\nexport default Reaction;\n"
  },
  {
    "path": "src/components/reaction/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\n\nexport const ReactionWrapper = styled.span`\n  display: flex;\n  flex: 0 1 auto;\n  align-items: center;\n  justify-content: center;\n  border-radius: 4px;\n  padding: 2px 8px;\n  margin-top: 4px;\n  background: ${props =>\n    props.hasReacted ? props.theme.warn.wash : props.theme.bg.wash};\n  border: 1px solid\n    ${props =>\n      props.hasReacted ? props.theme.warn.border : props.theme.bg.border};\n  color: ${props =>\n    props.hasReacted ? props.theme.warn.alt : props.theme.text.alt};\n  align-self: flex-start;\n  cursor: pointer;\n  font-size: 13px;\n  font-weight: 600;\n  line-height: 1;\n\n  &:hover {\n    color: ${props =>\n      props.hasReacted ? props.theme.warn.alt : props.theme.text.secondary};\n  }\n\n  .icon {\n    color: ${props =>\n      props.hasReacted ? props.theme.warn.alt : props.theme.text.alt};\n    margin-right: 4px;\n    margin-top: -1px;\n  }\n`;\n"
  },
  {
    "path": "src/components/redirectHandler/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { history } from 'src/helpers/history';\nimport queryString from 'query-string';\nimport Routes from 'src/hot-routes';\n\ntype Props = {\n  currentUser: ?Object,\n  isLoadingCurrentUser: boolean,\n  maintenanceMode: boolean,\n};\n\nclass RedirectHandler extends React.Component<Props> {\n  componentDidUpdate(prev: Props) {\n    const curr = this.props;\n    const params = queryString.parse(history.location.search);\n    const doneFetching =\n      prev.isLoadingCurrentUser && !curr.isLoadingCurrentUser;\n\n    if (doneFetching) {\n      // Redirect ?t=asdfxyz to the thread view only for anonymous users who wouldn't see it\n      // in their inbox view (since they don't have an inbox view)\n      if (!curr.currentUser && params.t) {\n        history.replace(`/thread/${params.t}`);\n      }\n    }\n  }\n\n  render() {\n    return <Routes maintenanceMode={this.props.maintenanceMode} />;\n  }\n}\n\nexport default compose(withCurrentUser)(RedirectHandler);\n"
  },
  {
    "path": "src/components/rich-text-editor/prism-theme.css",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+abap+actionscript+ada+apacheconf+apl+applescript+asciidoc+aspnet+autoit+autohotkey+bash+basic+batch+c+brainfuck+bro+bison+csharp+cpp+coffeescript+ruby+css-extras+d+dart+diff+docker+eiffel+elixir+erlang+fsharp+fortran+gherkin+git+glsl+go+graphql+groovy+haml+handlebars+haskell+haxe+http+icon+inform7+ini+j+jade+java+jolie+json+julia+keyman+kotlin+latex+less+livescript+lolcode+lua+makefile+markdown+matlab+mel+mizar+monkey+nasm+nginx+nim+nix+nsis+objectivec+ocaml+oz+parigp+parser+pascal+perl+php+php-extras+powershell+processing+prolog+properties+protobuf+puppet+pure+python+q+qore+r+jsx+reason+rest+rip+roboconf+crystal+rust+sas+sass+scss+scala+scheme+smalltalk+smarty+sql+stylus+swift+tcl+textile+twig+typescript+verilog+vhdl+vim+wiki+xojo+yaml */\n/**\n* prism.js default theme for JavaScript, CSS and HTML\n* Based on dabblet (http://dabblet.com)\n* @author Lea Verou\n*/\n\ncode[class*='language-'],\npre[class*='language-'] {\n  color: black;\n  background: none;\n  text-shadow: 0 1px white;\n  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n\n  -moz-tab-size: 4;\n  -o-tab-size: 4;\n  tab-size: 4;\n\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\n\npre[class*='language-']::-moz-selection,\npre[class*='language-'] ::-moz-selection,\ncode[class*='language-']::-moz-selection,\ncode[class*='language-'] ::-moz-selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\npre[class*='language-']::selection,\npre[class*='language-'] ::selection,\ncode[class*='language-']::selection,\ncode[class*='language-'] ::selection {\n  text-shadow: none;\n  background: #b3d4fc;\n}\n\n@media print {\n  code[class*='language-'],\n  pre[class*='language-'] {\n    text-shadow: none;\n  }\n}\n\n/* Code blocks */\npre[class*='language-'] {\n  padding: 1em;\n  margin: 0.5em 0;\n  overflow: auto;\n}\n\n:not(pre) > code[class*='language-'],\npre[class*='language-'] {\n  background: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*='language-'] {\n  padding: 0.1em;\n  border-radius: 0.3em;\n  white-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: slategray;\n}\n\n.token.punctuation {\n  color: #999;\n}\n\n.namespace {\n  opacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n  color: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n  color: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n  color: #a67f59;\n  background: hsla(0, 0%, 100%, 0.5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #07a;\n}\n\n.token.function {\n  color: #dd4a68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n  color: #e90;\n}\n\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n.token.italic {\n  font-style: italic;\n}\n\n.token.entity {\n  cursor: help;\n}\n"
  },
  {
    "path": "src/components/rich-text-editor/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport compose from 'recompose/compose';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { Transition, zIndex } from 'src/components/globals';\nimport { UserHoverProfile } from 'src/components/hoverProfile';\nimport type { Node } from 'react';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst UsernameWrapper = styled.span`\n  color: ${props =>\n    props.me\n      ? props.theme.special.default\n      : props.theme.space.default}!important;\n  background: ${props =>\n    props.me ? props.theme.special.wash : props.theme.space.wash}!important;\n  padding: 0px 4px 1px;\n  border-radius: 4px;\n  position: relative;\n  display: inline-block;\n  line-height: 1.4;\n  &:hover {\n    text-decoration: underline;\n  }\n  a {\n    color: inherit !important;\n    text-decoration: none !important;\n  }\n`;\n\ntype MentionProps = {\n  children: Node,\n  username: string,\n  currentUser: ?Object,\n};\n\nclass MentionWithCurrentUser extends React.Component<MentionProps> {\n  render() {\n    const { username, currentUser, children } = this.props;\n    const me = currentUser && currentUser.username === username;\n    return (\n      <UsernameWrapper me={me}>\n        <UserHoverProfile username={username}>\n          <Link to={`/users/${username}`} onClick={e => e.stopPropagation()}>\n            {children}\n          </Link>\n        </UserHoverProfile>\n      </UsernameWrapper>\n    );\n  }\n}\n\nexport const Mention = compose(\n  withCurrentUser,\n  connect()\n)(MentionWithCurrentUser);\n\nexport const customStyleFn = (style: Object, block: Object) => {\n  if (style.first() === 'CODE' && block.getType() === 'unstyled')\n    return {\n      border: `1px solid ${theme.bg.border}`,\n      borderRadius: '4px',\n      backgroundColor: theme.bg.wash,\n      padding: '1px 4px',\n      fontFamily: 'monospace',\n      color: theme.warn.alt,\n    };\n  return style;\n};\n\nexport const customStyleMap = {\n  blockquote: {\n    lineHeight: '1.5',\n    borderLeft: `4px solid ${theme.bg.border}`,\n    color: `${theme.text.alt}`,\n    padding: '4px 12px 4px 16px',\n  },\n};\n\nexport const Wrapper = styled.div`\n  position: relative;\n  width: 100%;\n  cursor: text;\n\n  .DraftEditor-root {\n    margin-top: 0;\n  }\n`;\n\nexport const MediaRow = styled.div`\n  display: flex;\n  background: ${theme.bg.wash};\n  border-top: 2px solid ${theme.bg.border};\n  padding: 8px 16px;\n  margin-left: -24px;\n  margin-bottom: -24px;\n  margin-top: 16px;\n  width: calc(100% + 48px);\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    position: absolute;\n    top: calc(100% - 90px);\n  }\n`;\n\nexport const ComposerBase = styled.div`\n  position: relative;\n  flex: 1;\n  max-height: ${props => (props.isOpen ? 'calc(100vh - 160px)' : 'auto')};\n  overflow-y: ${props => (props.isOpen ? 'scroll' : 'auto')};\n  padding-left: ${props => (props.isOpen ? '25px' : '0')};\n\n  > label {\n    position: absolute;\n    right: calc(100% + 8px);\n    top: auto;\n    bottom: -11px;\n    padding: 0;\n    margin: 0;\n    color: ${theme.text.placeholder};\n  }\n`;\n\nexport const SideToolbarWrapper = styled.div`\n  position: fixed;\n  margin-top: -8px;\n  z-index: ${zIndex.composerToolbar};\n`;\n\nexport const Action = styled.div`\n  display: ${props => (props.embedding ? 'flex' : 'none')};\n  flex: 0 0 40px;\n  flex-direction: column;\n  height: 40px;\n  max-height: 40px;\n  justify-content: center;\n  align-items: flex-start;\n  position: relative;\n\n  label > div,\n  label > button > div {\n    color: ${theme.text.reverse};\n  }\n`;\n\nexport const Expander = styled.div`\n  display: inline-block;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: flex-start;\n  padding: 4px;\n  border-radius: 12px;\n  margin-left: 5px;\n\n  > button > div {\n    color: ${theme.text.placeholder};\n    background-color: white;\n    border-radius: 12px;\n  }\n\n  > button:hover > div {\n    color: ${theme.brand.alt};\n  }\n\n  ${props =>\n    props.inserting &&\n    css`\n      background-color: ${theme.brand.alt};\n      transition: ${Transition.hover.on};\n\n      > button > div {\n        color: ${theme.brand.wash};\n        background-color: transparent;\n      }\n\n      > button:hover > div {\n        color: ${theme.brand.wash};\n      }\n\n      ${Action} {\n        display: flex;\n      }\n    `};\n`;\n\nexport const EmbedUI = styled.form`\n  display: flex;\n  flex-direction: row;\n  background-color: ${theme.brand.alt};\n  border-radius: 12px;\n\n  label {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    align-items: center;\n    padding: 0;\n  }\n\n  input,\n  button {\n    display: none;\n  }\n\n  ${props =>\n    props.embedding &&\n    css`\n      position: relative;\n      z-index: ${zIndex.chrome};\n      left: -4px;\n\n      label {\n        padding: 4px;\n\n        > div:after,\n        > div:before {\n          display: none;\n        }\n      }\n\n      input {\n        display: inline-block;\n        height: 28px;\n        padding: 0 8px;\n        border-radius: 8px;\n        line-height: 1;\n        font-size: 14px;\n        margin-left: 4px;\n        margin-right: 8px;\n        width: 240px;\n      }\n\n      button {\n        display: inline-block;\n        background-color: transparent;\n        color: ${theme.text.reverse};\n        margin-right: 16px;\n        font-size: 14px;\n        line-height: 1;\n        font-weight: 700;\n        cursor: pointer;\n        transition: ${Transition.hover.off};\n\n        &:hover {\n          background-color: ${theme.brand.dark};\n          border-radius: 8px;\n          transition: ${Transition.hover.on};\n        }\n      }\n    `};\n`;\n\nexport const EmbedContainer = styled.div`\n  position: relative;\n  width: 100%;\n  margin-bottom: 32px;\n  display: flex;\n  justify-content: center;\n`;\n\nexport const AspectRatio = styled(EmbedContainer)`\n  padding-bottom: ${props => (props.ratio ? props.ratio : '0')};\n`;\n\nexport const EmbedComponent = styled.iframe`\n  position: absolute;\n  height: 100%;\n  width: 100%;\n`;\n"
  },
  {
    "path": "src/components/scrollManager/index.js",
    "content": "import * as React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport debounceFn from 'debounce';\n\ntype Props = {\n  scrollCaptureDebounce: number,\n  scrollSyncDebounce: number,\n  scrollSyncAttemptLimit: number,\n  children: React$Node,\n  history: Object,\n  location: Object,\n  onLocationChange: Function,\n};\n\nclass ScrollManager extends React.Component<Props> {\n  static defaultProps = {\n    scrollCaptureDebounce: 50,\n    scrollSyncDebounce: 100,\n    scrollSyncAttemptLimit: 5,\n  };\n\n  constructor(props) {\n    super(props);\n\n    this.scrollSyncData = {\n      x: 0,\n      y: 0,\n      attemptsRemaining: props.scrollSyncAttemptLimit,\n    };\n\n    const scrollCapture = () => {\n      requestAnimationFrame(() => {\n        const { pageXOffset, pageYOffset } = window;\n        const { pathname } = this.props.location;\n\n        // use browser history instead of router history\n        // to avoid infinite history.replace loop\n        const historyState = window.history.state || {};\n        const { state = {} } = historyState;\n        if (\n          !state.scroll ||\n          state.scroll.x !== pageXOffset ||\n          state.scroll.y !== pageYOffset\n        ) {\n          window.history.replaceState(\n            {\n              ...historyState,\n              state: { ...state, scroll: { x: pageXOffset, y: pageYOffset } },\n            },\n            null,\n            pathname\n          );\n        }\n      });\n    };\n\n    const _scrollSync = () => {\n      requestAnimationFrame(() => {\n        const { x, y, attemptsRemaining } = this.scrollSyncData;\n\n        if (attemptsRemaining < 1) {\n          return;\n        }\n\n        const { pageXOffset, pageYOffset } = window;\n        if (\n          y < window.document.body.scrollHeight &&\n          (x !== pageXOffset || y !== pageYOffset)\n        ) {\n          window.scrollTo(x, y);\n          this.scrollSyncData.attemptsRemaining = attemptsRemaining - 1;\n          _scrollSync();\n        }\n      });\n    };\n\n    const scrollSync = (x = 0, y = 0) => {\n      this.scrollSyncData = {\n        x,\n        y,\n        attemptsRemaining: this.props.scrollSyncAttemptLimit,\n      };\n      _scrollSync();\n    };\n\n    this.debouncedScroll = debounceFn(\n      scrollCapture,\n      props.scrollCaptureDebounce\n    );\n    this.debouncedScrollSync = debounceFn(scrollSync, props.scrollSyncDebounce);\n  }\n\n  componentWillMount() {\n    const { location, onLocationChange } = this.props;\n    if (onLocationChange) {\n      onLocationChange(location);\n    }\n  }\n\n  componentDidMount() {\n    this.onPop(this.props);\n    window.addEventListener('scroll', this.debouncedScroll, { passive: true });\n  }\n\n  componentWillUnmount() {\n    this.scrollSyncPending = false;\n    window.removeEventListener('scroll', this.debouncedScroll, {\n      passive: true,\n    });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    switch (nextProps.history.action) {\n      case 'PUSH':\n      case 'REPLACE':\n        this.onPush();\n        break;\n      case 'POP':\n        this.onPop(nextProps);\n        break;\n      default:\n        console.warn(\n          `Unrecognized location change action! \"${nextProps.history.action}\"`\n        );\n    }\n    if (nextProps.onLocationChange) {\n      nextProps.onLocationChange(nextProps.location);\n    }\n  }\n\n  onPush() {\n    this.debouncedScrollSync(0, 0);\n  }\n\n  onPop({ location: { state = {} } }) {\n    // attempt location restore\n    const { x = 0, y = 0 } = state.scroll || {};\n    this.debouncedScrollSync(x, y);\n  }\n\n  render() {\n    return this.props.children;\n  }\n}\n\nexport default withRouter(ScrollManager);\n"
  },
  {
    "path": "src/components/scrollRow/index.js",
    "content": "import React, { Component } from 'react';\nimport { ScrollableFlexRow } from './style';\n\nclass ScrollRow extends Component {\n  state = {\n    scrollPos: null,\n  };\n\n  componentDidMount = () => {\n    const node = this.hscroll;\n    node.scrollLeft = this.state.scrollPos;\n\n    let x, left, down;\n    node.addEventListener('mousemove', e => {\n      if (down) {\n        let newX = e.pageX;\n        node.scrollLeft = left - newX + x;\n      }\n    });\n\n    node.addEventListener('mousedown', e => {\n      e.preventDefault();\n\n      down = true;\n      x = e.pageX;\n      left = node.scrollLeft;\n    });\n\n    node.addEventListener('mouseup', e => {\n      down = false;\n\n      if (e.target.id) {\n        this.setState({\n          scrollPos: left - e.pageX + x,\n        });\n      }\n    });\n\n    node.addEventListener('mouseleave', e => {\n      down = false;\n    });\n  };\n\n  render() {\n    return (\n      <ScrollableFlexRow\n        className={this.props.className}\n        ref={comp => (this.hscroll = comp)}\n      >\n        {this.props.children}\n      </ScrollableFlexRow>\n    );\n  }\n}\n\nexport default ScrollRow;\n"
  },
  {
    "path": "src/components/scrollRow/style.js",
    "content": "import styled from 'styled-components';\nimport { FlexRow } from '../globals';\n\nexport const ScrollableFlexRow = styled(FlexRow)`\n  overflow-x: scroll;\n  flex-wrap: nowrap;\n  background: transparent;\n  cursor: pointer;\n  cursor: hand;\n  cursor: grab;\n\n  &:active {\n    cursor: grabbing;\n  }\n`;\n"
  },
  {
    "path": "src/components/segmentedControl/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { StyledSegmentedControl, StyledSegment } from './style';\nimport { Link } from 'react-router-dom';\n\ntype ControlProps = {\n  sticky?: boolean,\n  stickyOffset?: number,\n  mobileSticky?: boolean,\n  mobileStickyOffset?: number,\n};\n\nexport const SegmentedControl = (props: ControlProps) => {\n  const {\n    sticky = true,\n    stickyOffset = 0,\n    mobileSticky = true,\n    mobileStickyOffset = 0,\n    ...rest\n  } = props;\n  return (\n    <StyledSegmentedControl\n      sticky={sticky}\n      mobileSticky={mobileSticky}\n      stickyOffset={stickyOffset}\n      mobileStickyOffset={mobileStickyOffset}\n      {...rest}\n    />\n  );\n};\n\ntype SegmentProps = {\n  isActive: boolean,\n  hideOnDesktop?: boolean,\n  to?: string,\n};\n\nexport const Segment = (props: SegmentProps) => {\n  const { isActive = false, hideOnDesktop = false, to, ...rest } = props;\n\n  const component = (\n    <StyledSegment\n      isActive={isActive}\n      hideOnDesktop={hideOnDesktop}\n      {...rest}\n    />\n  );\n\n  if (to) {\n    return <Link to={to}>{component}</Link>;\n  }\n\n  return component;\n};\n"
  },
  {
    "path": "src/components/segmentedControl/style.js",
    "content": "// @flow\nimport styled, { css } from 'styled-components';\nimport theme from 'shared/theme';\nimport { tint } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const StyledSegmentedControl = styled.div`\n  display: flex;\n  width: 100%;\n  box-shadow: inset 0 -1px ${theme.bg.border};\n  background: ${theme.bg.default};\n  overflow: hidden;\n  overflow-x: scroll;\n  position: ${props => (props.sticky ? 'sticky' : 'relative')};\n  z-index: ${props => (props.sticky ? '13' : '1')};\n\n  ${props =>\n    props.sticky &&\n    css`\n      top: ${props => (props.stickyOffset ? `${props.stickyOffset}px` : '0')};\n    `};\n\n  &::-webkit-scrollbar {\n    width: 0px;\n    height: 0px;\n    background: transparent; /* make scrollbar transparent */\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    max-width: 100vw;\n    position: ${props => (props.mobileSticky ? 'sticky' : 'relative')};\n    top: ${props =>\n      props.mobileStickyOffset ? `${props.mobileStickyOffset}px` : '0'};\n  }\n`;\n\nexport const StyledSegment = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 16px;\n  flex: 1 0 auto;\n  font-weight: 600;\n  color: ${props => (props.isActive ? theme.text.default : theme.text.alt)};\n  box-shadow: ${props =>\n    props.isActive ? `inset 0 -2px 0 ${theme.text.default}` : 'none'};\n  text-align: center;\n\n  &:hover {\n    background: ${theme.bg.wash};\n    box-shadow: ${props =>\n      props.isActive\n        ? `inset 0 -2px 0 ${theme.text.default}`\n        : `inset 0 -2px 0 ${tint(theme.bg.wash, -16)}`};\n    color: ${props =>\n      props.isActive ? theme.text.default : theme.text.secondary};\n    cursor: pointer;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    &:hover {\n      background: ${theme.bg.default};\n    }\n\n    &:active {\n      background: ${theme.bg.wash};\n    }\n  }\n\n  @media (min-width: ${MEDIA_BREAK}px) {\n    ${props =>\n      props.hideOnDesktop &&\n      css`\n        display: none;\n      `}\n  }\n`;\n"
  },
  {
    "path": "src/components/select/index.js",
    "content": "// @flow\nimport React from 'react';\nimport Icon from 'src/components/icon';\nimport { Select, Container, IconContainer } from './style';\n\ntype Props = {\n  children: React$Node,\n  onChange: (evt: SyntheticInputEvent<HTMLSelectElement>) => void,\n  defaultValue?: ?string,\n};\n\nexport default (props: Props) => (\n  <Container>\n    <Select {...props} />\n    <IconContainer>\n      <Icon glyph={'down-caret'} size={20} />\n    </IconContainer>\n  </Container>\n);\n"
  },
  {
    "path": "src/components/select/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport { theme } from 'shared/theme';\nimport { tint } from 'src/components/globals';\n\nexport const Container = styled.div`\n  position: relative;\n  display: flex;\n  align-items: center;\n`;\n\nexport const IconContainer = styled.div`\n  position: absolute;\n  z-index: 1;\n  right: 12px;\n  top: 50%;\n  transform: translateY(-50%);\n  display: flex;\n  align-items: center;\n  pointer-events: none;\n  color: ${theme.text.alt};\n`;\n\nexport const Select = styled.select`\n  padding: 8px 40px 8px 16px;\n  border: none;\n  border: 1px solid ${theme.bg.border};\n  border-radius: 32px;\n  overflow: hidden;\n  box-shadow: none;\n  background: ${theme.bg.default};\n  background-image: none;\n  -webkit-appearance: none;\n  font-weight: 600;\n  font-size: 15px;\n  color: ${theme.text.default};\n  text-align: center;\n  text-align-last: center;\n\n  option {\n    text-align: left;\n  }\n\n  &:hover {\n    cursor: pointer;\n    background: ${theme.bg.divider};\n  }\n\n  &:focus {\n    box-shadow: 0 0 0 2px ${theme.bg.default}, 0 0 0 4px ${theme.bg.border};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n\n  &:active {\n    box-shadow: 0 0 0 2px ${theme.bg.default},\n      0 0 0 4px ${tint(theme.bg.border, -24)};\n    transition: box-shadow 0.2s ease-in-out;\n  }\n`;\n"
  },
  {
    "path": "src/components/settingsViews/header.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport { StyledHeader, Heading, Subheading, HeaderText } from './style';\nimport { UserAvatar, CommunityAvatar } from '../avatar';\n\ntype Props = {\n  avatar?: {\n    profilePhoto: string,\n    community?: Object,\n    user?: Object,\n  },\n  subheading: {\n    to: string,\n    label: string,\n  },\n  heading: string,\n};\n\nclass Header extends React.Component<Props> {\n  render() {\n    const { avatar, subheading, heading } = this.props;\n    return (\n      <StyledHeader>\n        {avatar && avatar.community && (\n          <CommunityAvatar\n            community={avatar.community}\n            showHoverProfile={false}\n            size={48}\n          />\n        )}\n        {avatar && avatar.user && (\n          <UserAvatar showHoverProfile={false} user={avatar.user} size={48} />\n        )}\n        <HeaderText>\n          <Link to={subheading.to}>\n            <Subheading>{subheading.label}</Subheading>\n          </Link>\n          <Heading>{heading}</Heading>\n        </HeaderText>\n      </StyledHeader>\n    );\n  }\n}\n\nexport default Header;\n"
  },
  {
    "path": "src/components/settingsViews/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const View = styled.main`\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  align-self: stretch;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n  }\n`;\n\nexport const SectionsContainer = styled.div`\n  display: flex;\n  flex: 0 1 auto;\n  flex-wrap: wrap;\n  padding: 8px;\n  justify-content: center;\n  align-items: flex-start;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 8px 0;\n  }\n`;\n\nexport const Column = styled.div`\n  display: flex;\n  flex-direction: column;\n  padding: 8px;\n  flex: 1 0 ${props => (props.fullWidth ? '100%' : '33%')};\n  max-width: ${props => (props.fullWidth ? '1200px' : '600px')};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex: 1 0 100%;\n    padding: 0;\n    max-width: 100%;\n\n    &:first-of-type {\n      padding-top: 8px;\n    }\n  }\n`;\n\nexport const SectionCard = styled.div`\n  border-radius: 4px;\n  border: 1px solid ${theme.bg.border};\n  background: ${theme.bg.default};\n  margin-bottom: 16px;\n  padding: 16px;\n  display: flex;\n  flex-direction: column;\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n  }\n`;\n\nexport const SectionCardFooter = styled.div`\n  border-top: 1px solid ${theme.bg.border};\n  width: calc(100% + 32px);\n  margin: 16px -16px 0;\n  padding: 16px 16px 0;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n`;\n\nexport const SectionSubtitle = styled.h4`\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  margin-bottom: 4px;\n\n  a {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const SectionTitle = styled.h3`\n  font-size: 18px;\n  font-weight: 700;\n  color: ${theme.text.default};\n  margin-bottom: 8px;\n  display: flex;\n  align-items: center;\n`;\n\nexport const SectionTitleWithIcon = styled(SectionTitle)`\n  .icon {\n    margin-right: 12px;\n  }\n`;\n\nexport const Heading = styled.h1`\n  margin-left: 16px;\n  font-size: 32px;\n  color: ${theme.text.default};\n  font-weight: 600;\n  line-height: 1;\n`;\n\nexport const Subheading = styled.h3`\n  margin-left: 16px;\n  font-size: 16px;\n  color: ${theme.text.alt};\n  font-weight: 400;\n  line-height: 1.3;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const StyledHeader = styled.div`\n  display: flex;\n  padding: 32px;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: ${theme.bg.default};\n  width: 100%;\n  align-items: center;\n  flex: none;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const StyledSubnav = styled.div`\n  display: flex;\n  padding: 0 32px;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: ${theme.bg.default};\n  width: 100%;\n  flex: none;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 0 16px;\n    display: block;\n    justify-content: center;\n    overflow-x: scroll;\n  }\n`;\n\nexport const SubnavList = styled.ul`\n  list-style-type: none;\n  display: flex;\n  align-items: center;\n`;\n\nexport const SubnavListItem = styled.li`\n  position: relative;\n  top: 1px;\n  border-bottom: 1px solid\n    ${props => (props.active ? props.theme.text.default : 'transparent')};\n  color: ${props =>\n    props.active ? props.theme.text.default : props.theme.text.alt};\n  font-weight: ${props => (props.active ? '500' : '400')};\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n\n  a {\n    padding: 16px;\n    display: inline-block;\n  }\n`;\n\nexport const HeaderText = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: space-around;\n`;\n\nexport const MessageIcon = styled.div`\n  color: ${theme.brand.alt};\n  cursor: pointer;\n`;\n\nexport const Dropdown = styled.div`\n  border-radius: 4px;\n  border: 1px solid ${theme.bg.border};\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n  position: absolute;\n  right: 0;\n  top: 0;\n  z-index: 1000;\n  background: ${theme.bg.default};\n  width: 320px;\n  overflow: hidden;\n`;\n\nexport const DropdownSectionDivider = styled.div`\n  width: 100%;\n  height: 8px;\n  background: ${theme.bg.wash};\n  border-top: 1px solid ${theme.bg.border};\n  border-bottom: 1px solid ${theme.bg.border};\n`;\n\nexport const DropdownSection = styled.div`\n  padding: 12px 8px;\n  background: ${theme.bg.default};\n  display: flex;\n  flex: 1 0 auto;\n  align-items: center;\n  justify-content: flex-start;\n  border-bottom: 1px solid ${theme.bg.border};\n\n  .icon {\n    margin-right: 8px;\n  }\n\n  &:hover {\n    background: ${theme.bg.wash};\n  }\n`;\n\nexport const DropdownSectionText = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: flex-start;\n`;\n\nexport const DropdownSectionTitle = styled.p`\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.default};\n  line-height: 1.3;\n`;\n\nexport const DropdownSectionSubtitle = styled.p`\n  font-size: 13px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n  line-height: 1.2;\n`;\n\nexport const DropdownAction = styled.div`\n  display: flex;\n  flex: 0 0 48px;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n`;\n"
  },
  {
    "path": "src/components/settingsViews/subnav.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport { StyledSubnav, SubnavList, SubnavListItem } from './style';\n\ntype SubnavItem = {\n  to: string,\n  label: string,\n  activeLabel: string,\n};\ntype Props = {\n  items: Array<SubnavItem>,\n  activeTab: string,\n};\n\nclass Subnav extends React.Component<Props> {\n  render() {\n    const { activeTab, items } = this.props;\n\n    return (\n      <StyledSubnav>\n        <SubnavList>\n          {items.map((item, i) => {\n            return (\n              <SubnavListItem key={i} active={activeTab === item.activeLabel}>\n                <Link to={item.to}>{item.label}</Link>\n              </SubnavListItem>\n            );\n          })}\n        </SubnavList>\n      </StyledSubnav>\n    );\n  }\n}\n\nexport default Subnav;\n"
  },
  {
    "path": "src/components/themedSection/index.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport React from 'react';\nimport styled from 'styled-components';\nimport Goop from 'src/components/goop';\nimport {\n  ClusterOne,\n  ClusterTwo,\n  ClusterThree,\n  ClusterFour,\n  Constellations,\n  Empty,\n} from 'src/components/illustrations';\nimport { FlexCol, hexa } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Default = styled(FlexCol)`\n  display: flex;\n  position: relative;\n  flex: auto;\n  align-items: center;\n  justify-content: center;\n  background-color: ${theme.bg.default};\n  color: ${theme.text.default};\n`;\n\nexport const Primary = styled(Default)`\n  background-color: ${theme.space.dark};\n  background-image: ${({ theme }) =>\n    `radial-gradient(farthest-corner at 50% 100%,\n      ${hexa(theme.brand.alt, 0.75)}, ${theme.space.dark}\n    )`};\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Brand = styled(Default)`\n  background-color: ${theme.brand.default};\n  background-image: linear-gradient(\n    to bottom,\n    ${({ theme }) => `${theme.brand.alt}, ${theme.brand.default}`}\n  );\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Dark = styled(Default)`\n  background-color: ${theme.space.dark};\n  background-image: linear-gradient(\n    to bottom,\n    ${({ theme }) => `${theme.space.dark}, ${theme.brand.default}`}\n  );\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Space = styled(Default)`\n  background-color: ${theme.space.dark};\n  background-image: linear-gradient(\n    to bottom,\n    ${({ theme }) => `${theme.space.alt}, ${theme.space.dark}`}\n  );\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Light = styled(Default)`\n  background-color: ${theme.space.alt};\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Bright = styled(Default)`\n  background-color: ${theme.brand.default};\n  background-image: linear-gradient(\n    to bottom,\n    ${({ theme }) => `${theme.space.alt}, ${theme.brand.default}`}\n  );\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Grayscale = styled(Default)`\n  background-color: ${theme.bg.reverse};\n  background-image: linear-gradient(\n    to bottom,\n    ${({ theme }) => `${theme.text.alt}, ${theme.bg.reverse}`}\n  );\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Reverse = styled(Default)`\n  background-color: ${theme.bg.reverse};\n  background-image: none;\n  color: ${theme.text.reverse};\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Blank = styled(Default)`\n  background-image: none;\n  display: flex;\n  flex: 1 0 auto;\n`;\n\nexport const Illustrated = styled(Default)`\n  display: flex;\n  flex: 1 0 auto;\n\n  > img {\n    opacity: 0.15;\n\n    @media (max-width: ${MEDIA_BREAK}px) {\n      opacity: 0.025;\n    }\n  }\n`;\n\ntype ThemeProps = Object;\n\nconst Section = (props: ThemeProps) => {\n  switch (props.background) {\n    default:\n      return (\n        <Default>\n          <ClusterOne src=\"/img/cluster-1.svg\" role=\"presentation\" />\n          <ClusterTwo src=\"/img/cluster-2.svg\" role=\"presentation\" />\n          <ClusterThree src=\"/img/cluster-5.svg\" role=\"presentation\" />\n          <ClusterFour src=\"/img/cluster-4.svg\" role=\"presentation\" />\n          {props.children}\n          <Goop {...props} />\n        </Default>\n      );\n    case 'blank':\n      return (\n        <Default>\n          {props.children}\n          <Goop {...props} />\n        </Default>\n      );\n    case 'primary':\n      return (\n        <Primary>\n          {props.children}\n          <Goop {...props} />\n        </Primary>\n      );\n    case 'brand':\n      return (\n        <Brand>\n          {props.children}\n          <Goop {...props} />\n        </Brand>\n      );\n    case 'constellations':\n      return (\n        <Primary>\n          {props.children}\n          <Constellations />\n          <Goop {...props} />\n        </Primary>\n      );\n    case 'dark':\n      return (\n        <Dark>\n          {props.children}\n          <Goop {...props} />\n        </Dark>\n      );\n    case 'space':\n      return (\n        <Space>\n          {props.children}\n          <Goop {...props} />\n        </Space>\n      );\n    case 'bright':\n      return (\n        <Bright>\n          {props.children}\n          <Goop {...props} />\n        </Bright>\n      );\n    case 'light':\n      return (\n        <Light>\n          {props.children}\n          <Goop {...props} />\n        </Light>\n      );\n    case 'grayscale':\n      return (\n        <Grayscale>\n          {props.children}\n          <Goop {...props} />\n        </Grayscale>\n      );\n    case 'illustrated':\n      return (\n        <Illustrated>\n          <Empty />\n          {props.children}\n          <Goop {...props} />\n        </Illustrated>\n      );\n    case 'reverse':\n      return (\n        <Reverse>\n          {props.children}\n          <Goop {...props} />\n        </Reverse>\n      );\n  }\n};\n\nexport default Section;\n"
  },
  {
    "path": "src/components/threadFeed/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport InfiniteList from 'src/components/infiniteScroll';\nimport { deduplicateChildren } from 'src/components/infiniteScroll/deduplicateChildren';\nimport { connect } from 'react-redux';\nimport InboxThread from 'src/components/inboxThread';\nimport { LoadingInboxThread } from 'src/components/loading';\nimport ViewError from 'src/components/viewError';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport type { Dispatch } from 'redux';\nimport { ErrorBoundary } from 'src/components/error';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { useConnectionRestored } from 'src/hooks/useConnectionRestored';\nimport type { WebsocketConnectionType } from 'src/reducers/connectionStatus';\nimport { Container } from './style';\nimport NullState from './nullState';\n\ntype Props = {\n  data: {\n    fetchMore: Function,\n    networkStatus: number,\n    hasNextPage: boolean,\n    error: ?Object,\n    community?: any,\n    channel?: any,\n    threads?: Array<any>,\n    refetch: Function,\n  },\n  community: GetCommunityType,\n  hasThreads: Function,\n  hasNoThreads: Function,\n  currentUser: ?Object,\n  viewContext?:\n    | ?'communityInbox'\n    | 'communityProfile'\n    | 'channelInbox'\n    | 'channelProfile'\n    | 'userProfile',\n  slug: string,\n  pinnedThreadId: ?string,\n  dispatch: Dispatch<Object>,\n  networkOnline: boolean,\n  websocketConnection: WebsocketConnectionType,\n};\n\nclass ThreadFeedPure extends React.Component<Props> {\n  shouldComponentUpdate(nextProps: Props) {\n    const curr = this.props;\n    if (curr.networkOnline !== nextProps.networkOnline) return true;\n    if (curr.websocketConnection !== nextProps.websocketConnection) return true;\n    // fetching more\n    if (curr.data.networkStatus === 7 && nextProps.data.networkStatus === 3)\n      return false;\n    return true;\n  }\n\n  componentDidUpdate(prev: Props) {\n    const curr = this.props;\n\n    const didReconnect = useConnectionRestored({ curr, prev });\n    if (didReconnect && curr.data.refetch) {\n      curr.data.refetch();\n    }\n\n    if (\n      !prev.data.thread &&\n      curr.data.threads &&\n      curr.data.threads.length === 0\n    ) {\n      if (curr.hasThreads) {\n        curr.hasThreads();\n      }\n\n      if (curr.hasNoThreads) {\n        curr.hasNoThreads();\n      }\n    }\n  }\n\n  render() {\n    const {\n      data: { threads, networkStatus, error },\n      viewContext,\n    } = this.props;\n\n    const threadNodes =\n      threads && threads.length > 0\n        ? threads\n            .slice()\n            .map(thread => thread.node)\n            .filter(\n              thread =>\n                !thread.channel.channelPermissions.isBlocked &&\n                !thread.community.communityPermissions.isBlocked\n            )\n        : [];\n\n    let filteredThreads = threadNodes;\n    if (\n      this.props.data.community &&\n      this.props.data.community.watercooler &&\n      this.props.data.community.watercooler.id\n    ) {\n      filteredThreads = filteredThreads.filter(\n        // $FlowIssue\n        t => t.id !== this.props.data.community.watercooler.id\n      );\n    }\n    if (\n      this.props.data.community &&\n      this.props.data.community.pinnedThread &&\n      this.props.data.community.pinnedThread.id\n    ) {\n      filteredThreads = filteredThreads.filter(\n        // $FlowIssue\n        t => t.id !== this.props.data.community.pinnedThread.id\n      );\n    }\n    if (\n      this.props.data.channel &&\n      this.props.data.channel.community &&\n      this.props.data.channel.community.watercoolerId\n    ) {\n      filteredThreads = filteredThreads.filter(\n        // $FlowIssue\n        t => t.id !== this.props.data.channel.community.watercoolerId\n      );\n    }\n\n    const uniqueThreads = deduplicateChildren(filteredThreads, 'id');\n    if (uniqueThreads && uniqueThreads.length > 0 && networkStatus === 7) {\n      return (\n        <Container data-cy=\"thread-feed\">\n          {this.props.data.community &&\n            this.props.data.community.pinnedThread &&\n            this.props.data.community.pinnedThread.id && (\n              <ErrorBoundary>\n                <InboxThread\n                  data={this.props.data.community.pinnedThread}\n                  viewContext={viewContext}\n                  pinnedThreadId={this.props.data.community.pinnedThread.id}\n                />\n              </ErrorBoundary>\n            )}\n\n          <InfiniteList\n            loadMore={this.props.data.fetchMore}\n            hasMore={this.props.data.hasNextPage}\n            loader={<LoadingInboxThread key={0} />}\n          >\n            {uniqueThreads.map(thread => {\n              return (\n                <ErrorBoundary key={thread.id}>\n                  <InboxThread data={thread} viewContext={viewContext} />\n                </ErrorBoundary>\n              );\n            })}\n          </InfiniteList>\n        </Container>\n      );\n    }\n\n    if (networkStatus === 2 || networkStatus === 1) {\n      return (\n        <Container>\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n          <LoadingInboxThread />\n        </Container>\n      );\n    }\n\n    if (networkStatus === 8 || error) {\n      return (\n        <ViewError\n          heading={'We ran into an issue loading the feed'}\n          subheading={'Try refreshing the page.'}\n          refresh\n        />\n      );\n    }\n\n    const nullComposerCommunityId = this.props.data.community\n      ? this.props.data.community.id\n      : this.props.data.channel\n      ? this.props.data.channel.community.id\n      : null;\n\n    return (\n      <NullState\n        communityId={nullComposerCommunityId}\n        channelId={this.props.data.channel && this.props.data.channel.id}\n        viewContext={viewContext}\n      />\n    );\n  }\n}\n\nconst map = state => ({\n  networkOnline: state.connectionStatus.networkOnline,\n  websocketConnection: state.connectionStatus.websocketConnection,\n});\nconst ThreadFeed = compose(\n  // $FlowIssue\n  connect(map),\n  withCurrentUser\n)(ThreadFeedPure);\n\nexport default ThreadFeed;\n"
  },
  {
    "path": "src/components/threadFeed/nullState.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Icon from 'src/components/icon';\nimport { NullColumn, NullColumnHeading, NullColumnSubheading } from './style';\n\ntype Props = {\n  viewContext:\n    | ?'communityInbox'\n    | 'communityProfile'\n    | 'channelInbox'\n    | 'channelProfile'\n    | 'userProfile',\n  communityId: ?string,\n  channelId: ?string,\n};\n\nconst NullState = ({ viewContext, communityId, channelId }: Props) => {\n  let hd;\n  let cp;\n\n  if (viewContext && viewContext === 'communityProfile') {\n    hd = 'There’s nothing in this community';\n  }\n\n  if (viewContext && viewContext === 'channelProfile') {\n    hd = 'There’s nothing in this channel';\n  }\n\n  if (viewContext && viewContext === 'userProfile') {\n    hd = 'This user hasn’t posted yet';\n  }\n\n  const headingIcon = (communityId || channelId) && (\n    <Icon glyph={'post'} size={44} />\n  );\n\n  return (\n    <NullColumn>\n      <span>\n        {headingIcon && headingIcon}\n        {hd && <NullColumnHeading>{hd}</NullColumnHeading>}\n        {cp && <NullColumnSubheading>{cp}</NullColumnSubheading>}\n      </span>\n    </NullColumn>\n  );\n};\n\nexport default NullState;\n"
  },
  {
    "path": "src/components/threadFeed/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { hexa } from 'src/components/globals';\nimport { OutlineButton } from 'src/components/button';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Container = styled.div`\n  display: flex;\n  flex: none;\n  flex-direction: column;\n  align-self: stretch;\n  align-items: stretch;\n  position: relative;\n\n  > div {\n    display: flex;\n    flex: none;\n    flex-direction: column;\n    align-self: stretch;\n    align-items: stretch;\n  }\n`;\n\nexport const FetchMoreButton = styled(OutlineButton)`\n  width: 100%;\n  padding: 16px 0;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 32px 0;\n    border-radius: 0;\n    background: #fff;\n    font-size: 16px;\n    font-weight: 600;\n    color: ${theme.brand.default};\n    border: none;\n    box-shadow: none;\n    border-top: 2px solid ${theme.bg.border};\n\n    &:hover {\n      background: ${theme.bg.wash};\n      border-radius: 0;\n      box-shadow: none;\n    }\n  }\n`;\n\nexport const Divider = styled.div`\n  border-bottom: 2px solid ${theme.bg.border};\n  width: 100%;\n  display: block;\n  padding-top: 24px;\n  margin-bottom: 24px;\n`;\n\nexport const NullColumn = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  align-self: stretch;\n  text-align: center;\n  flex-direction: column;\n  padding: 24px;\n  background: ${theme.bg.default};\n  flex: 1;\n\n  button {\n    flex: 1;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-bottom: 1px solid ${theme.bg.border};\n  }\n`;\n\nexport const NullColumnHeading = styled.h3`\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.3;\n  margin-bottom: 8px;\n  color: ${theme.text.default};\n  max-width: 540px;\n`;\nexport const NullColumnSubheading = styled.p`\n  margin-top: 8px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n  margin-bottom: 24px;\n  max-width: 360px;\n`;\n\nexport const LoadingPill = styled.span`\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%)\n    translateY(${props => (props.isVisible ? '12px' : '0px')});\n  transition: transform 0.2s ease-in-out, opacity 0.2s ease-in-out;\n  padding: 2px 44px;\n  min-height: 24px;\n  border-radius: 48px;\n  background: ${theme.brand.alt};\n  border: 1px solid ${theme.brand.default};\n  opacity: ${props => (props.isVisible ? '1' : '0')};\n  pointer-events: none;\n  z-index: 11;\n  box-shadow: 0 2px 4px rgba(${hexa(theme.brand.alt, 0.12)});\n`;\n"
  },
  {
    "path": "src/components/threadFeedCard/style.js",
    "content": "import styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Link } from 'react-router-dom';\nimport { FlexCol, FlexRow, Transition, Gradient, zIndex } from '../globals';\n\nexport const StyledThreadFeedCard = styled.div`\n  padding: 16px;\n  transition: ${Transition.hover.off};\n\n  &:hover {\n    background-color: ${theme.bg.wash};\n  }\n  \n  &:first-of-type {\n    border-top: 2px: ${theme.bg.default};\n  }\n`;\n\nexport const CardLink = styled(Link)`\n  position: absolute;\n  display: inline-block;\n  height: 100%;\n  width: 100%;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: ${zIndex.card};\n`;\n\nexport const CardContent = styled(FlexCol)`\n  align-self: flex-start;\n  position: relative;\n  z-index: ${zIndex.card + 1};\n  align-items: flex-start;\n  pointer-events: none;\n  width: 100%;\n`;\n\nexport const Title = styled.h2`\n  font-weight: 800;\n  font-size: 20px;\n  line-height: 1.2;\n  flex: 0 0 auto;\n  color: ${theme.text.default};\n  pointer-events: all;\n`;\n\nexport const MessageCount = styled(FlexRow)`\n  align-self: flex-end;\n  align-items: center;\n  justify-content: flex-start;\n\n  font-size: 12px;\n  font-weight: 700;\n  line-height: 1;\n  vertical-align: middle;\n  color: ${theme.text.alt};\n\n  div {\n    margin-right: 4px;\n  }\n`;\n\nexport const AuthorName = styled.span`\n  font-weight: 500;\n  font-size: 13px;\n  color: ${theme.text.alt};\n  line-height: 1;\n`;\n\nexport const ThreadContext = styled(FlexRow)`\n  align-items: center;\n  margin-bottom: 8px;\n`;\n\nexport const ThreadContextAvatar = styled(FlexRow)`\n  margin-right: 8px;\n  align-items: center;\n`;\n\nexport const ThreadContextMeta = styled(FlexCol)`\n  justify-content: space-between;\n  align-items: flex-start;\n`;\n\nexport const Meta = styled.span`\n  font-size: 12px;\n  font-weight: 700;\n  line-height: 1;\n  vertical-align: middle;\n  color: ${theme.text.alt};\n  display: flex;\n  align-items: center;\n  margin-bottom: 4px;\n\n  div {\n    margin-right: 4px;\n  }\n`;\n\nexport const MetaNew = styled(Meta)`\n  color: ${theme.success.default};\n  align-self: flex-end;\n`;\n\nexport const Location = styled.span`\n  display: inline-block;\n  flex: 0 0 auto;\n  font-size: 13px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  line-height: 1;\n  margin-bottom: 2px;\n\n  > a {\n    pointer-events: all;\n  }\n\n  > a:hover {\n    color: ${theme.brand.alt};\n    text-decoration: underline;\n  }\n`;\n\nexport const Lock = styled.span`\n  position: relative;\n  color: ${theme.text.alt};\n  top: 1px;\n`;\n\nexport const Pinned = styled.span`\n  position: absolute;\n  top: -16px;\n  right: -16px;\n  width: 64px;\n  height: 64px;\n  overflow: hidden;\n`;\n\nexport const PinnedBanner = styled.span`\n  position: absolute;\n  width: 72px;\n  height: 72px;\n  background-color: ${theme.special.default};\n  background-image: ${props =>\n    Gradient(props.theme.special.alt, props.theme.special.default)};\n  transform: rotate(45deg);\n  top: -36px;\n  right: -36px;\n`;\n\nexport const PinnedIconWrapper = styled.span`\n  position: relative;\n  right: -36px;\n  top: 4px;\n  color: ${theme.text.reverse};\n`;\n\nexport const ParticipantHeads = styled(FlexRow)`\n  align-items: center;\n\n  > *:not(:first-child) {\n    margin-left: 4px;\n    pointer-events: auto;\n  }\n`;\n\nexport const ParticipantCount = styled.span`\n  display: inline-block;\n  border-radius: 100%;\n  height: 32px;\n  width: 32px;\n  color: ${theme.text.reverse};\n  background-color: ${theme.text.alt};\n  font-size: 11px;\n  font-weight: 700;\n  line-height: 32px;\n  text-align: center;\n  vertical-align: middle;\n  text-overflow: clip;\n`;\n\nexport const Author = styled.div`\n  padding: 2px;\n  border-radius: 100%;\n  border: 2px solid ${theme.brand.alt};\n  pointer-events: all;\n  display: flex;\n  flex: none;\n  justify-content: center;\n  align-items: center;\n\n  > div:after,\n  > a > div:after {\n    right: -3px;\n    bottom: -2px;\n  }\n`;\n\nexport const ContentInfo = styled(FlexRow)`\n  margin-top: 8px;\n  justify-content: space-between;\n  flex: none;\n  align-self: stretch;\n  align-items: center;\n`;\n"
  },
  {
    "path": "src/components/threadRenderer/index.js",
    "content": "// @flow\n// Renders a thread body to React elements\nimport React from 'react';\nimport redraft from 'redraft';\nimport threadRenderer from 'shared/clients/draft-js/thread/renderer';\nimport type { RawDraftContentState } from 'draft-js';\n\ntype Props = {\n  body: RawDraftContentState,\n};\n\nexport default (props: Props) => (\n  <div className=\"markdown\">{redraft(props.body, threadRenderer)}</div>\n);\n"
  },
  {
    "path": "src/components/titlebar/actions.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { OutlineButton } from 'src/components/button';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype UserProps = {\n  user: UserInfoType,\n  currentUser: ?UserInfoType,\n};\n\nconst User = (props: UserProps) => {\n  const { user, currentUser } = props;\n\n  if (currentUser && currentUser.id === user.id) {\n    return (\n      <OutlineButton\n        size={'small'}\n        to={`/users/${currentUser.username}/settings`}\n      >\n        Settings\n      </OutlineButton>\n    );\n  }\n\n  return null;\n};\n\nexport const MobileUserAction = compose(withCurrentUser)(User);\n"
  },
  {
    "path": "src/components/titlebar/base.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter, type History } from 'react-router-dom';\nimport { ErrorBoundary } from 'src/components/error';\nimport { NavigationContext } from 'src/helpers/navigation-context';\nimport Icon from 'src/components/icon';\nimport {\n  TitlebarContainer,\n  Content,\n  Actions,\n  Title,\n  LeftActionContainer,\n} from './style';\n\ntype Props = {\n  title?: string,\n  history: History,\n  titleIcon?: any,\n  rightAction?: any,\n  leftAction: 'view-back' | 'menu',\n};\n\nconst MobileTitlebar = (props: Props) => {\n  const { title, titleIcon, rightAction, leftAction, history, ...rest } = props;\n\n  const handleMenuClick = setNavOpen => () => {\n    if (leftAction === 'menu') {\n      return setNavOpen(true);\n    }\n\n    if (history.length >= 3) {\n      return history.goBack();\n    }\n\n    // if there is not history, redirect back to the home view of the app\n    // and let the redirect handler push the user to their last-viewed community\n    return history.push('/');\n  };\n\n  const leftActionComponent = setNavigationIsOpen => {\n    if (typeof leftAction === 'string') {\n      return (\n        <div\n          style={{\n            position: 'relative',\n            display: 'flex',\n            alignItems: 'center',\n          }}\n        >\n          <Icon\n            onClick={handleMenuClick(setNavigationIsOpen)}\n            glyph={leftAction}\n            size={32}\n          />\n        </div>\n      );\n    }\n\n    // if the menu action is a component, just render the component being passed\n    // from the view directly\n    return leftAction;\n  };\n\n  return (\n    <NavigationContext.Consumer>\n      {({ setNavigationIsOpen }) => (\n        <TitlebarContainer {...rest} hasAction={rightAction}>\n          <Content>\n            {leftAction && (\n              <LeftActionContainer>\n                {leftActionComponent(setNavigationIsOpen)}\n              </LeftActionContainer>\n            )}\n\n            <div style={{ width: '12px' }} />\n\n            {titleIcon && (\n              <React.Fragment>\n                {titleIcon}\n                <div style={{ width: '12px' }} />\n              </React.Fragment>\n            )}\n\n            {title && <Title>{title}</Title>}\n          </Content>\n\n          {rightAction && (\n            <ErrorBoundary>\n              <Actions>{rightAction}</Actions>\n            </ErrorBoundary>\n          )}\n        </TitlebarContainer>\n      )}\n    </NavigationContext.Consumer>\n  );\n};\n\nexport default compose(\n  withRouter,\n  connect()\n)(MobileTitlebar);\n"
  },
  {
    "path": "src/components/titlebar/index.js",
    "content": "// @flow\nimport React from 'react';\nimport theme from 'shared/theme';\nimport BaseTitlebar from './base';\n\ntype Props = {\n  title: string,\n  leftAction?: 'menu' | 'view-back' | React$Element<any>,\n  titleIcon?: any,\n  rightAction?: any,\n};\n\nexport const MobileTitlebar = (props: Props) => (\n  <BaseTitlebar\n    style={{ borderBottom: `1px solid ${theme.bg.border}` }}\n    {...props}\n  />\n);\n\nexport const DesktopTitlebar = (props: Props) => (\n  <BaseTitlebar\n    desktop\n    style={{\n      borderBottom: `1px solid ${theme.bg.border}`,\n      position: 'sticky',\n      top: '0',\n      zIndex: 9000,\n      height: '62px',\n      maxHeight: '62px',\n    }}\n    {...props}\n  />\n);\n"
  },
  {
    "path": "src/components/titlebar/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { Truncate } from 'src/components/globals';\nimport { MEDIA_BREAK, TITLEBAR_HEIGHT } from 'src/components/layout';\n\nexport const TitlebarContainer = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: ${props =>\n    props.hasAction ? 'space-between' : 'flex-start'};\n  width: 100%;\n  background: ${theme.bg.default};\n  z-index: 9996; /* on top of everything except navigation */\n  padding-right: 16px;\n  padding-left: 8px;\n  flex: none;\n  height: ${TITLEBAR_HEIGHT}px;\n  max-height: ${TITLEBAR_HEIGHT}px;\n  grid-area: titlebar;\n\n  @media (min-width: ${MEDIA_BREAK}px) {\n    display: ${props => (props.desktop ? 'flex' : 'none')};\n  }\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: ${props => (props.desktop ? 'none' : 'flex')};\n  }\n`;\n\nexport const Content = styled.div`\n  display: flex;\n  align-items: center;\n  width: 100%;\n  max-width: 100%;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    max-width: 70%;\n  }\n`;\n\nexport const Title = styled.h1`\n  font-size: 20px;\n  font-weight: 700;\n  color: ${theme.text.default};\n  display: block;\n  max-width: calc(100% - 96px);\n  ${Truncate};\n`;\n\nexport const Actions = styled.div`\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n\n  a {\n    display: flex;\n    align-items: center;\n  }\n\n  .icon {\n    margin-right: 0;\n  }\n`;\n\nexport const LeftActionContainer = styled.span`\n  display: flex;\n  align-items: center;\n  cursor: pointer;\n`;\n"
  },
  {
    "path": "src/components/toasts/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport {\n  ToastsContainer,\n  ErrorToast,\n  SuccessToast,\n  NeutralToast,\n  NotificationToast,\n} from './style';\n\nconst ToastsPure = ({ toasts }): ?React$Element<any> => {\n  if (!toasts || toasts.length === 0) {\n    return null;\n  }\n\n  return (\n    <ToastsContainer>\n      {toasts.map(toast => {\n        const { kind, timeout, message, id } = toast;\n        switch (kind) {\n          case 'error': {\n            let cleanedMessage = message;\n            if (message.indexOf('GraphQL error: ') >= 0) {\n              cleanedMessage = message.replace('GraphQL error: ', '');\n            }\n            return (\n              <ErrorToast data-cy={'toast-error'} key={id} timeout={timeout}>\n                {cleanedMessage}\n              </ErrorToast>\n            );\n          }\n          case 'success': {\n            return (\n              <SuccessToast\n                data-cy={`toast-success`}\n                key={id}\n                timeout={timeout}\n              >\n                {message}\n              </SuccessToast>\n            );\n          }\n          case 'neutral': {\n            return (\n              <NeutralToast\n                data-cy={`toast-neutral`}\n                key={id}\n                timeout={timeout}\n              >\n                {message}\n              </NeutralToast>\n            );\n          }\n          case 'notification': {\n            return (\n              <NotificationToast key={id} timeout={timeout}>\n                {message}\n              </NotificationToast>\n            );\n          }\n          default: {\n            return null;\n          }\n        }\n      })}\n    </ToastsContainer>\n  );\n};\n\nconst mapStateToProps = (state): Object => ({\n  toasts: state.toasts.toasts,\n});\nexport default connect(mapStateToProps)(ToastsPure);\n"
  },
  {
    "path": "src/components/toasts/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { keyframes } from 'styled-components';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ToastsContainer = styled.div`\n  position: fixed;\n  top: 0;\n  right: 0;\n  padding: 16px;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  max-width: 256px;\n  background: transparent;\n  pointer-events: none;\n  z-index: 9997;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    /* titlebars are ~56px */\n    top: 60px;\n    left: 0;\n    right: 0;\n    max-width: 100%;\n  }\n`;\n\nconst toastFade = keyframes`\n  0% {\n    opacity: 0;\n    transform: translateY(8px);\n  }\n  5% {\n    opacity: 1;\n    transform: translateY(0px);\n  }\n  95% {\n    opacity: 1;\n    transform: translateY(0px);\n  }\n  100% {\n    opacity: 0;\n    transform: translateY(-4px);\n  }\n`;\n\n// TODO: refine toast styling\n\nconst Toast = styled.div`\n  border-radius: 4px;\n  padding: 8px 12px;\n  color: #fff;\n  font-size: 14px;\n  font-weight: 500;\n  line-height: 1.4;\n  display: block;\n  margin-bottom: 8px;\n  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.12);\n  opacity: 0;\n  position: relative;\n  animation-duration: 3s;\n  animation-fill-mode: forwards;\n  animation-name: ${toastFade};\n  animation-timing-function: linear;\n`;\n\nexport const ErrorToast = styled(Toast)`\n  background-color: ${theme.warn.default};\n`;\n\nexport const SuccessToast = styled(Toast)`\n  background-color: ${theme.success.default};\n`;\n\nexport const NeutralToast = styled(Toast)`\n  background-color: ${theme.text.alt};\n`;\n\nexport const NotificationToast = styled(Toast)`\n  background-color: ${theme.bg.default};\n  color: ${theme.text.secondary};\n`;\n"
  },
  {
    "path": "src/components/tooltip/index.js",
    "content": "// @flow\nimport React from 'react';\nimport Tippy from '@tippy.js/react';\n\ntype Props = {\n  content: string,\n  style?: Object,\n};\n\nconst Tip = (props: Props) => {\n  const { style = {}, content, ...rest } = props;\n\n  return (\n    <Tippy\n      placement=\"top\"\n      touch={false}\n      arrow={true}\n      arrowType={'round'}\n      content={\n        <span style={{ fontSize: '14px', fontWeight: '600', ...style }}>\n          {content}\n        </span>\n      }\n      // https://github.com/FezVrasta/popper.js/issues/535\n      popperOptions={{\n        modifiers: {\n          preventOverflow: {\n            boundariesElement: 'window',\n          },\n        },\n      }}\n      {...rest}\n    />\n  );\n};\n\nexport default Tip;\n"
  },
  {
    "path": "src/components/upsell/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Link } from 'react-router-dom';\nimport Icon from 'src/components/icon';\nimport { Button, OutlineButton } from 'src/components/button';\nimport {\n  Title,\n  MiniTitle,\n  Subtitle,\n  MiniSubtitle,\n  Actions,\n  NullCol,\n  LargeEmoji,\n  HeadingIconWrapper,\n} from './style';\n\ntype NullCardProps = {\n  noShadow?: boolean,\n  noPadding?: boolean,\n  bg?: ?string,\n  heading?: string,\n  copy?: string,\n  children?: React$Node,\n  repeat?: boolean,\n  emoji?: string,\n};\nexport const NullCard = (props: NullCardProps) => {\n  return (\n    <NullCol bg={props.bg} repeat={props.repeat} noPadding={props.noPadding}>\n      {props.headingIcon && (\n        <HeadingIconWrapper>{props.headingIcon}</HeadingIconWrapper>\n      )}\n      {props.heading && <Title>{props.heading}</Title>}\n      {props.copy && <Subtitle>{props.copy}</Subtitle>}\n      {props.children}\n    </NullCol>\n  );\n};\n\nexport const MiniNullCard = (props: NullCardProps) => {\n  return (\n    <NullCol bg={props.bg} repeat={props.repeat} noPadding={props.noPadding}>\n      {props.emoji && (\n        <LargeEmoji>\n          <span role=\"img\" aria-label=\"Howdy!\">\n            {props.emoji}\n          </span>\n        </LargeEmoji>\n      )}\n      {props.heading && <MiniTitle>{props.heading}</MiniTitle>}\n      {props.copy && <MiniSubtitle>{props.copy}</MiniSubtitle>}\n      {props.children}\n    </NullCol>\n  );\n};\n\ntype NullStateProps = {\n  bg?: ?string,\n  heading?: string,\n  copy?: string,\n  icon?: string,\n  children?: React$Node,\n};\nexport const NullState = (props: NullStateProps) => (\n  <NullCol bg={props.bg}>\n    {props.icon && <Icon glyph={props.icon} size={64} />}\n    {props.heading && <Title>{props.heading}</Title>}\n    {props.copy && <Subtitle>{props.copy}</Subtitle>}\n    {props.children}\n  </NullCol>\n);\n\nexport const Upsell404Channel = ({ community }: { community: string }) => {\n  return (\n    <Actions>\n      <Link to={`/${community}`}>\n        <Button large>Take me back</Button>\n      </Link>\n    </Actions>\n  );\n};\n\nexport const Upsell404Community = () => {\n  // if a user doesn't have permission, it means they likely tried to view\n  // the settings page for a community. In this case, we will return\n  // them to the community view.\n  // if the user does have permission, but this component gets rendered, it means\n  // something went wrong - most likely the community doesn't exists (404) so\n  // we should return the user back to homepage\n  return (\n    <Actions>\n      <Link to={'/'}>\n        <OutlineButton large>Take me back</OutlineButton>\n      </Link>\n    </Actions>\n  );\n};\n\nexport const Upsell404Thread = () => {\n  return (\n    <NullCard\n      bg=\"post\"\n      heading=\"Oops, something got lost!\"\n      copy=\"We can't find that thread. Maybe it floated off into space...\"\n    >\n      <Button onClick={() => (window.location.href = '/home')}>\n        Take me home\n      </Button>\n    </NullCard>\n  );\n};\n\nexport const UpsellReload = () => (\n  <NullCard\n    bg=\"error\"\n    heading={'Whoops!'}\n    copy={'Something went wrong on our end... Mind reloading?'}\n  >\n    <Button onClick={() => window.location.reload(true)}>Reload</Button>\n  </NullCard>\n);\n"
  },
  {
    "path": "src/components/upsell/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { MEDIA_BREAK } from 'src/components/layout';\nimport { FlexRow, FlexCol, Transition, zIndex } from 'src/components/globals';\n\nexport const Title = styled.p`\n  color: ${theme.text.default};\n  width: 100%;\n  font-weight: 600;\n  font-size: 20px;\n  line-height: 1.3;\n  margin-bottom: 8px;\n  padding: 0;\n  text-align: center;\n  letter-spacing: 0.2px;\n`;\n\nexport const CommunityUpsellTitle = styled(Title)`\n  text-align: left;\n  font-size: 20px;\n`;\n\nexport const MiniTitle = styled(Title)`\n  font-weight: 700;\n  font-size: 1rem;\n  line-height: 1.25;\n`;\n\nexport const Actions = styled.div`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  button {\n    margin: 0 8px;\n  }\n`;\n\nexport const Subtitle = styled.p`\n  width: 100%;\n  color: ${theme.text.secondary};\n  font-weight: 400;\n  font-size: 16px;\n  line-height: 1.4;\n  margin-bottom: 16px;\n  padding: 0 32px;\n  text-align: center;\n\n  b {\n    font-weight: 700;\n  }\n\n  a {\n    color: ${theme.brand.default};\n  }\n\n  li {\n    margin-top: 8px;\n    list-style-type: none;\n  }\n`;\n\nexport const CommunityUpsellSubtitle = styled(Subtitle)`\n  text-align: left;\n  padding: 0;\n  font-size: 14px;\n  color: ${theme.text.default};\n\n  li {\n    margin-top: 16px;\n  }\n`;\n\nexport const MiniSubtitle = styled(Subtitle)`\n  font-weight: 600;\n  color: ${theme.text.alt};\n  font-size: 0.875rem;\n  line-height: 1.4;\n`;\n\nexport const SmallTitle = styled(Title)`\n  font-size: 18px;\n`;\n\nexport const LargeTitle = styled(Title)`\n  font-size: 40px;\n  font-weight: 900;\n  letter-spacing: 0.3px;\n  margin-bottom: 16px;\n`;\n\nexport const SmallSubtitle = styled(Subtitle)`\n  font-size: 15px;\n`;\n\nexport const LargeSubtitle = styled(Subtitle)`\n  font-size: 20px;\n`;\n\nexport const Cost = styled(Subtitle)`\n  margin-top: 8px;\n  font-weight: bold;\n`;\n\nexport const CommunityUpsellCost = styled(Cost)`\n  text-align: left;\n  padding: 0;\n  margin-bottom: 32px;\n`;\n\nexport const NullCol = styled(FlexCol)`\n  background-color: transparent;\n  background-size: 110% auto;\n  background-repeat: ${props => (props.repeat ? 'repeat-y' : 'no-repeat')};\n  background-position: ${props =>\n    props.repeat ? 'center top' : 'center center'};\n  width: 100%;\n  height: auto;\n  min-height: ${props => (props.noPadding ? '0' : '160px')};\n  flex: 0 0 auto;\n  padding: ${props => (props.noPadding ? '0' : '2rem')};\n  justify-content: center;\n  align-items: ${props => props.alignItems || 'center'};\n  position: relative;\n  align-self: center;\n\n  > div {\n    color: ${theme.text.alt};\n    margin-bottom: 8px;\n  }\n`;\n\nexport const NullRow = styled(FlexRow)`\n  background-image: url('/img/fills/${props =>\n    props.bg ? `${props.bg}` : 'locked'}.svg');\n  background-color: transparent;\n  background-size: 110% auto;\n  background-repeat: no-repeat;\n  background-attachment: center;\n  width: 100%;\n  height: auto;\n  padding: 1rem 15%;\n`;\n\nexport const Profile = styled.div`\n  position: relative;\n  padding: 16px 0;\n\n  .badge {\n    position: absolute;\n    top: 54px;\n    left: 40px;\n  }\n`;\n\nexport const LargeEmoji = styled.div`\n  display: flex;\n  text-align: center;\n  flex 1;\n  padding: 16px 0 32px;\n  font-size: 48px;\n`;\n\nexport const UpsellIconContainer = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 16px;\n  margin-top: 32px;\n  color: ${theme.text.alt};\n`;\n\nexport const SigninLink = styled.span`\n  color: ${theme.brand.default};\n  margin-left: 6px;\n  cursor: pointer;\n`;\n\nexport const FullscreenContent = styled.div`\n  width: 100%;\n  max-width: ${MEDIA_BREAK}px;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  padding: 32px 16px;\n  flex: 1 0 auto;\n`;\n\nexport const CodeOfConduct = styled.p`\n  display: inline-block;\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  border-radius: 8px;\n  margin-top: 64px;\n  margin-left: 32px;\n  margin-right: 32px;\n  text-align: center;\n  position: relative;\n  z-index: ${zIndex.card + 1};\n\n  a {\n    color: ${theme.brand.default};\n    font-weight: 600;\n  }\n`;\n\nexport const SigninButtonsContainer = styled.div`\n  display: flex;\n  padding-top: 48px;\n  max-width: 100%;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding-top: 24px;\n  }\n`;\n\nexport const Col = styled.div`\n  display: flex;\n  align-items: flex-end;\n  flex-wrap: wrap;\n  justify-content: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n    align-items: center;\n  }\n`;\n\nexport const SigninButton = styled.a`\n  display: flex;\n  flex-shrink: 1;\n  z-index: ${zIndex.card + 1};\n  flex-direction: flex-row;\n  align-self: flex-start;\n  align-items: center;\n  color: ${theme.text.reverse};\n  border-radius: 8px;\n  padding: 8px;\n  padding-right: 16px;\n  font-size: 14px;\n  font-weight: 700;\n  transition: ${Transition.hover.off};\n  position: relative;\n  margin: 16px;\n\n  ${props =>\n    props.after &&\n    `\n      &:after {\n        content: 'Previously signed in with';\n        position: absolute;\n        top: -32px;\n        font-size: 14px;\n        font-weight: 600;\n        left: 50%;\n        transform: translateX(-50%);\n        width: 100%;\n        text-align: center;\n        color: ${props.theme.text.alt};\n      }\n    `} span {\n    display: inline-block;\n    flex: 0 0 auto;\n    margin-top: -1px;\n    margin-left: 8px;\n    line-height: 2.45;\n    word-break: keep-all;\n    white-space: nowrap;\n    color: currentColor;\n  }\n\n  svg {\n    fill: currentColor !important;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin: 16px 0;\n\n    ${props =>\n      props.after &&\n      `\n        margin: 48px 0 16px 0;\n      `};\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nexport const ButtonTwitter = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.twitter.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.twitter.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:after {\n    color: ${theme.social.twitter.default};\n  }\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.twitter.default : '#fff'};\n  }\n`;\n\nexport const ButtonFacebook = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.facebook.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.facebook.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:after {\n    color: ${theme.social.facebook.default};\n  }\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.facebook.default : '#fff'};\n  }\n`;\n\nexport const ButtonGoogle = styled(SigninButton)`\n  background: ${props =>\n    props.preferred ? props.theme.social.google.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.google.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:after {\n    color: ${theme.social.google.default};\n  }\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.google.default : '#fff'};\n  }\n`;\n\nexport const ShareInputContainer = styled.div`\n  width: 100%;\n  max-width: 528px;\n  margin-top: 16px;\n`;\n\nexport const HeadingIconWrapper = styled.div`\n  display: flex;\n  padding: 32px;\n  align-items: center;\n  justify-content: center;\n  color: ${theme.text.alt};\n`;\n"
  },
  {
    "path": "src/components/usernameSearch/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport slugg from 'slugg';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withApollo } from 'react-apollo';\nimport { getUserByUsernameQuery } from 'shared/graphql/queries/user/getUser';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport { debounce } from 'src/helpers/utils';\nimport { Spinner } from '../globals';\nimport { Input, Loading } from './style';\n\ntype Props = {\n  client: Object,\n  username: string,\n  label: string,\n  size: string,\n  onValidationResult: ({\n    error: string,\n    success: string,\n    username?: string,\n  }) => void,\n  onError: ?(err: Error) => void,\n  dataCy?: string,\n};\n\ntype State = {\n  username: string,\n  isSearching: boolean,\n};\n\nclass UsernameSearch extends React.Component<Props, State> {\n  constructor(props) {\n    super(props);\n    const { username } = props;\n\n    this.state = {\n      username: slugg(username),\n      isSearching: false,\n    };\n\n    this.search = debounce(this.search, 500, false);\n  }\n\n  componentDidMount() {\n    const { username } = this.state;\n    // if no username was able to be suggested, don't kick off a search\n    // with an empty string\n    if (username.length === 0) return;\n\n    // $FlowIssue\n    this.search(username);\n  }\n\n  handleChange = e => {\n    const username = slugg(e.target.value.trim());\n\n    this.setState({\n      isSearching: false,\n      username,\n    });\n\n    if (!this.isUsernameValid(username)) {\n      return this.notifyParentWithValidationResult(username);\n    }\n\n    this.props.onValidationResult({\n      error: '',\n      success: '',\n    });\n\n    // $FlowIssue\n    return this.search(username);\n  };\n\n  isUsernameValid = username => username.length > 0 && username.length <= 20;\n\n  notifyParentWithValidationResult = username => {\n    if (username.length > 20) {\n      this.props.onValidationResult({\n        error: 'Usernames can be up to 20 characters',\n        success: '',\n      });\n    } else if (username.length === 0) {\n      this.props.onValidationResult({\n        error: 'Be sure to set a username so that people can find you!',\n        success: '',\n      });\n    } else {\n      this.props.onValidationResult({\n        error: '',\n        success: '',\n      });\n    }\n  };\n\n  search = (username: string) => {\n    // username in state could not be the same as username argument here\n    // so dont make a call with previous username\n    if (!this.isUsernameValid(this.state.username)) return;\n\n    // username argument here is already validated\n    this.setState({\n      isSearching: true,\n    });\n\n    // check the db to see if this channel slug exists\n    this.props.client\n      .query({\n        query: getUserByUsernameQuery,\n        variables: {\n          username,\n        },\n      })\n      .then(({ data: { user } }: { data: { user: GetUserType } }) => {\n        if (user && user.id) {\n          this.props.onValidationResult({\n            error: 'That username has already been taken.',\n            success: '',\n            username,\n          });\n        } else {\n          this.props.onValidationResult({\n            error: '',\n            success: 'That username is available!',\n            username,\n          });\n        }\n        this.setState({\n          isSearching: false,\n        });\n      })\n      .catch(err => {\n        this.props.onError && this.props.onError(err);\n        this.setState({\n          isSearching: false,\n        });\n      });\n  };\n\n  render() {\n    const { username, isSearching } = this.state;\n    // eslint-disable-next-line\n    const { label, size, dataCy, onValidationResult, ...rest } = this.props;\n    return (\n      <React.Fragment>\n        <Input\n          {...rest}\n          size={size}\n          defaultValue={username}\n          onChange={this.handleChange}\n          dataCy={dataCy}\n        >\n          {label && label}\n          {isSearching && (\n            <Loading size={size}>\n              <Spinner size={16} color={'brand.default'} />\n            </Loading>\n          )}\n        </Input>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default compose(\n  withApollo,\n  connect()\n)(UsernameSearch);\n"
  },
  {
    "path": "src/components/usernameSearch/style.js",
    "content": "import React from 'react';\nimport theme from 'shared/theme';\n// $FlowFixMe\nimport styled from 'styled-components';\nimport { Transition } from '../globals';\n\nexport const Loading = styled.span`\n  position: absolute;\n  left: calc(100% - 24px);\n  top: ${props => (props.size === 'small' ? 'calc(50% + 12px)' : '50%')};\n`;\n\nexport const StyledLabel = styled.label`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  font-weight: 500;\n  font-size: 14px;\n  letter-spacing: -0.4px;\n  color: ${theme.text.default};\n  transition: ${Transition.hover.off};\n  position: relative;\n  margin-top: ${props => (props.size === 'small' ? '12px' : 0)};\n  &:hover > input {\n    border-color: ${props =>\n      props.disabled ? props.theme.bg.border : props.theme.text.alt};\n    transition: ${Transition.hover.on};\n  }\n  &:hover > input:focus {\n    border-color: ${props =>\n      props.disabled ? props.theme.bg.inactive : props.theme.brand.alt};\n  }\n`;\n\nexport const StyledInput = styled.input`\n  flex: 1 0 auto;\n  background: ${props =>\n    props.disabled ? props.theme.bg.wash : props.theme.bg.default};\n  font-weight: 500;\n  width: 100%;\n  font-size: ${props => (props.size === 'small' ? '14px' : '18px')};\n  border: 2px solid\n    ${props =>\n      props.disabled ? props.theme.bg.border : props.theme.bg.inactive};\n  border-radius: ${props => (props.size === 'small' ? '4px' : '8px')};\n  padding: ${props => (props.size === 'small' ? '8px 12px' : '12px 24px')};\n  margin-top: 2px;\n  text-align: ${props => (props.size === 'small' ? 'left' : 'center')};\n  box-shadow: none;\n  transition: ${Transition.hover.off};\n  &::placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &::-webkit-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-moz-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:-ms-input-placeholder {\n    color: ${theme.text.placeholder};\n  }\n  &:focus {\n    border-color: ${theme.brand.default};\n    transition: ${Transition.hover.on};\n  }\n`;\n\nexport const Input = props => {\n  const { dataCy, ...rest } = props;\n  return (\n    <StyledLabel {...rest}>\n      {props.children}\n      <StyledInput\n        id={props.id}\n        type={props.inputType}\n        defaultValue={props.defaultValue}\n        placeholder={props.placeholder}\n        onChange={props.onChange}\n        autoFocus={props.autoFocus}\n        disabled={props.disabled}\n        size={props.size}\n        data-cy={dataCy}\n      />\n    </StyledLabel>\n  );\n};\n"
  },
  {
    "path": "src/components/viewError/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { FillSpaceError, LargeEmoji, Heading, Subheading } from './style';\nimport { PrimaryButton } from 'src/components/button';\nimport { removeItemFromStorage } from 'src/helpers/localStorage';\n\n/*\n  A generic error component which will fill the space of any container its placed in.\n  It requires a heading and subheading to be used to inform the error about why this error is being shown.\n\n  It receives optional props that can help fix a user's problem or nudge them towards resolution:\n  - clearStorage: if this prop is present, we will clear the local storage on the client which will then prompt them to re-login on the next page load.\n  - refresh: if this prop is present, we will show a button that the user can click to refresh the view. This will most often be used in conjunction with clearStorage\n  - children: the error component can receive any other miscellaneous children in order to customize the error view based on the context it's in\n*/\ntype Props = {\n  emoji?: string,\n  heading?: string,\n  subheading?: string,\n  clearStorage?: boolean,\n  refresh?: boolean,\n  children?: React$Node,\n  small?: boolean,\n  dataCy?: string,\n};\n\nclass ViewError extends React.Component<Props> {\n  render() {\n    const {\n      clearStorage,\n      heading,\n      subheading,\n      refresh,\n      emoji,\n      children,\n      small,\n      dataCy,\n    } = this.props;\n\n    if (clearStorage) {\n      removeItemFromStorage('spectrum');\n    }\n\n    const moji = emoji || '😌';\n    const head = heading || 'We could all use a refresh.';\n    const subhead = subheading || 'Refresh this page to try again.';\n\n    return (\n      <FillSpaceError small={small} data-cy={dataCy}>\n        <LargeEmoji small={small} role=\"img\" aria-label=\"Emoji\">\n          {moji}\n        </LargeEmoji>\n        <Heading small={small}>{head}</Heading>\n        <Subheading small={small}>{subhead}</Subheading>\n\n        {refresh && (\n          <PrimaryButton onClick={() => window.location.reload(true)}>\n            Refresh the page\n          </PrimaryButton>\n        )}\n\n        {children}\n      </FillSpaceError>\n    );\n  }\n}\n\nexport default ViewError;\n"
  },
  {
    "path": "src/components/viewError/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\n// $FlowFixMe\nimport styled from 'styled-components';\n\nexport const FillSpaceError = styled.div`\n  display: flex;\n  flex: auto;\n  background: ${theme.bg.default};\n  justify-content: center;\n  align-items: center;\n  flex-direction: column;\n  align-self: stretch;\n  text-align: center;\n  padding: ${props => (props.small ? '16px 12px' : '32px 24px')};\n  border-radius: 12px;\n`;\n\nexport const LargeEmoji = styled.span`\n  text-align: center;\n  display: block;\n  font-size: ${props => (props.small ? '32px' : '56px')};\n  margin-bottom: ${props => (props.small ? '16px' : '24px')};\n  line-height: 1;\n`;\n\nexport const Heading = styled.h3`\n  font-size: ${props => (props.small ? '18px' : '24px')};\n  font-weight: ${props => (props.small ? '500' : '600')};\n  color: ${theme.text.default};\n  max-width: 600px;\n  margin-bottom: 8px;\n`;\n\nexport const Subheading = styled.h4`\n  font-size: ${props => (props.small ? '14px' : '18px')};\n  font-weight: ${props => (props.small ? '400' : '500')};\n  line-height: 1.4;\n  color: ${theme.text.alt};\n  max-width: 540px;\n  margin-bottom: ${props => (props.small ? '16px' : '32px')};\n`;\n"
  },
  {
    "path": "src/components/viewNetworkHandler/index.js",
    "content": "// @flow\nimport React from 'react';\nimport hoistStatics from 'hoist-non-react-statics';\n\n/*\n\nThis HOC can be used to wrap any component that is performaing data queries with Apollo. It will return human-readable props that indicate the status of the query. For example, in your component rather than writing:\n\nif (networkStatus === 3) {\n  ...\n}\n\nYou can no write:\n\nif (isFetchingMore) {\n  ...\n}\n\nIf you need to override this at any point, the original data prop is returned as well, so in your component you can still access this.props.data.networkStatus.\n\n\nApollo NetworkStatus indicators:\n\n1. loading: The query has never been run before and the request is now pending. A query will still have this network status even if a result was returned from the cache, but a query was dispatched anyway.\n\n2. setVariables: If a query’s variables change and a network request was fired then the network status will be setVariables until the result of that query comes back. React users will see this when options.variables changes on their queries.\n\n3. fetchMore: Indicates that fetchMore was called on this query and that the network request created is currently in flight.\n\n4. refetch: It means that refetch was called on a query and the refetch request is currently in flight.\n\n5. Unused.\n\n6. poll: Indicates that a polling query is currently in flight. So for example if you are polling a query every 10 seconds then the network status will switch to poll every 10 seconds whenever a poll request has been sent but not resolved.\n\n7. ready: No request is in flight for this query, and no errors happened. Everything is OK.\n\n8. error: No request is in flight for this query, but one or more errors were detected.\n\n*/\n\nexport type ViewNetworkHandlerType = {\n  isLoading: boolean,\n  queryVarIsChanging: boolean,\n  isFetchingMore: boolean,\n  isRefetching: boolean,\n  isPolling: boolean,\n  hasError: boolean,\n};\n\n// $FlowFixMe\nconst viewNetworkHandler = Component => {\n  const C = props => {\n    // $FlowFixMe\n    const { data, wrappedComponentRef, ...remainingProps } = props;\n\n    // safety check against the data prop not existing\n    if (!data)\n      return <Component {...remainingProps} ref={wrappedComponentRef} />;\n\n    // 1: if  the view is running a query for the first time\n    // 2: the view has already mounted but the variables have changed, the component should be loading. For example, if you are viewing a user profile but click directly onto another user's profile from a thread facepile, the userProfile component has already loaded, but now the variable (userId) has been changed. This should force a loading state.\n    const isLoading = data.networkStatus === 1 || data.networkStatus === 2;\n    const queryVarIsChanging = data.networkStatus === 2;\n    const isFetchingMore = data.networkStatus === 3;\n    const isRefetching = data.networkStatus === 4;\n    const isPolling = data.networkStatus === 6;\n    const hasError = data.networkStatus === 8;\n\n    return (\n      <Component\n        {...remainingProps}\n        data={data}\n        hasError={hasError}\n        isLoading={isLoading}\n        isFetchingMore={isFetchingMore}\n        isRefetching={isRefetching}\n        isPolling={isPolling}\n        queryVarIsChanging={queryVarIsChanging}\n        ref={wrappedComponentRef}\n      />\n    );\n  };\n\n  C.WrappedComponent = Component;\n  return hoistStatics(C, Component);\n};\n\nexport default viewNetworkHandler;\n"
  },
  {
    "path": "src/components/visuallyHidden/index.js",
    "content": "// @flow\nimport styled from 'styled-components';\n\nconst VisuallyHidden = styled.span`\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  overflow: hidden;\n  clip: rect(1px, 1px, 1px, 1px);\n`;\n\nexport default VisuallyHidden;\n"
  },
  {
    "path": "src/components/withCurrentUser/index.js",
    "content": "// @flow\nimport React, { Component, type ComponentType, type Node } from 'react';\nimport hoistStatics from 'hoist-non-react-statics';\nimport compose from 'recompose/compose';\nimport {\n  getCurrentUser,\n  type GetUserType,\n} from 'shared/graphql/queries/user/getUser';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\n\ntype RenderFunction = ({\n  currentUser?: UserInfoType,\n  isLoading: boolean,\n}) => Node;\n\ntype Props = {\n  render?: RenderFunction,\n  children?: RenderFunction,\n  data: {\n    user?: GetUserType,\n    networkStatus: number,\n  },\n};\n\nclass CurrentUserComponent extends Component<Props> {\n  render() {\n    const {\n      data: { user: currentUser, networkStatus },\n      children,\n      render,\n    } = this.props;\n    const isLoading = networkStatus === 1 || networkStatus === 2;\n\n    if (!children && !render) return null;\n\n    return children\n      ? children({ currentUser, isLoading })\n      : // $FlowIssue\n        render({ currentUser, isLoading });\n  }\n}\n\nexport const CurrentUser = compose(getCurrentUser)(CurrentUserComponent);\n\nexport type WithCurrentUserProps = {\n  currentUser: ?GetUserType,\n};\n\nexport const withCurrentUser = (\n  Component: ComponentType<Props>\n): ComponentType<$Diff<Props, WithCurrentUserProps>> => {\n  const C = props => {\n    const { wrappedComponentRef, ...remainingProps } = props;\n    return (\n      <CurrentUser>\n        {({ currentUser, isLoading }) => {\n          return (\n            <Component\n              {...remainingProps}\n              currentUser={currentUser ? currentUser : null}\n              isLoadingCurrentUser={isLoading}\n              ref={wrappedComponentRef}\n            />\n          );\n        }}\n      </CurrentUser>\n    );\n  };\n\n  C.WrappedComponent = Component;\n  return hoistStatics(C, Component);\n};\n"
  },
  {
    "path": "src/helpers/directMessageThreads.js",
    "content": "export const sortThreadsByLatestActivity = (\n  threads: Array<Object>\n): Array<Object> => {\n  // copy the array of threads\n  const unsortedThreads = threads.slice(0);\n\n  // for each thread\n  const sortedThreads = unsortedThreads.sort((x, y));\n\n  return sortedThreads;\n};\n"
  },
  {
    "path": "src/helpers/get-thread-link.js",
    "content": "// @flow\nimport slugg from 'slugg';\nimport type { ThreadInfoType } from 'shared/graphql/fragments/thread/threadInfo';\n\nconst getThreadLink = (thread: ThreadInfoType) => {\n  if (!thread.community || !thread.channel) return `/thread/${thread.id}`;\n  return `/${thread.community.slug}/${thread.channel.slug}/${slugg(\n    thread.content.title\n  )}~${thread.id}`;\n};\n\nexport default getThreadLink;\n"
  },
  {
    "path": "src/helpers/history.js",
    "content": "// @flow\nimport { createBrowserHistory } from 'history';\n\nexport const history = createBrowserHistory();\n"
  },
  {
    "path": "src/helpers/images.js",
    "content": "// @flow\r\nexport const PRO_USER_MAX_IMAGE_SIZE_BYTES = 25000000;\r\nexport const PRO_USER_MAX_IMAGE_SIZE_STRING = `${Math.floor(\r\n  PRO_USER_MAX_IMAGE_SIZE_BYTES / 1000000\r\n)}mb`;\r\n"
  },
  {
    "path": "src/helpers/is-admin.js",
    "content": "// @flow\nexport const isAdmin = (id: string): boolean => {\n  const admins = [\n    'gVk5mYwccUOEKiN5vtOouqroGKo1',\n    '01p2A7kDCWUjGj6zQLlMQUOSQL42',\n    'VToKcde16dREgDkXcDl3hhcrFN33',\n  ];\n  return admins.indexOf(id) > -1;\n};\n"
  },
  {
    "path": "src/helpers/is-viewing-marketing-page.js",
    "content": "// @flow\nexport const isViewingMarketingPage = (\n  history: Object,\n  currentUser: ?Object\n) => {\n  const viewing = history.location.pathname;\n  const isRoot = viewing === '/';\n\n  if (isRoot && (!currentUser || !currentUser.id)) return true;\n\n  return viewing === '/code-of-conduct';\n};\n"
  },
  {
    "path": "src/helpers/keycodes.js",
    "content": "// @flow\nexport const ENTER = 13;\nexport const ESC = 27;\nexport const BACKSPACE = 8;\nexport const ARROW_RIGHT = 39;\nexport const ARROW_DOWN = 40;\nexport const ARROW_UP = 38;\nexport const ARROW_LEFT = 37;\nexport const DELETE = 46;\n"
  },
  {
    "path": "src/helpers/localStorage.js",
    "content": "export const clearStorage = () => localStorage.clear();\n\nexport const getItemFromStorage = (key: string) => {\n  if (!localStorage) return;\n\n  try {\n    return JSON.parse(localStorage.getItem(key));\n  } catch (err) {\n    console.error(`Error getting item ${key} from localStorage`, err);\n  }\n};\n\nexport const storeItem = (key: string, item: any) => {\n  if (!localStorage) return;\n\n  try {\n    return localStorage.setItem(key, JSON.stringify(item));\n  } catch (err) {\n    console.error(`Error storing item ${key} to localStorage`, err);\n  }\n};\n\nexport const removeItemFromStorage = (key: string) => {\n  if (!localStorage) return;\n\n  try {\n    return localStorage.removeItem(key);\n  } catch (err) {\n    console.error(`Error removing item ${key} from localStorage`, err);\n  }\n};\n"
  },
  {
    "path": "src/helpers/navigation-context.js",
    "content": "// @flow\nimport React from 'react';\n\nexport const NavigationContext = React.createContext({\n  navigationIsOpen: false,\n  setNavigationIsOpen: () => {},\n});\n"
  },
  {
    "path": "src/helpers/notifications.js",
    "content": "import React from 'react';\nimport { Link } from 'react-router-dom';\nimport Icon from '../components/icon';\nimport { HorizontalRuleWithIcon } from '../components/globals';\n\nconst icons = {\n  NEW_THREAD: 'post',\n  NEW_MESSAGE: 'messages',\n  default: 'notification',\n};\n\nconst colors = {\n  NEW_THREAD: 'success.alt',\n  NEW_MESSAGE: 'warn.alt',\n};\n\nexport const getIconByType = type => {\n  return icons[type] || icons.default;\n};\n\nexport const getColorByType = type => {\n  // TODO: add \"readState\" handling to change color to light gray\n  return colors[type];\n};\n\nexport const constructMessage = notification => {\n  const { type, sender, community, channel, thread } = notification;\n  switch (type) {\n    case 'NEW_THREAD':\n      return (\n        <span>\n          <Link to={`/@${sender.username}`}>{sender.name}</Link> posted a new\n          thread in{' '}\n          <Link to={`/${community.slug}/${channel.slug}`}>\n            {community.name}/{channel.name}\n          </Link>\n          :\n        </span>\n      );\n    case 'NEW_MESSAGE':\n      return (\n        <span>\n          <Link to={`/@${sender.username}`}>{sender.name}</Link> replied to your{' '}\n          <Link\n            to={{\n              pathname: getThreadLink(thread),\n              state: { modal: true },\n            }}\n          >\n            thread\n          </Link>\n          :\n        </span>\n      );\n    default:\n      return;\n  }\n};\n\nexport const constructLinklessMessage = notification => {\n  const { type, sender, community, channel } = notification;\n  switch (type) {\n    case 'NEW_THREAD':\n      return (\n        <span>\n          <b>{sender.name}</b> posted a new thread in{' '}\n          <b>\n            {community.name}/{channel.name}\n          </b>\n        </span>\n      );\n    case 'NEW_MESSAGE':\n      return (\n        <span>\n          <b>{sender.name}</b> replied to your <b>thread</b>\n        </span>\n      );\n    default:\n      return;\n  }\n};\n\nexport const constructContent = notification => {\n  const { type, sender, content } = notification;\n  switch (type) {\n    case 'NEW_THREAD':\n      return <p>{content.excerpt}</p>;\n    case 'NEW_MESSAGE':\n      return (\n        <div>\n          <HorizontalRuleWithIcon>\n            <hr />\n            <Icon glyph={'messages'} />\n            <hr />\n          </HorizontalRuleWithIcon>\n        </div>\n      );\n    default:\n      return;\n  }\n};\n"
  },
  {
    "path": "src/helpers/realtimeThreads.js",
    "content": "// @flow\n// used to update feed caches with new threads in real time\n// takes an array of existing threads in the cache and figures out how to insert the newly updated thread\nexport default (prevThreads: Array<Object>, updatedThread: Object) => {\n  // get an array of thread ids based on the threads already in cache\n  const prevThreadIds = prevThreads.map(thread => thread.node.id);\n\n  // determine if the newly updated thread exists in the cache or not\n  // if it doesn't exist in cache, it's a new thread! if it does exist in cache, it just means its\n  // been updated with a new message\n  const hasNewThread = prevThreadIds.indexOf(updatedThread.id) < 0;\n\n  return hasNewThread\n    ? [\n        {\n          node: updatedThread,\n          cursor: '__this-is-a-cursor__',\n          __typename: 'Thread',\n        },\n        ...prevThreads,\n      ]\n    : [\n        ...prevThreads.map(thread => {\n          if (thread.node.id !== updatedThread.id) return thread;\n          return {\n            node: updatedThread,\n            cursor: '__this-is-a-cursor__',\n            __typename: 'Thread',\n          };\n        }),\n      ];\n};\n"
  },
  {
    "path": "src/helpers/regexps.js",
    "content": "// eslint-disable-next-line\nexport const URLS = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,4}\\b([-a-zA-Z0-9@:%_\\+.~#?&\\/\\/=]*)/gi;\n// eslint-disable-next-line\nexport const FIGMA_URLS = /https:\\/\\/([w.-]+.)?figma.com\\/(file|proto)\\/([0-9a-zA-Z]{22,128})(?:\\/.*)?$/gi;\n// eslint-disable-next-line\nexport const YOUTUBE_URLS = /http(?:s?):\\/\\/(?:www\\.)?youtu(?:be\\.com\\/watch\\?v=|\\.be\\/)([\\w\\-\\_]*)(&(amp;)?‌​[\\w\\?‌​=]*)?/gi;\n// eslint-disable-next-line\nexport const VIMEO_URLS = /\\/\\/(?:www\\.)?vimeo.com\\/([0-9a-z\\-_]+)/gi;\n// eslint-disable-next-line\nexport const IFRAME_TAG = /(<iframe.*?src=['\"](.*?)['\"])/gi;\n// eslint-disable-next-line\nexport const FRAMER_URLS = /(https?:\\/\\/(.+?\\.)?framer\\.cloud(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?)/gi;\n// eslint-disable-next-line\nexport const CODEPEN_URLS = /(https?:\\/\\/)?(.+?\\.)?codepen\\.io(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\n// eslint-disable-next-line\nexport const CODESANDBOX_URLS = /(https?:\\/\\/)?(.+?\\.)?codesandbox\\.io(\\/[A-Za-z0-9\\-\\._~:\\/\\?#\\[\\]@!$&'\\(\\)\\*\\+,;\\=]*)?/gi;\n// eslint-disable-next-line\nexport const ENDS_IN_WHITESPACE = /(\\s|\\n)$/;\n"
  },
  {
    "path": "src/helpers/render-text-with-markdown-links.js",
    "content": "// @flow\nimport * as React from 'react';\nimport replace from 'string-replace-to-array';\nimport { Link } from 'react-router-dom';\nimport { SPECTRUM_URLS } from 'shared/regexps';\nconst MARKDOWN_LINK = /(?:\\[(.*?)\\]\\((.*?)\\))/g;\n\nexport default (text: string) => {\n  return replace(text, MARKDOWN_LINK, (fullLink, text, url) => {\n    const regexp = new RegExp(SPECTRUM_URLS, 'ig');\n    const match = regexp.exec(url);\n\n    if (match && match[0] && match[1]) return <Link to={match[1]}>{text}</Link>;\n\n    return (\n      <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" key={url}>\n        {text}\n      </a>\n    );\n  });\n};\n"
  },
  {
    "path": "src/helpers/sentry-redux-middleware.js",
    "content": "const crashReporter = store => next => action => {\n  // Handle THROW_ERROR actions\n  if (action.type === 'THROW_ERROR') {\n    console.error('Caught an exception!', action.err);\n    if (process.env.NODE_ENV !== 'development') {\n      window.Raven &&\n        window.Raven.captureException(action.err, {\n          extra: {\n            action,\n            state: store.getState(),\n          },\n        });\n    }\n  }\n\n  try {\n    return next(action);\n  } catch (err) {\n    console.error('Caught an exception!', err);\n    if (process.env.NODE_ENV !== 'development') {\n      window.Raven &&\n        window.Raven.captureException(err, {\n          extra: {\n            action,\n            state: store.getState(),\n          },\n        });\n    }\n    throw err;\n  }\n};\n\nexport default crashReporter;\n"
  },
  {
    "path": "src/helpers/signed-out-fallback.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport AuthViewHandler from 'src/views/authViewHandler';\n\nconst Switch = props => {\n  const { Component, FallbackComponent, ...rest } = props;\n  return (\n    <AuthViewHandler>\n      {authed => {\n        if (!authed) return <FallbackComponent {...rest} />;\n        return <Component {...rest} />;\n      }}\n    </AuthViewHandler>\n  );\n};\n\n// Connect that component to the Redux state\nconst ConnectedSwitch = compose(withCurrentUser)(Switch);\n\nconst signedOutFallback = (\n  Component: React$ComponentType<*>,\n  FallbackComponent: React$ComponentType<*>\n) => {\n  return (props: *) => (\n    <ConnectedSwitch\n      {...props}\n      FallbackComponent={FallbackComponent}\n      Component={Component}\n    />\n  );\n};\n\nexport default signedOutFallback;\n"
  },
  {
    "path": "src/helpers/utils.js",
    "content": "// @flow\nimport React from 'react';\nimport replace from 'string-replace-to-array';\n\n/*\n  Best guess at if user is on a mobile device. Used in the modal components\n  to determine where the modal should be positioned, how it should close and\n  scroll, etc\n*/\nexport function isMobile() {\n  let userAgent = navigator.userAgent || navigator.vendor || window.opera;\n\n  if (\n    /windows phone/i.test(userAgent) ||\n    /android/i.test(userAgent) ||\n    (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream)\n  ) {\n    return true;\n  }\n\n  return false;\n}\n\nexport const debounce = (func: Function, wait: number, immediate: boolean) => {\n  let timeout;\n  return function() {\n    let context = this,\n      args = arguments;\n    let later = function() {\n      timeout = null;\n      if (!immediate) func.apply(context, args);\n    };\n    let callNow = immediate && !timeout;\n    // $FlowFixMe\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) func.apply(context, args);\n  };\n};\n\nexport const throttle = (func: Function, threshold: number, scope: any) => {\n  threshold || (threshold = 250);\n  let last, deferTimer;\n  return function() {\n    let context = scope || this;\n\n    let now = +new Date(),\n      args = arguments;\n    if (last && now < last + threshold) {\n      // hold on to it\n      clearTimeout(deferTimer);\n      deferTimer = setTimeout(function() {\n        last = now;\n        func.apply(context, args);\n      }, threshold);\n    } else {\n      last = now;\n      func.apply(context, args);\n    }\n  };\n};\n\n// Truncate a string nicely to a certain length\nexport const truncate = (str: string, length: number) => {\n  if (str.length <= length) {\n    return str;\n  }\n  const subString = str.substr(0, length);\n  return subString.substr(0, subString.lastIndexOf(' ')) + '…';\n};\n\n// takes a number like 1,480 and returns a truncated number: 1.5k\n// takes an option 'places' argument to round - default to 1 (e.g. 1 = 1.5k. 2 = 1.48k)\nexport const truncateNumber = (number: number, places: number = 1) => {\n  const truncated =\n    number > 999 ? (number / 1000).toFixed(places) + 'k' : number;\n  // if the last number is 0 and we are rounding to one place, just ommit\n  const lastDigit = truncated.toString().slice(-2);\n\n  if (lastDigit === '0k' && places === 1) {\n    return truncated.toString().slice(0, -3) + 'k';\n  } else {\n    return truncated;\n  }\n};\n\nexport const sortByDate = (array: Array<any>, key: string, order: string) => {\n  return array.sort((a, b) => {\n    const x = new Date(a[key]).getTime();\n    const y = new Date(b[key]).getTime();\n    // desc = older to newest from top to bottom\n    const val = order === 'desc' ? y - x : x - y;\n    return val;\n  });\n};\n\nexport const sortByTitle = (array: Array<any>) => {\n  return array.sort((a, b) => {\n    const x = a['name'];\n    const y = b['name'];\n    const val = x.localeCompare(y, {\n      sensitivity: 'base',\n      numeric: 'true',\n      caseFirst: 'upper',\n    });\n    return val;\n  });\n};\n\nexport const renderMarkdownLinks = (text: string) => {\n  const MARKDOWN_LINK = /(?:\\[(.*?)\\]\\((.*?)\\))/g;\n\n  return replace(text, MARKDOWN_LINK, (fullLink, text, url) => (\n    <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n      {text}\n    </a>\n  ));\n};\n"
  },
  {
    "path": "src/helpers/web-push-manager.js",
    "content": "function urlB64ToUint8Array(base64String) {\r\n  const padding = '='.repeat((4 - base64String.length % 4) % 4);\r\n  const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\r\n\r\n  const rawData = window.atob(base64);\r\n  const outputArray = new Uint8Array(rawData.length);\r\n\r\n  for (let i = 0; i < rawData.length; ++i) {\r\n    outputArray[i] = rawData.charCodeAt(i);\r\n  }\r\n  return outputArray;\r\n}\r\n\r\nclass WebPushManager {\r\n  manager: any;\r\n  subscriptionAttempt: boolean;\r\n\r\n  constructor() {\r\n    this.manager = null;\r\n    this.subscriptionAttempt = false;\r\n  }\r\n\r\n  set = manager => {\r\n    this.manager = manager;\r\n    if (this.subscriptionAttempt) {\r\n      this.subscribe();\r\n    } else if (this.unsubscriptionAttempt) {\r\n      this.unsubscribe();\r\n    }\r\n  };\r\n\r\n  subscribe = () => {\r\n    if (!this.manager) {\r\n      this.subscriptionAttempt = true;\r\n      return Promise.reject('Please try again.');\r\n    }\r\n    return this.manager.subscribe({\r\n      userVisibleOnly: true,\r\n      applicationServerKey: urlB64ToUint8Array(\r\n        'BPJAFt0MO2BkTYSuzNdGHbVD6lbk2bzYqMBp1gBXLKUupEIIV7yXViZ1D7SyrJfFbYkKuoxwyaP8YcHU8nRDQsA'\r\n      ),\r\n    });\r\n  };\r\n\r\n  unsubscribe = () => {\r\n    if (!this.manager) {\r\n      this.unsubscriptionAttempt = true;\r\n      return Promise.resolve(true);\r\n    }\r\n    return this.getSubscription().then(subscription =>\r\n      subscription.unsubscribe()\r\n    );\r\n  };\r\n\r\n  getPermissionState = () => {\r\n    // No compat\r\n    if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\r\n      return new Promise(res => {\r\n        res(false);\r\n      });\r\n    }\r\n    // Old API\r\n    if (navigator.permissions) {\r\n      return navigator.permissions\r\n        .query({ name: 'notifications' })\r\n        .then(result => result.state);\r\n    }\r\n    // New API\r\n    return new Promise(res => {\r\n      res(Notification.permission);\r\n    });\r\n  };\r\n\r\n  _getSubscription = () => {\r\n    return this.manager.getSubscription();\r\n  };\r\n\r\n  getSubscription = () =>\r\n    new Promise(res => {\r\n      // Recursively call this method until we got a manager\r\n      if (!this.manager) {\r\n        setTimeout(() => {\r\n          res(this.getSubscription());\r\n        }, 500);\r\n      } else {\r\n        res(this._getSubscription());\r\n      }\r\n    });\r\n}\r\n\r\nexport default new WebPushManager();\r\n"
  },
  {
    "path": "src/hooks/useAppScroller.js",
    "content": "// @flow\nimport { useState, useEffect } from 'react';\n\nexport const useAppScroller = () => {\n  const [ref, setRef] = useState(null);\n\n  useEffect(() => {\n    if (!ref) setRef(document.getElementById('main'));\n  });\n\n  const scrollToTop = () => {\n    const elem = ref || document.getElementById('main');\n    if (elem) return (elem.scrollTop = 0);\n  };\n\n  const scrollToBottom = () => {\n    const elem = ref || document.getElementById('main');\n    if (elem) return (elem.scrollTop = elem.scrollHeight - elem.clientHeight);\n  };\n\n  const scrollTo = (pos: number) => {\n    const elem = ref || document.getElementById('main');\n    if (elem) return (elem.scrollTop = pos);\n  };\n\n  return { scrollToTop, scrollTo, scrollToBottom, ref };\n};\n"
  },
  {
    "path": "src/hooks/useConnectionRestored.js",
    "content": "// @flow\nimport type { WebsocketConnectionType } from 'src/reducers/connectionStatus';\n\ntype ConnectionProps = {\n  networkOnline: boolean,\n  websocketConnection: WebsocketConnectionType,\n};\n\ntype Props = {\n  prev: ConnectionProps,\n  curr: ConnectionProps,\n};\n\nconst validateProps = (props: Props) => {\n  if (!props.prev || !props.curr) return false;\n  if (\n    !props.prev.hasOwnProperty('networkOnline') ||\n    !props.curr.hasOwnProperty('networkOnline')\n  ) {\n    return false;\n  }\n\n  if (\n    !props.prev.hasOwnProperty('websocketConnection') ||\n    !props.curr.hasOwnProperty('websocketConnection')\n  ) {\n    return false;\n  }\n\n  return true;\n};\n\nconst websocketDidReconnect = (props: Props) => {\n  const { curr, prev } = props;\n  if (\n    prev.websocketConnection === 'reconnecting' &&\n    curr.websocketConnection === 'reconnected'\n  )\n    return true;\n  return false;\n};\n\nconst networkOnlineDidReconnect = (props: Props) => {\n  const { curr, prev } = props;\n  if (prev.networkOnline === false && curr.networkOnline === true) return true;\n  return false;\n};\n\nexport const useConnectionRestored = (props: Props) => {\n  if (!validateProps(props)) return false;\n  if (websocketDidReconnect(props)) return false;\n  if (networkOnlineDidReconnect(props)) return false;\n  return false;\n};\n"
  },
  {
    "path": "src/hooks/useDebounce.js",
    "content": "// @flow\nimport { useState, useEffect } from 'react';\n\n// @see https://dev.to/gabe_ragland/debouncing-with-react-hooks-jci\nfunction useDebounce(value: string, delay: number) {\n  const [debouncedValue, setDebouncedValue] = useState(value);\n\n  useEffect(() => {\n    const handler = setTimeout(() => {\n      setDebouncedValue(value);\n    }, delay);\n\n    return () => {\n      clearTimeout(handler);\n    };\n  }, [value]);\n\n  return debouncedValue;\n}\n\nexport default useDebounce;\n"
  },
  {
    "path": "src/hooks/usePrevious.js",
    "content": "// @flow\nimport { useRef, useEffect } from 'react';\n\nfunction usePrevious<T>(value: T): ?T {\n  const ref = useRef();\n  useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n}\n\nexport default usePrevious;\n"
  },
  {
    "path": "src/hot-routes.js",
    "content": "// @flow\n// This takes the ./routes.js file and makes it hot reload.\n// This should only be used on the client, not on the server!\nimport { hot } from 'react-hot-loader';\nimport Routes from './routes';\n\nexport default hot(module)(Routes);\n"
  },
  {
    "path": "src/index.js",
    "content": "// @flow\nimport 'css.escape';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { ApolloProvider } from 'react-apollo';\nimport { Provider } from 'react-redux';\nimport { Router } from 'react-router';\nimport queryString from 'query-string';\nimport Loadable from 'react-loadable';\nimport * as OfflinePluginRuntime from 'offline-plugin/runtime';\nimport { HelmetProvider } from 'react-helmet-async';\nimport webPushManager from 'src/helpers/web-push-manager';\nimport { history } from 'src/helpers/history';\nimport { client } from 'shared/graphql';\nimport { initStore } from 'src/store';\nimport { wsLink } from 'shared/graphql';\nimport RedirectHandler from 'src/components/redirectHandler';\nconst params = queryString.parse(history.location.search);\n\n// Redirect legacy ?thread=asdf & ?t=asdf URLs to the proper /<community>/<channel>/<thread>\n// equivalents via the /thread/<id> shorthand\nconst threadParam = params.thread || params.t;\nif (threadParam) {\n  if (params.m) {\n    history.replace(`/thread/${threadParam}?m=${params.m}`);\n  } else {\n    history.replace(`/thread/${threadParam}`);\n  }\n}\n// If the server passes an initial redux state use that, otherwise construct our own\nconst store = initStore(window.__SERVER_STATE__ || {});\n\nconst App = () => {\n  return (\n    <Provider store={store}>\n      <HelmetProvider>\n        <ApolloProvider client={client}>\n          <Router history={history}>\n            <RedirectHandler\n              maintenanceMode={\n                process.env.REACT_APP_MAINTENANCE_MODE === 'enabled'\n              }\n            />\n          </Router>\n        </ApolloProvider>\n      </HelmetProvider>\n    </Provider>\n  );\n};\n\nconst renderMethod = window.__SERVER_STATE__\n  ? // $FlowIssue\n    ReactDOM.hydrate\n  : ReactDOM.render;\n\nfunction render() {\n  return renderMethod(\n    <App />,\n    // $FlowIssue\n    document.querySelector('#root')\n  );\n}\n\nLoadable.preloadReady()\n  .then(render)\n  .catch(err => {\n    console.error(err);\n  });\n\nOfflinePluginRuntime.install({\n  // Apply new updates immediately\n  onUpdateReady: () => OfflinePluginRuntime.applyUpdate(),\n});\n\nif ('serviceWorker' in navigator && 'PushManager' in window) {\n  // $FlowIssue\n  navigator.serviceWorker.ready.then(registration => {\n    webPushManager.set(registration.pushManager);\n  });\n}\n\nwsLink.subscriptionClient.on('disconnected', () =>\n  store.dispatch({ type: 'WEBSOCKET_CONNECTION', value: 'disconnected' })\n);\nwsLink.subscriptionClient.on('connected', () =>\n  store.dispatch({ type: 'WEBSOCKET_CONNECTION', value: 'connected' })\n);\nwsLink.subscriptionClient.on('reconnected', () =>\n  store.dispatch({ type: 'WEBSOCKET_CONNECTION', value: 'reconnected' })\n);\n"
  },
  {
    "path": "src/reducers/connectionStatus.js",
    "content": "// @flow\nexport type WebsocketConnectionType =\n  | 'connected'\n  | 'connecting'\n  | 'reconnected'\n  | 'reconnecting';\n\ntype InitialState = {\n  networkOnline: boolean,\n  websocketConnection: WebsocketConnectionType,\n};\n\ntype ActionType = {\n  type: 'NETWORK_CONNECTION' | 'WEBSOCKET_CONNECTION' | 'PAGE_VISIBILITY',\n  value: any,\n};\n\nconst initialState: InitialState = {\n  networkOnline: true,\n  websocketConnection: 'connected',\n};\n\nexport default function status(\n  state: InitialState = initialState,\n  action: ActionType\n) {\n  switch (action.type) {\n    case 'NETWORK_CONNECTION':\n      return Object.assign({}, state, {\n        networkOnline: action.value,\n      });\n    case 'WEBSOCKET_CONNECTION':\n      return Object.assign({}, state, {\n        websocketConnection: action.value,\n      });\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/reducers/gallery.js",
    "content": "const initialState = {\n  isOpen: false,\n  threadId: null,\n  messageId: null,\n};\n\nexport default function gallery(state = initialState, action) {\n  switch (action.type) {\n    case 'SHOW_GALLERY':\n      return {\n        isOpen: true,\n        threadId: action.threadId,\n        messageId: action.messageId,\n      };\n    case 'HIDE_GALLERY':\n      return initialState;\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/reducers/index.js",
    "content": "// @flow\nimport { combineReducers } from 'redux';\nimport modals from './modals';\nimport toasts from './toasts';\nimport gallery from './gallery';\nimport threadSlider from './threadSlider';\nimport connectionStatus from './connectionStatus';\nimport titlebar from './titlebar';\n\nconst getReducers = () => {\n  return combineReducers({\n    modals,\n    toasts,\n    gallery,\n    threadSlider,\n    connectionStatus,\n    titlebar,\n  });\n};\n\nexport default getReducers;\n"
  },
  {
    "path": "src/reducers/modals.js",
    "content": "const initialState = {\n  modalType: null,\n  modalProps: {},\n  isOpen: false,\n};\n\nexport default function modal(state = initialState, action) {\n  switch (action.type) {\n    case 'SHOW_MODAL':\n      return {\n        modalType: action.modalType,\n        modalProps: action.modalProps,\n        isOpen: true,\n      };\n    case 'HIDE_MODAL':\n      return initialState;\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/reducers/threadSlider.js",
    "content": "const initialState = {\n  isOpen: false,\n  threadId: null,\n};\n\nexport default function threadSlider(state = initialState, action) {\n  switch (action.type) {\n    case 'OPEN_SLIDER':\n      return {\n        isOpen: true,\n        threadId: action.threadId,\n      };\n    case 'CLOSE_SLIDER':\n      return {\n        isOpen: false,\n        threadId: null,\n      };\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/reducers/titlebar.js",
    "content": "// @flow\nconst initialState = {\n  title: '',\n  titleIcon: null,\n  rightAction: null,\n  leftAction: 'menu',\n};\n\nexport default function titlebar(\n  state: typeof initialState = initialState,\n  action: Object\n) {\n  const { type, payload } = action;\n  switch (type) {\n    case 'SET_TITLEBAR_PROPS': {\n      return Object.assign({}, state, {\n        title: payload.title && payload.title,\n        titleIcon: payload.titleIcon && payload.titleIcon,\n        rightAction: payload.rightAction && payload.rightAction,\n        leftAction: payload.leftAction || 'menu',\n      });\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/reducers/toasts.js",
    "content": "const initialState = {\n  toasts: [],\n};\n\n/*\nPayload shape:\n\npayload: {\n  kind: 'error' | 'success',\n  message: string\n}\n*/\nexport default function toasts(state = initialState, action) {\n  switch (action.type) {\n    case 'ADD_TOAST': {\n      return Object.assign({}, state, {\n        toasts: [...state.toasts, action.payload],\n      });\n    }\n    case 'REMOVE_TOAST': {\n      const toasts = state.toasts.filter(toast => {\n        return toast.id !== action.id;\n      });\n      return Object.assign({}, state, {\n        toasts,\n      });\n    }\n    default:\n      return state;\n  }\n}\n"
  },
  {
    "path": "src/registerServiceWorker.js",
    "content": "// In production, we register a service worker to serve assets from local cache.\n\nimport webPushManager from './helpers/web-push-manager';\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nexport type ServiceWorkerResult = {\n  newContent?: boolean,\n  firstCache?: boolean,\n};\n\nconst IS_PROD = process.env.NODE_ENV === 'production';\n\nconst swUrl = IS_PROD\n  ? `${process.env.PUBLIC_URL}/service-worker.js`\n  : `${process.env.PUBLIC_URL}/push-sw-v1.js`;\n\nexport default function register(): Promise<ServiceWorkerResult> {\n  if ('serviceWorker' in navigator) {\n    return new Promise(res => {\n      window.addEventListener('load', () => {\n        navigator.serviceWorker\n          .register(swUrl)\n          .then(registration => {\n            if ('PushManager' in window) {\n              webPushManager.set(registration.pushManager);\n            }\n            registration.onupdatefound = () => {\n              const installingWorker = registration.installing;\n              installingWorker.onstatechange = () => {\n                if (installingWorker.state === 'installed') {\n                  if (navigator.serviceWorker.controller) {\n                    // At this point, the old content will have been purged and\n                    // the fresh content will have been added to the cache.\n                    res({ newContent: true });\n                  } else {\n                    // At this point, everything has been precached.\n                    res({ firstCache: true });\n                  }\n                }\n              };\n            };\n          })\n          .catch(error => {\n            console.error('Error during service worker registration:', error);\n          });\n      });\n    });\n  } else {\n    return Promise.resolve({});\n  }\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n"
  },
  {
    "path": "src/reset.css.js",
    "content": "// @flow\nimport { createGlobalStyle } from 'styled-components';\n// $FlowIssue\nimport prismGlobalCSS from '!!raw-loader!./components/rich-text-editor/prism-theme.css';\nimport theme from 'shared/theme';\n\nexport default createGlobalStyle`\n  ${prismGlobalCSS}\n\n  * {\n    border: 0;\n    box-sizing: inherit;\n    -webkit-font-smoothing: auto;\n    font-weight: inherit;\n    margin: 0;\n    outline: 0;\n    padding: 0;\n    text-decoration: none;\n    text-rendering: optimizeLegibility;\n    -webkit-appearance: none;\n    -moz-appearance: none;\n  }\n\n  html {\n    display: flex;\n    min-height: 100%;\n    width: 100%;\n    box-sizing: border-box;\n    font-size: 16px;\n    line-height: 1.5;\n    background-color: ${theme.bg.wash};\n    color: #16171a;\n    padding: 0;\n    margin: 0;\n    -webkit-font-smoothing: auto;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial,\n      sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';\n  }\n\n  body {\n    box-sizing: border-box;\n    width: 100%;\n    height: 100%;\n    overscroll-behavior-y: none;\n    -webkit-overflow-scrolling: touch;\n  }\n\n  #root {\n    height: 100%\n    width: 100%;\n  }\n\n  a {\n    color: currentColor;\n    text-decoration: none;\n  }\n\n  a:hover {\n    cursor: pointer;\n  }\n\n  textarea {\n    resize: none;\n  }\n\n  ::-moz-selection {\n    /* Code for Firefox */\n    background: ${theme.brand.alt};\n    color: ${theme.text.reverse};\n  }\n\n  ::selection {\n    background: ${theme.brand.alt};\n    color: ${theme.text.reverse};\n  }\n\n  ::-webkit-input-placeholder {\n    /* WebKit, Blink, Edge */\n    color: ${theme.text.placeholder};\n  }\n  :-moz-placeholder {\n    /* Mozilla Firefox 4 to 18 */\n    color: ${theme.text.placeholder};\n    opacity: 1;\n  }\n  ::-moz-placeholder {\n    /* Mozilla Firefox 19+ */\n    color: ${theme.text.placeholder};\n    opacity: 1;\n  }\n  :-ms-input-placeholder {\n    /* Internet Explorer 10-11 */\n    color: ${theme.text.placeholder};\n  }\n\n  .fade-enter {\n    opacity: 0;\n    z-index: 1;\n  }\n\n  .fade-enter.fade-enter-active {\n    opacity: 1;\n    transition: opacity 250ms ease-in;\n  }\n\n  .markdown {\n    font-size: 16px;\n    line-height: 1.4;\n    color: ${theme.text.default};\n  }\n\n  .markdown pre {\n    font-size: 15px;\n    white-space: pre;\n  }\n\n  .markdown p {\n    color: inherit;\n    font-size: 16px;\n    font-weight: 400;\n    display: block;\n  }\n\n  .markdown p + p {\n    margin-top: 16px;\n  }\n\n  .markdown img {\n    margin-top: 16px;\n    max-width: 100%;\n    display: inline;\n    border-radius: 4px;\n    transition: box-shadow 0.2s;\n    display: block;\n    margin: 12px 0;\n  }\n\n  .markdown img:hover {\n    cursor: pointer;\n    transition: box-shadow 0.2s;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n  }\n\n  .markdown em {\n    color: inherit;\n    font-size: inherit;\n    font-style: italic;\n  }\n\n  .markdown strong {\n    color: inherit;\n    font-size: inherit;\n    font-weight: 700;\n  }\n\n  .markdown ul,\n  .markdown ol {\n    color: inherit;\n    margin: 8px 0;\n    margin-left: 16px;\n  }\n\n  .markdown li {\n    color: inherit;\n    font-size: 16px;\n    margin-bottom: 4px;\n    line-height: 1.5;\n    font-weight: 400;\n  }\n\n  .markdown blockquote {\n    color: ${theme.text.secondary};\n    border-left: 4px solid ${theme.text.secondary};\n    background: ${theme.bg.wash};\n    padding: 4px 8px 4px 16px;\n    font-size: 16px;\n    font-weight: 400;\n    line-height: 1.4;\n    margin: 16px 0;\n    word-break: break-all;\n  }\n\n  .markdown blockquote p {\n    margin-top: 0;\n  }\n\n  .markdown a {\n    color: ${theme.brand.default};\n    font-weight: 500;\n    text-decoration: none;\n    font-size: inherit;\n    word-wrap: break-word;\n    line-height: inherit;\n  }\n\n  .markdown a:hover {\n    text-decoration: underline;\n  }\n\n  .markdown a:visited {\n    opacity: 0.6;\n    transition: opacity 0.2s ease-in;\n  }\n\n  .markdown code {\n    font-family: 'Input Mono', 'Menlo', 'Inconsolata', 'Roboto Mono', monospace;\n    font-weight: 500;\n    font-size: 14px;\n    line-height: 1.4px;\n    background-color: ${theme.bg.wash};\n    padding: 2px 4px;\n    display: inline;\n    width: 100%;\n    border: 1px solid ${theme.bg.border};\n    border-radius: 4px;\n    margin-bottom: 16px;\n  }\n\n  .markdown pre {\n    margin: 16px 0;\n    display: block;\n    border-radius: 4px;\n    background-color: ${theme.bg.wash};\n  }\n\n  .markdown pre code {\n    padding: 8px 16px;\n    display: block;\n    white-space: pre;\n    position: relative;\n    margin: 0;\n    border: none;\n    background: none;\n  }\n\n  .markdown div[data-block='true'] {\n    margin-top: 12px;\n  }\n\n  .markdown div[data-block='true']:first-of-type {\n    margin-top: 0;\n  }\n\n  .markdown span[data-text='true'] {\n    line-height: 1.4;\n  }\n\n  .markdown code span {\n    max-width: 100%;\n    white-space: pre-wrap;\n    word-break: break-word;\n  }\n\n  .markdown iframe {\n    margin: 1rem 0;\n  }\n\n  .markdown hr {\n    width: 100%;\n    height: 1px;\n    background: ${theme.bg.border};\n    display: block;\n    margin: 32px 0;\n  }\n\n  .markdown h1 {\n    font-size: 24px;\n    line-height: 40px;\n    border-bottom: 1px solid ${theme.bg.border};\n    font-weight: 800;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n  }\n\n  .markdown h2 {\n    font-size: 20px;\n    line-height: 32px;\n    font-weight: 700;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n  }\n\n  .markdown h3 {\n    font-size: 18px;\n    line-height: 28px;\n    font-weight: 700;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n  }\n\n  .markdown h4 {\n    font-size: 16px;\n    line-height: 20px;\n    font-weight: 700;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n    text-transform: lowercase;\n    font-variant: small-caps;\n  }\n\n  .markdown h5 {\n    font-size: 14px;\n    line-height: 20px;\n    font-weight: 700;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n    text-transform: lowercase;\n    font-variant: small-caps;\n  }\n\n  .markdown h6 {\n    font-size: 12px;\n    line-height: 16px;\n    font-weight: 700;\n    margin-top: 1rem;\n    margin-bottom: 8px;\n    text-transform: lowercase;\n    font-variant: small-caps;\n  }\n\n  .threadComposer textarea {\n    line-height: 1.5;\n    height: calc(100% + 48px)!important;\n  }\n  \n  .tippy-backdrop {\n    background-color: ${theme.text.default};\n  }\n`;\n"
  },
  {
    "path": "src/routes.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport {\n  Route,\n  Switch,\n  Redirect,\n  withRouter,\n  type Location,\n  type History,\n} from 'react-router';\nimport { ThemeProvider } from 'styled-components';\nimport Loadable from 'react-loadable';\nimport { ErrorBoundary } from 'src/components/error';\nimport { CLIENT_URL } from './api/constants';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport GlobalStyles from './reset.css.js';\nimport { GlobalThreadAttachmentStyles } from 'src/components/message/threadAttachment/style';\nimport { theme } from 'shared/theme';\nimport AppViewWrapper from 'src/components/appViewWrapper';\nimport ScrollManager from 'src/components/scrollManager';\nimport Head from 'src/components/head';\nimport ModalRoot from 'src/components/modals/modalRoot';\nimport Gallery from 'src/components/gallery';\nimport Toasts from 'src/components/toasts';\nimport signedOutFallback from 'src/helpers/signed-out-fallback';\nimport ThreadSlider from 'src/views/threadSlider';\nimport AnnouncementBanner from 'src/components/announcementBanner';\nimport Navigation from 'src/views/navigation';\nimport Status from 'src/views/status';\nimport Login from 'src/views/login';\nimport DirectMessages from 'src/views/directMessages';\nimport { ThreadView } from 'src/views/thread';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Maintenance from 'src/components/maintenance';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport RedirectOldThreadRoute from './views/thread/redirect-old-route';\nimport NewUserOnboarding from './views/newUserOnboarding';\nimport QueryParamToastDispatcher from './views/queryParamToastDispatcher';\nimport { LoadingView } from 'src/views/viewHelpers';\nimport GlobalTitlebar from 'src/views/globalTitlebar';\nimport { NavigationContext } from 'src/helpers/navigation-context';\n\nconst Explore = Loadable({\n  loader: () => import('./views/explore' /* webpackChunkName: \"Explore\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst UserView = Loadable({\n  loader: () => import('./views/user'/* webpackChunkName: \"UserView\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst CommunityView = Loadable({\n  loader: () => import('./views/community'/* webpackChunkName: \"CommunityView\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst ChannelView = Loadable({\n  loader: () => import('./views/channel'/* webpackChunkName: \"ChannelView\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst UserSettings = Loadable({\n  loader: () => import('./views/userSettings'/* webpackChunkName: \"UserSettings\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst CommunitySettings = Loadable({\n  loader: () => import('./views/communitySettings'/* webpackChunkName: \"communitySettings\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst ChannelSettings = Loadable({\n  loader: () => import('./views/channelSettings'/* webpackChunkName: \"channelSettings\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\n/* prettier-ignore */\nconst Pages = Loadable({\n  loader: () => import('./views/pages'/* webpackChunkName: \"Splash\" */),\n  loading: ({ isLoading }) => isLoading && null,\n});\n\n/* prettier-ignore */\nconst ErrorFallback = Loadable({\n  loader: () => import('./components/error'/* webpackChunkName: \"Error\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />\n});\n\nconst LoginFallback = signedOutFallback(() => <Redirect to=\"/\" />, Login);\nconst MessagesFallback = signedOutFallback(DirectMessages, () => (\n  <Login redirectPath={`${CLIENT_URL}/messages`} />\n));\nconst UserSettingsFallback = signedOutFallback(UserSettings, () => (\n  <Login redirectPath={`${CLIENT_URL}/me/settings`} />\n));\nconst CommunitySettingsFallback = signedOutFallback(CommunitySettings, () => (\n  <Login />\n));\nconst ChannelSettingsFallback = signedOutFallback(ChannelSettings, () => (\n  <Login />\n));\n\nexport const RouteModalContext = React.createContext({\n  isModal: false,\n});\n\ntype Props = {\n  currentUser: ?GetUserType,\n  isLoadingCurrentUser: boolean,\n  maintenanceMode?: boolean,\n  location: Location,\n  history: History,\n};\n\ntype State = {\n  navigationIsOpen: boolean,\n};\n\nclass Routes extends React.Component<Props, State> {\n  previousLocation = this.props.location;\n  state = { navigationIsOpen: false };\n\n  setNavigationIsOpen = (val: boolean) =>\n    this.setState({ navigationIsOpen: val });\n\n  render() {\n    const { currentUser, isLoadingCurrentUser } = this.props;\n    const { navigationIsOpen } = this.state;\n    const { title, description } = generateMetaInfo();\n\n    if (this.props.maintenanceMode) {\n      return (\n        <ThemeProvider theme={theme}>\n          <ScrollManager>\n            <GlobalStyles />\n            <Head\n              title=\"Ongoing Maintenance - Spectrum\"\n              description=\"Spectrum is currently undergoing scheduled maintenance downtime. Please check https://twitter.com/withspectrum for ongoing updates.\"\n            />\n            <Maintenance />\n          </ScrollManager>\n        </ThemeProvider>\n      );\n    }\n\n    const { location } = this.props;\n    const isModal = false; /* !!(\n      location.state &&\n      location.state.modal &&\n      this.previousLocation !== location\n    ); // not initial render */\n\n    // allows any UI in the tree to open or close the side navigation on mobile\n    const navigationContext = {\n      navigationIsOpen,\n      setNavigationIsOpen: this.setNavigationIsOpen,\n    };\n\n    // allows any UI in the tree to know if it is existing within a modal or not\n    // commonly used for background views to know that they are backgrounded\n    const routeModalContext = { isModal };\n\n    return (\n      <ErrorBoundary fallbackComponent={ErrorFallback}>\n        <ThemeProvider theme={theme}>\n          <NavigationContext.Provider value={navigationContext}>\n            {/* default meta tags, get overridden by anything further down the tree */}\n            <Head title={title} description={description} />\n            <GlobalStyles />\n            <GlobalThreadAttachmentStyles />\n\n            {/* dont let non-critical pieces of UI crash the whole app */}\n            <ErrorBoundary>\n              <Status />\n            </ErrorBoundary>\n            <ErrorBoundary>\n              <Toasts />\n            </ErrorBoundary>\n            <ErrorBoundary>\n              <Gallery />\n            </ErrorBoundary>\n            <ErrorBoundary>\n              <ModalRoot />\n            </ErrorBoundary>\n            <ErrorBoundary>\n              <QueryParamToastDispatcher />\n            </ErrorBoundary>\n\n            {isModal && (\n              <Route\n                // NOTE(@mxstbr): This custom path regexp matches threadId correctly in all cases, no matter if we prepend it with a custom slug or not.\n                // Imagine our threadId is \"id-123-id\" (similar in shape to an actual UUID)\n                // - /id-123-id => id-123-id, easy start that works\n                // - /some-custom-slug~id-123-id => id-123-id, custom slug also works\n                // - /~id-123-id => id-123-id => id-123-id, empty custom slug also works\n                // - /some~custom~slug~id-123-id => id-123-id, custom slug with delimiter char in it (~) also works! :tada:\n                path=\"/:communitySlug/:channelSlug/(.*~)?:threadId\"\n                component={props => (\n                  <ThreadSlider\n                    previousLocation={this.previousLocation}\n                    {...props}\n                  />\n                )}\n              />\n            )}\n\n            {/*\n              this context provider allows children views to determine\n              how they should behave if a modal is open. For example,\n              you could tell a community view to not paginate the thread\n              feed if a thread modal is open.\n            */}\n            <RouteModalContext.Provider value={routeModalContext}>\n              {/*\n                we tell the app view wrapper any time the modal state\n                changes so that we can restore the scroll position to where\n                it was before the modal was opened\n              */}\n              <AppViewWrapper {...routeModalContext}>\n                <Route component={Navigation} />\n                <Route component={GlobalTitlebar} />\n\n                <div css={isModal ? { overflow: 'hidden' } : {}}>\n                  <ErrorBoundary>\n                    <AnnouncementBanner />\n                  </ErrorBoundary>\n\n                  {/*\n                    switch only renders the first match. Subrouting happens downstream\n                    https://reacttraining.com/react-router/web/api/Switch\n                  */}\n                  <Switch location={isModal ? this.previousLocation : location}>\n                    <Route\n                      exact\n                      path=\"/\"\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n\n                    {/* Public Business Pages */}\n                    <Route\n                      path=\"/home\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/about\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/contact\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/support\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/faq\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/features\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      path=\"/new\"\n                      exact\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n\n                    <Route path=\"/terms\" component={Pages} />\n                    <Route path=\"/privacy\" component={Pages} />\n                    <Route path=\"/terms.html\" component={Pages} />\n                    <Route path=\"/privacy.html\" component={Pages} />\n                    <Route path=\"/code-of-conduct\" component={Pages} />\n\n                    {/* App Pages */}\n                    <Route path=\"/login\" component={LoginFallback} />\n                    <Route path=\"/explore\" component={Explore} />\n                    <Route\n                      path=\"/messages/:threadId\"\n                      component={MessagesFallback}\n                    />\n                    <Route path=\"/messages\" component={MessagesFallback} />\n                    <Route\n                      path=\"/thread/:threadId\"\n                      component={RedirectOldThreadRoute}\n                    />\n                    <Route path=\"/thread\" render={() => <Redirect to=\"/\" />} />\n                    <Route\n                      exact\n                      path=\"/users\"\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route exact path=\"/users/:username\" component={UserView} />\n                    <Route\n                      exact\n                      path=\"/users/:username/settings\"\n                      component={UserSettingsFallback}\n                    />\n\n                    <Route\n                      path=\"/me/settings\"\n                      render={() =>\n                        currentUser && currentUser.username ? (\n                          <Redirect\n                            to={`/users/${currentUser.username}/settings`}\n                          />\n                        ) : currentUser && !currentUser.username ? (\n                          <NewUserOnboarding />\n                        ) : isLoadingCurrentUser ? null : (\n                          <Login redirectPath={`${CLIENT_URL}/me/settings`} />\n                        )\n                      }\n                    />\n                    <Route\n                      path=\"/me\"\n                      render={() =>\n                        currentUser && currentUser.username ? (\n                          <Redirect to={`/users/${currentUser.username}`} />\n                        ) : currentUser && !currentUser.username ? (\n                          <NewUserOnboarding />\n                        ) : isLoadingCurrentUser ? null : (\n                          <Login redirectPath={`${CLIENT_URL}/me`} />\n                        )\n                      }\n                    />\n\n                    {/*\n                        We check communitySlug last to ensure none of the above routes\n                        pass. We handle null communitySlug values downstream by either\n                        redirecting to home or showing a 404\n                      */}\n                    <Route\n                      path=\"/:communitySlug/:channelSlug/settings\"\n                      component={ChannelSettingsFallback}\n                    />\n                    <Route\n                      path=\"/:communitySlug/settings\"\n                      component={CommunitySettingsFallback}\n                    />\n                    <Route\n                      path=\"/:communitySlug/login\"\n                      render={() => <Redirect to=\"/explore\" />}\n                    />\n                    <Route\n                      // NOTE(@mxstbr): This custom path regexp matches threadId correctly in all cases, no matter if we prepend it with a custom slug or not.\n                      // Imagine our threadId is \"id-123-id\" (similar in shape to an actual UUID)\n                      // - /id-123-id => id-123-id, easy start that works\n                      // - /some-custom-slug~id-123-id => id-123-id, custom slug also works\n                      // - /~id-123-id => id-123-id => id-123-id, empty custom slug also works\n                      // - /some~custom~slug~id-123-id => id-123-id, custom slug with delimiter char in it (~) also works! :tada:\n                      path=\"/:communitySlug/:channelSlug/(.*~)?:threadId\"\n                      component={ThreadView}\n                    />\n                    <Route\n                      path=\"/:communitySlug/:channelSlug\"\n                      component={ChannelView}\n                    />\n                    <Route path=\"/:communitySlug\" component={CommunityView} />\n                  </Switch>\n                </div>\n\n                {isModal && (\n                  <Route\n                    path=\"/thread/:threadId\"\n                    component={RedirectOldThreadRoute}\n                  />\n                )}\n              </AppViewWrapper>\n            </RouteModalContext.Provider>\n          </NavigationContext.Provider>\n        </ThemeProvider>\n      </ErrorBoundary>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  withRouter\n)(Routes);\n"
  },
  {
    "path": "src/store/index.js",
    "content": "// @flow\n/* eslint-disable */\nimport { createStore, compose, applyMiddleware } from 'redux';\nimport thunkMiddleware from 'redux-thunk';\nimport crashReporter from 'src/helpers/sentry-redux-middleware';\nimport getReducers from '../reducers';\n\n// this enables the chrome devtools for redux only in development\nconst composeEnhancers =\n  (process.env.NODE_ENV !== 'production' &&\n    typeof window !== 'undefined' &&\n    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||\n  compose;\n\n// init the store with the thunkMiddleware which allows us to make async actions play nicely with the store\n// Allow dependency injection of extra reducers and middleware, we need this for SSR\nexport const initStore = (initialState?: Object) => {\n  let store = createStore(\n    getReducers(),\n    initialState || {},\n    composeEnhancers(applyMiddleware(thunkMiddleware, crashReporter))\n  );\n\n  if (module.hot && typeof module.hot.accept === 'function') {\n    module.hot.accept('../reducers', () => {\n      const nextGetReducers = require('../reducers/index').default;\n      store.replaceReducer(nextGetReducers());\n    });\n  }\n\n  return store;\n};\n"
  },
  {
    "path": "src/views/authViewHandler/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { withRouter, type History, type Location } from 'react-router';\nimport { getCurrentUser } from 'shared/graphql/queries/user/getUser';\nimport type { GetUserType } from 'shared/graphql/queries/user/getUser';\nimport editUserMutation from 'shared/graphql/mutations/user/editUser';\nimport NewUserOnboarding from 'src/views/newUserOnboarding';\n\ntype Props = {\n  history: History,\n  location: Location,\n  editUser: Function,\n  children: (authed: boolean) => React$Element<*>,\n  data: {\n    user: GetUserType,\n    loading: boolean,\n  },\n};\n\nclass AuthViewHandler extends React.Component<Props> {\n  componentDidUpdate(prev: Props) {\n    const {\n      data: { user },\n      editUser,\n      history,\n      location,\n    } = this.props;\n\n    if (!prev.data.user && user) {\n      if (!user.timezone) {\n        const timezone = new Date().getTimezoneOffset() * -1;\n        try {\n          editUser({ timezone });\n        } catch (err) {}\n      }\n\n      if (location.pathname === '/home') history.replace('/');\n    }\n  }\n\n  render() {\n    const {\n      children,\n      data: { user, loading },\n    } = this.props;\n\n    if (user && !user.username) return <NewUserOnboarding />;\n    if (user && user.id) return children(true);\n    if (loading) return null;\n    return children(false);\n  }\n}\n\nexport default compose(\n  getCurrentUser,\n  editUserMutation,\n  withRouter,\n  connect()\n)(AuthViewHandler);\n"
  },
  {
    "path": "src/views/channel/components/MembersList.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { deduplicateChildren } from 'src/components/infiniteScroll/deduplicateChildren';\nimport { withRouter } from 'react-router';\nimport getChannelMembersQuery, {\n  type GetChannelMemberConnectionType,\n} from 'shared/graphql/queries/channel/getChannelMemberConnection';\nimport { Card } from 'src/components/card';\nimport { Loading } from 'src/components/loading';\nimport NextPageButton from 'src/components/nextPageButton';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport ViewError from 'src/components/viewError';\nimport { UserListItem } from 'src/components/entities';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype Props = {\n  data: {\n    channel: GetChannelMemberConnectionType,\n    fetchMore: Function,\n    networkStatus: number,\n  },\n  dispatch: Dispatch<Object>,\n  isLoading: boolean,\n  isFetchingMore: boolean,\n  history: Object,\n  currentUser: ?Object,\n};\n\nclass MembersList extends React.Component<Props> {\n  shouldComponentUpdate(nextProps) {\n    const curr = this.props;\n    // fetching more\n    if (curr.data.networkStatus === 7 && nextProps.data.networkStatus === 3)\n      return false;\n    return true;\n  }\n\n  render() {\n    const {\n      data: { channel },\n      isLoading,\n      currentUser,\n      isFetchingMore,\n    } = this.props;\n\n    if (channel && channel.memberConnection) {\n      const { edges: members, pageInfo } = channel.memberConnection;\n      const nodes = members.map(member => member && member.node);\n      const uniqueNodes = deduplicateChildren(nodes, 'id');\n      const { hasNextPage } = pageInfo;\n\n      return (\n        <React.Fragment>\n          {uniqueNodes.map(user => {\n            if (!user) return null;\n\n            return (\n              <UserListItem\n                key={user.id}\n                userObject={user}\n                name={user.name}\n                username={user.username}\n                description={user.description}\n                profilePhoto={user.profilePhoto}\n                isCurrentUser={currentUser && user.id === currentUser.id}\n                avatarSize={40}\n                showHoverProfile={false}\n                messageButton={currentUser && user.id !== currentUser.id}\n              />\n            );\n          })}\n          {hasNextPage && (\n            <NextPageButton\n              isFetchingMore={isFetchingMore}\n              fetchMore={this.props.data.fetchMore}\n              bottomOffset={-100}\n            >\n              Load more members\n            </NextPageButton>\n          )}\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading) {\n      return <Loading />;\n    }\n\n    return (\n      <Card>\n        <ViewError\n          refresh\n          heading={'We weren’t able to fetch the members of this community.'}\n        />\n      </Card>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  withCurrentUser,\n  getChannelMembersQuery,\n  viewNetworkHandler,\n  connect()\n)(MembersList);\n"
  },
  {
    "path": "src/views/channel/components/PostsFeed.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport type { GetChannelType } from 'shared/graphql/queries/channel/getChannel';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport getChannelThreads from 'shared/graphql/queries/channel/getChannelThreadConnection';\nimport ThreadFeed from 'src/components/threadFeed';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\nconst ChannelThreadFeed = compose(getChannelThreads)(ThreadFeed);\n\ntype Props = {\n  channel: GetChannelType,\n  currentUser: ?UserInfoType,\n};\n\nexport default withCurrentUser((props: Props) => {\n  const { channel } = props;\n\n  return (\n    <React.Fragment>\n      <ChannelThreadFeed\n        viewContext=\"channelProfile\"\n        slug={channel.slug}\n        id={channel.id}\n        setThreadsStatus={false}\n        isNewAndOwned={false}\n        channel={channel}\n      />\n    </React.Fragment>\n  );\n});\n"
  },
  {
    "path": "src/views/channel/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport querystring from 'query-string';\nimport { withRouter, type History, type Location } from 'react-router-dom';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport Head from 'src/components/head';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { getChannelByMatch } from 'shared/graphql/queries/channel/getChannel';\nimport type { GetChannelType } from 'shared/graphql/queries/channel/getChannel';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { SegmentedControl, Segment } from 'src/components/segmentedControl';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport { ChannelProfileCard } from 'src/components/entities';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport type { Dispatch } from 'redux';\nimport { ErrorBoundary } from 'src/components/error';\nimport MembersList from './components/MembersList';\nimport PostFeed from './components/PostsFeed';\nimport {\n  ViewGrid,\n  SecondaryPrimaryColumnGrid,\n  PrimaryColumn,\n  SecondaryColumn,\n} from 'src/components/layout';\nimport { SidebarSection } from 'src/views/community/style';\nimport CommunitySidebar from 'src/components/communitySidebar';\nimport { FeedsContainer } from './style';\nimport { InfoContainer } from '../community/style';\nimport { FullScreenRedirectView } from 'src/views/viewHelpers/fullScreenRedirect';\n\ntype Props = {\n  match: {\n    params: {\n      communitySlug: string,\n      channelSlug: string,\n    },\n  },\n  data: {\n    channel: GetChannelType,\n  },\n  currentUser: Object,\n  isLoading: boolean,\n  hasError: boolean,\n  dispatch: Dispatch<Object>,\n  history: History,\n  location: Location,\n};\n\nclass ChannelView extends React.Component<Props> {\n  constructor(props) {\n    super(props);\n    const { location, history } = props;\n    const { search } = location;\n    const { tab } = querystring.parse(search);\n    if (!tab)\n      history.replace({\n        ...location,\n        search: querystring.stringify({ tab: 'posts' }),\n      });\n  }\n\n  componentDidMount() {\n    if (this.props.data && this.props.data.channel) {\n      const { channel } = this.props.data;\n\n      this.props.dispatch(\n        setTitlebarProps({\n          title: `# ${channel.name}`,\n          titleIcon: (\n            <CommunityAvatar\n              isClickable={false}\n              community={channel.community}\n              size={24}\n            />\n          ),\n        })\n      );\n    }\n  }\n\n  componentDidUpdate(prevProps) {\n    const { dispatch } = this.props;\n    if (!prevProps.data.channel && this.props.data.channel) {\n      const { channel } = this.props.data;\n      dispatch(\n        setTitlebarProps({\n          title: `# ${channel.name}`,\n          titleIcon: (\n            <CommunityAvatar\n              isClickable={false}\n              community={channel.community}\n              size={24}\n            />\n          ),\n        })\n      );\n    }\n\n    if (\n      this.props.data.channel &&\n      prevProps.data.channel &&\n      this.props.data.channel.id !== prevProps.data.channel.id\n    ) {\n      const elem = document.getElementById('main');\n      if (elem) elem.scrollTop = 0;\n      const { channel } = this.props.data;\n      dispatch(\n        setTitlebarProps({\n          title: `# ${channel.name}`,\n          titleIcon: (\n            <CommunityAvatar\n              isClickable={false}\n              community={channel.community}\n              size={24}\n            />\n          ),\n        })\n      );\n      const { location, history } = this.props;\n      const { search } = location;\n      const { tab } = querystring.parse(search);\n      if (!tab)\n        history.replace({\n          ...location,\n          search: querystring.stringify({ tab: 'posts' }),\n        });\n    }\n  }\n\n  handleSegmentClick = (tab: string) => {\n    const { history, location } = this.props;\n    return history.replace({\n      ...location,\n      search: querystring.stringify({ tab }),\n    });\n  };\n\n  render() {\n    const {\n      data: { channel },\n      isLoading,\n      location,\n    } = this.props;\n    const { search } = location;\n    const { tab } = querystring.parse(search);\n    const selectedView = tab;\n    if (channel && channel.id) {\n      // at this point the view is no longer loading, has not encountered an error, and has returned a channel record\n      const { community } = channel;\n\n      // at this point the user has full permission to view the channel\n      const { title, description } = generateMetaInfo({\n        type: 'channel',\n        data: {\n          name: channel.name,\n          communityName: community.name,\n          description: channel.description,\n        },\n      });\n\n      if (community.redirect && community.website) {\n        return <FullScreenRedirectView community={community} />;\n      }\n\n      return (\n        <React.Fragment>\n          <Head\n            title={title}\n            description={description}\n            image={community.profilePhoto}\n          >\n            {community.redirect && community.noindex && (\n              <meta name=\"robots\" content=\"noindex, nofollow\" />\n            )}\n          </Head>\n\n          <ViewGrid>\n            <SecondaryPrimaryColumnGrid data-cy=\"channel-view\">\n              <SecondaryColumn>\n                <CommunitySidebar community={channel.community} />\n              </SecondaryColumn>\n\n              <PrimaryColumn>\n                <FeedsContainer>\n                  <SegmentedControl>\n                    <Segment\n                      onClick={() => this.handleSegmentClick('posts')}\n                      isActive={selectedView === 'posts'}\n                      data-cy=\"channel-posts-tab\"\n                      hideOnDesktop\n                    >\n                      Posts\n                    </Segment>\n\n                    <Segment\n                      onClick={() => this.handleSegmentClick('members')}\n                      isActive={selectedView === 'members'}\n                      hideOnDesktop\n                      data-cy=\"channel-members-tab\"\n                    >\n                      Members\n                    </Segment>\n\n                    <Segment\n                      onClick={() => this.handleSegmentClick('info')}\n                      isActive={selectedView === 'info'}\n                      data-cy=\"channel-info-tab\"\n                      hideOnDesktop\n                    >\n                      Info\n                    </Segment>\n                  </SegmentedControl>\n\n                  {selectedView === 'posts' && <PostFeed channel={channel} />}\n\n                  {selectedView === 'members' && (\n                    <ErrorBoundary>\n                      <MembersList id={channel.id} />\n                    </ErrorBoundary>\n                  )}\n\n                  {selectedView === 'info' && (\n                    <InfoContainer>\n                      <SidebarSection>\n                        <ChannelProfileCard channel={channel} />\n                      </SidebarSection>\n                    </InfoContainer>\n                  )}\n                </FeedsContainer>\n              </PrimaryColumn>\n            </SecondaryPrimaryColumnGrid>\n          </ViewGrid>\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading) {\n      return <LoadingView />;\n    }\n\n    return <ErrorView data-cy=\"channel-view-error\" />;\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  getChannelByMatch,\n  viewNetworkHandler,\n  withRouter,\n  connect()\n)(ChannelView);\n"
  },
  {
    "path": "src/views/channel/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ColumnHeading = styled.div`\n  display: flex;\n  align-items: center;\n  font-size: 18px;\n  line-height: 1;\n  font-weight: 500;\n  padding: 8px 16px 12px;\n  margin-top: 24px;\n  border-bottom: 2px solid ${theme.bg.border};\n`;\n\nexport const MessageIconContainer = styled.div`\n  color: ${theme.text.alt};\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const UserListItemContainer = styled.div`\n  border-bottom: 1px solid ${theme.bg.wash};\n`;\n\nexport const CommunityContext = styled.div`\n  display: flex;\n  margin-top: 32px;\n  margin-left: 32px;\n  display: flex;\n  align-items: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-top: 16px;\n  }\n`;\n\nexport const CommunityName = styled.h5`\n  font-size: 18px;\n  font-weight: 500;\n  margin-left: 16px;\n  color: ${theme.text.secondary};\n`;\n\nexport const ChannelName = styled.h3`\n  font-size: 24px;\n  font-weight: 600;\n  margin-top: 24px;\n  margin-bottom: 8px;\n  margin-left: 32px;\n  color: ${theme.text.default};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-left: 0;\n  }\n`;\n\nexport const ChannelDescription = styled.h4`\n  font-size: 18px;\n  font-weight: 400;\n  margin-left: 32px;\n  margin-bottom: 16px;\n  color: ${theme.text.alt};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-left: 0;\n  }\n`;\n\nexport const MetadataContainer = styled.div`\n  margin-left: 32px;\n\n  @media (max-width: ${MEDIA_BREAK}px;) {\n    margin-left: 8px;\n  }\n`;\n\nexport const FeedsContainer = styled.section`\n  display: flex;\n  flex-direction: column;\n  background: ${theme.bg.default};\n`;\n"
  },
  {
    "path": "src/views/channelSettings/components/channelMembers.js",
    "content": "//@flow\nimport React, { Component } from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { Loading } from 'src/components/loading';\nimport getChannelMembersQuery from 'shared/graphql/queries/channel/getChannelMemberConnection';\nimport type { GetChannelMemberConnectionType } from 'shared/graphql/queries/channel/getChannelMemberConnection';\nimport { FetchMoreButton } from 'src/components/threadFeed/style';\nimport ViewError from 'src/components/viewError';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { UserListItem } from 'src/components/entities';\nimport { SectionCard, SectionTitle } from 'src/components/settingsViews/style';\nimport { UserListItemContainer } from '../style';\nimport { ListContainer, ListFooter } from 'src/components/listItems/style';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype Props = {\n  data: {\n    channel: GetChannelMemberConnectionType,\n    fetchMore: Function,\n  },\n  isLoading: boolean,\n  isFetchingMore: boolean,\n  dispatch: Dispatch<Object>,\n  currentUser: ?Object,\n};\n\nclass ChannelMembers extends Component<Props> {\n  shouldComponentUpdate(nextProps: Props) {\n    const curr = this.props;\n    if (curr.data.channel && nextProps.data.channel && !curr.isFetchingMore) {\n      if (\n        curr.data.channel.memberConnection &&\n        nextProps.data.channel.memberConnection &&\n        curr.data.channel.memberConnection.edges.length ===\n          nextProps.data.channel.memberConnection.edges.length\n      ) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  render() {\n    const {\n      data: { channel, fetchMore },\n      data,\n      isLoading,\n      isFetchingMore,\n      currentUser,\n    } = this.props;\n\n    if (data && data.channel) {\n      const members =\n        channel.memberConnection &&\n        channel.memberConnection.edges.map(member => member && member.node);\n\n      return (\n        <SectionCard data-cy=\"channel-members\">\n          <SectionTitle>Members</SectionTitle>\n\n          <ListContainer>\n            {members &&\n              members.map(user => {\n                if (!user) return null;\n                return (\n                  <UserListItemContainer key={user.id}>\n                    <UserListItem\n                      userObject={user}\n                      id={user.id}\n                      name={user.name}\n                      username={user.username}\n                      isCurrentUser={currentUser && user.id === currentUser.id}\n                      profilePhoto={user.profilePhoto}\n                      avatarSize={40}\n                      description={user.description}\n                      showHoverProfile={false}\n                      messageButton={true}\n                    />\n                  </UserListItemContainer>\n                );\n              })}\n          </ListContainer>\n\n          {channel.memberConnection &&\n            channel.memberConnection.pageInfo.hasNextPage && (\n              <ListFooter>\n                <FetchMoreButton\n                  color={'brand.default'}\n                  loading={isFetchingMore}\n                  onClick={() => fetchMore()}\n                >\n                  {isFetchingMore ? 'Loading...' : 'Load more'}\n                </FetchMoreButton>\n              </ListFooter>\n            )}\n        </SectionCard>\n      );\n    }\n\n    if (isLoading) {\n      return (\n        <SectionCard>\n          <Loading />\n        </SectionCard>\n      );\n    }\n\n    return (\n      <SectionCard>\n        <ViewError />\n      </SectionCard>\n    );\n  }\n}\n\nexport default compose(\n  getChannelMembersQuery,\n  withCurrentUser,\n  viewNetworkHandler,\n  connect()\n)(ChannelMembers);\n"
  },
  {
    "path": "src/views/channelSettings/components/editForm.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport { Link } from 'react-router-dom';\nimport editChannelMutation from 'shared/graphql/mutations/channel/editChannel';\nimport type { EditChannelType } from 'shared/graphql/mutations/channel/editChannel';\nimport type { GetChannelType } from 'shared/graphql/queries/channel/getChannel';\nimport deleteChannelMutation from 'shared/graphql/mutations/channel/deleteChannel';\nimport { openModal } from 'src/actions/modals';\nimport Tooltip from 'src/components/tooltip';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport { Notice } from 'src/components/listItems/style';\nimport { PrimaryOutlineButton } from 'src/components/button';\nimport Icon from 'src/components/icon';\nimport { NullCard } from 'src/components/upsell';\nimport {\n  Input,\n  UnderlineInput,\n  TextArea,\n  Error,\n} from 'src/components/formElements';\nimport { SectionCard, SectionTitle } from 'src/components/settingsViews/style';\nimport {\n  whiteSpaceRegex,\n  oddHyphenRegex,\n} from 'src/views/viewHelpers/textValidationHelper';\nimport {\n  Form,\n  TertiaryActionContainer,\n  Description,\n  Actions,\n  GeneralNotice,\n  Location,\n} from 'src/components/editForm/style';\nimport type { Dispatch } from 'redux';\n\ntype State = {\n  name: string,\n  nameError: boolean,\n  slug: string,\n  description: ?string,\n  descriptionError: boolean,\n  isPrivate: boolean,\n  channelId: string,\n  channelData: Object,\n  isLoading: boolean,\n};\n\ntype Props = {\n  editChannel: Function,\n  dispatch: Dispatch<Object>,\n  channel: GetChannelType,\n};\nclass ChannelWithData extends React.Component<Props, State> {\n  constructor(props) {\n    super(props);\n\n    const { channel } = this.props;\n\n    this.state = {\n      name: channel.name,\n      nameError: false,\n      slug: channel.slug,\n      description: channel.description,\n      descriptionError: false,\n      isPrivate: channel.isPrivate || false,\n      channelId: channel.id,\n      channelData: channel,\n      isLoading: false,\n    };\n  }\n\n  handleChange = e => {\n    const key = e.target.id;\n    const value = e.target.value;\n    const { isPrivate } = this.state;\n\n    const newState = {};\n    // checkboxes should reverse the value\n    if (key === 'isPrivate') {\n      newState[key] = !isPrivate;\n    } else {\n      newState[key] = value;\n\n      let hasInvalidChars = value.search(whiteSpaceRegex) >= 0;\n      let hasOddHyphens = value.search(oddHyphenRegex) >= 0;\n      this.updateStateOnError(newState, key, hasInvalidChars || hasOddHyphens);\n    }\n\n    this.setState(prevState => {\n      return Object.assign({}, prevState, {\n        ...newState,\n      });\n    });\n  };\n\n  updateStateOnError(state, key, setError) {\n    if (key === 'name') {\n      state['nameError'] = setError;\n    } else {\n      state['descriptionError'] = setError;\n    }\n  }\n\n  save = e => {\n    e.preventDefault();\n    const { name, slug, description, isPrivate, channelId } = this.state;\n    const input = {\n      name,\n      slug,\n      description,\n      isPrivate,\n      channelId,\n    };\n\n    this.setState({\n      isLoading: true,\n    });\n\n    // if privacy changed in this edit\n    if (this.props.channel.isPrivate !== isPrivate) {\n    }\n\n    this.props\n      .editChannel(input)\n      .then(({ data }: EditChannelType) => {\n        const { editChannel: channel } = data;\n\n        this.setState({\n          isLoading: false,\n        });\n\n        // the mutation returns a channel object. if it exists,\n        if (channel !== undefined) {\n          this.props.dispatch(addToastWithTimeout('success', 'Channel saved!'));\n        }\n        return;\n      })\n      .catch(err => {\n        this.setState({\n          isLoading: false,\n        });\n\n        this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  triggerDeleteChannel = (e, channelId) => {\n    e.preventDefault();\n    const { name, channelData } = this.state;\n    const message = (\n      <div>\n        <p>\n          Are you sure you want to delete{' '}\n          <b>\n            {channelData.community.name}/{name}\n          </b>\n          ?\n        </p>\n        <p>All conversations posted in this channel will be deleted.</p>\n        <p>\n          All messages, reactions, and media shared in this channel will be\n          deleted.\n        </p>\n        <p>\n          <b>This cannot be undone.</b>\n        </p>\n      </div>\n    );\n\n    return this.props.dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: channelId,\n        entity: 'channel',\n        message,\n        redirect: `/${channelData.community.slug}`,\n      })\n    );\n  };\n\n  render() {\n    const {\n      name,\n      nameError,\n      slug,\n      description,\n      descriptionError,\n      isPrivate,\n      isLoading,\n    } = this.state;\n    const { channel } = this.props;\n\n    if (!channel) {\n      return (\n        <NullCard\n          bg=\"channel\"\n          heading={\"This channel doesn't exist yet.\"}\n          copy={'Want to make it?'}\n        >\n          {/* TODO: wire up button */}\n          <PrimaryOutlineButton>Create</PrimaryOutlineButton>\n        </NullCard>\n      );\n    } else {\n      return (\n        <SectionCard>\n          <Location>\n            <Link to={`/${channel.community.slug}/${channel.slug}`}>\n              View Channel\n            </Link>\n          </Location>\n          <SectionTitle>Channel Settings</SectionTitle>\n          <Form onSubmit={this.save}>\n            <Input\n              defaultValue={name}\n              id=\"name\"\n              onChange={this.handleChange}\n              dataCy=\"channel-name-input\"\n            >\n              Name\n            </Input>\n            {nameError && (\n              <Error>Channel name can`t have invalid characters.</Error>\n            )}\n            <UnderlineInput defaultValue={slug} disabled>\n              {`URL: /${channel.community.slug}/`}\n            </UnderlineInput>\n            <TextArea\n              id=\"description\"\n              defaultValue={description}\n              onChange={this.handleChange}\n              dataCy=\"channel-description-input\"\n            >\n              Description\n            </TextArea>\n            {descriptionError && (\n              <Error>\n                Oops, there may be some invalid characters - try fixing that up.\n              </Error>\n            )}\n            {/* {slug !== 'general' &&\n              <Checkbox\n                id=\"isPrivate\"\n                checked={isPrivate}\n                onChange={this.handleChange}\n              >\n                Private channel\n              </Checkbox>} */}\n            {isPrivate ? (\n              <Description>\n                Only channel members can see the threads, messages, and members\n                in this channel. You can manually approve users who request to\n                join this channel.\n              </Description>\n            ) : channel.community.isPrivate ? (\n              <Description>\n                Members in your private community will be able to join this\n                channel, post threads and messages, and will be able to see\n                other members.\n              </Description>\n            ) : (\n              <Description>\n                Anyone on Spectrum can join this channel, post threads and\n                messages, and will be able to see other members.\n              </Description>\n            )}\n\n            {// if the user is moving from private to public\n            this.props.channel.isPrivate && !isPrivate && (\n              <Notice>\n                When a private channel is made public all pending users will be\n                added as members of the channel. Blocked users will remain\n                blocked from viewing all content in this channel but in the\n                future any new person will be able to join.\n              </Notice>\n            )}\n\n            <Actions>\n              <PrimaryOutlineButton\n                onClick={this.save}\n                disabled={nameError || descriptionError}\n                loading={isLoading}\n                data-cy=\"save-button\"\n              >\n                {isLoading ? 'Saving...' : 'Save'}\n              </PrimaryOutlineButton>\n              {slug !== 'general' && (\n                <TertiaryActionContainer>\n                  <Tooltip content={`Delete ${name}`}>\n                    <span>\n                      <Icon\n                        glyph=\"delete\"\n                        color=\"text.placeholder\"\n                        hoverColor=\"warn.alt\"\n                        onClick={e => this.triggerDeleteChannel(e, channel.id)}\n                        data-cy=\"delete-channel-button\"\n                      />\n                    </span>\n                  </Tooltip>\n                </TertiaryActionContainer>\n              )}\n            </Actions>\n\n            {slug === 'general' && (\n              <GeneralNotice>\n                The General channel is the default channel for your community.\n                It can’t be deleted or private, but you can still change the\n                name and description.\n              </GeneralNotice>\n            )}\n          </Form>\n        </SectionCard>\n      );\n    }\n  }\n}\n\nconst Channel = compose(\n  deleteChannelMutation,\n  editChannelMutation,\n  withRouter\n)(ChannelWithData);\nexport default connect()(Channel);\n"
  },
  {
    "path": "src/views/channelSettings/components/overview.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { SectionsContainer, Column } from 'src/components/settingsViews/style';\nimport EditForm from './editForm';\nimport ChannelMembers from './channelMembers';\nimport { ErrorBoundary, SettingsFallback } from 'src/components/error';\n\ntype Props = {\n  community: Object,\n  channel: Object,\n  communitySlug: string,\n};\nclass Overview extends React.Component<Props> {\n  render() {\n    const { channel } = this.props;\n\n    return (\n      <SectionsContainer data-cy=\"channel-overview\">\n        <Column>\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <EditForm channel={channel} />\n          </ErrorBoundary>\n        </Column>\n\n        <Column>\n          {channel.isPrivate && (\n            <span>\n              <ErrorBoundary fallbackComponent={SettingsFallback}>\n                <ChannelMembers channel={channel} id={channel.id} />\n              </ErrorBoundary>\n            </span>\n          )}\n\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            {!channel.isPrivate && (\n              <ChannelMembers channel={channel} id={channel.id} />\n            )}\n          </ErrorBoundary>\n        </Column>\n      </SectionsContainer>\n    );\n  }\n}\n\nexport default Overview;\n"
  },
  {
    "path": "src/views/channelSettings/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter } from 'react-router';\nimport { connect } from 'react-redux';\nimport { getChannelByMatch } from 'shared/graphql/queries/channel/getChannel';\nimport type { GetChannelType } from 'shared/graphql/queries/channel/getChannel';\nimport Head from 'src/components/head';\nimport { Upsell404Channel } from 'src/components/upsell';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport ViewError from 'src/components/viewError';\nimport { View } from 'src/components/settingsViews/style';\nimport Header from 'src/components/settingsViews/header';\nimport Overview from './components/overview';\nimport type { Dispatch } from 'redux';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport { ViewGrid } from 'src/components/layout';\nimport { setTitlebarProps } from 'src/actions/titlebar';\n\ntype Props = {\n  data: {\n    channel: GetChannelType,\n  },\n  location: Object,\n  match: Object,\n  isLoading: boolean,\n  hasError: boolean,\n  dispatch: Dispatch<Object>,\n  history: Object,\n};\n\nclass ChannelSettings extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n\n    dispatch(\n      setTitlebarProps({\n        title: 'Settings',\n      })\n    );\n  }\n\n  render() {\n    const {\n      data: { channel },\n      match,\n      location,\n      isLoading,\n    } = this.props;\n    const { communitySlug } = match.params;\n\n    // this is hacky, but will tell us if we're viewing analytics or the root settings view\n    const pathname = location.pathname;\n    const lastIndex = pathname.lastIndexOf('/');\n    const activeTab = pathname.substr(lastIndex + 1);\n\n    if (channel && channel.id) {\n      const { isModerator, isOwner } = channel.channelPermissions;\n      const userHasPermissions =\n        isOwner ||\n        isModerator ||\n        channel.community.communityPermissions.isOwner ||\n        channel.community.communityPermissions.isModerator;\n\n      if (!userHasPermissions) {\n        return (\n          <React.Fragment>\n            <ViewError\n              heading={'You don’t have permission to manage this channel.'}\n              subheading={`Head back to the ${\n                channel.community.name\n              } community to get back on track.`}\n            >\n              <Upsell404Channel community={communitySlug} />\n            </ViewError>\n          </React.Fragment>\n        );\n      }\n\n      const ActiveView = () => {\n        switch (activeTab) {\n          case 'settings':\n            return (\n              <Overview\n                community={channel.community}\n                channel={channel}\n                communitySlug={communitySlug}\n              />\n            );\n          default:\n            return null;\n        }\n      };\n\n      const subheading = {\n        to: `/${channel.community.slug}/settings`,\n        label: `Return to ${channel.community.name} settings`,\n      };\n\n      return (\n        <React.Fragment>\n          <Head\n            title={`${channel.name} settings`}\n            description={`Settings for the ${channel.name} channel in ${\n              channel.community.name\n            }`}\n          />\n          <ViewGrid>\n            <View>\n              <Header\n                subheading={subheading}\n                heading={`${channel.name} Settings ${\n                  channel.isArchived ? '(Archived)' : ''\n                }`}\n              />\n              <ActiveView />\n            </View>\n          </ViewGrid>\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading) {\n      return <LoadingView />;\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  // $FlowIssue\n  connect(),\n  withRouter,\n  getChannelByMatch,\n  viewNetworkHandler\n)(ChannelSettings);\n"
  },
  {
    "path": "src/views/channelSettings/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\n\nexport const TokenInputWrapper = styled.div`\n  position: relative;\n  cursor: pointer;\n\n  input {\n    cursor: pointer;\n  }\n\n  &:after {\n    content: 'Copy link';\n    position: absolute;\n    right: 8px;\n    top: 50%;\n    transform: translateY(-50%);\n    font-size: 10px;\n    text-transform: uppercase;\n    color: ${theme.text.reverse};\n    background: ${theme.text.alt};\n    padding: 4px 8px;\n    border-radius: 4px;\n    font-weight: 700;\n  }\n\n  &:hover {\n    &:after {\n      background: ${theme.success.alt};\n    }\n  }\n`;\n\nexport const MessageIconContainer = styled.div`\n  color: ${theme.text.alt};\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  cursor: pointer;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const UserListItemContainer = styled.div`\n  border-bottom: 1px solid ${theme.bg.wash};\n\n  &:last-of-type {\n    border-bottom: none;\n  }\n`;\n"
  },
  {
    "path": "src/views/community/components/channelsList.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Route, Link, withRouter, type Location } from 'react-router-dom';\nimport compose from 'recompose/compose';\nimport type { Dispatch } from 'redux';\nimport { ErrorBoundary } from 'src/components/error';\nimport Icon from 'src/components/icon';\nimport { Loading } from 'src/components/loading';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport getCommunityChannels from 'shared/graphql/queries/community/getCommunityChannelConnection';\nimport type { GetCommunityChannelConnectionType } from 'shared/graphql/queries/community/getCommunityChannelConnection';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Tooltip from 'src/components/tooltip';\nimport { ChannelListItem } from 'src/components/entities';\nimport { WhiteIconButton } from 'src/components/button';\nimport { SidebarSectionHeader, SidebarSectionHeading, List } from '../style';\nimport {\n  Row,\n  Content,\n  Label,\n  Actions,\n} from 'src/components/entities/listItems/style';\n\ntype Props = {\n  data: {\n    community: GetCommunityChannelConnectionType,\n  },\n  isLoading: boolean,\n  dispatch: Dispatch<Object>,\n  currentUser: Object,\n  communitySlug: string,\n  location: Location,\n};\n\nclass Component extends React.Component<Props> {\n  sortChannels = (array: Array<any>): Array<?any> => {\n    if (!array || array.length === 0) return [];\n\n    const generalChannel = array.find(channel => channel.slug === 'general');\n    const withoutGeneral = array.filter(channel => channel.slug !== 'general');\n    const sortedWithoutGeneral = withoutGeneral.sort((a, b) => {\n      if (a.slug < b.slug) return -1;\n      if (a.slug > b.slug) return 1;\n      return 0;\n    });\n    if (generalChannel) {\n      sortedWithoutGeneral.unshift(generalChannel);\n      return sortedWithoutGeneral;\n    } else {\n      return sortedWithoutGeneral;\n    }\n  };\n\n  render() {\n    const {\n      isLoading,\n      currentUser,\n      data: { community },\n      location,\n    } = this.props;\n\n    if (isLoading) {\n      return (\n        <React.Fragment>\n          <SidebarSectionHeader>\n            <SidebarSectionHeading>Channels</SidebarSectionHeading>\n          </SidebarSectionHeader>\n          <Loading style={{ padding: '32px' }} />\n        </React.Fragment>\n      );\n    }\n\n    if (community && community.channelConnection) {\n      const { isOwner } = community.communityPermissions;\n      const channels = community.channelConnection.edges\n        .map(channel => channel && channel.node)\n        .filter(channel => {\n          if (!channel) return null;\n          if (channel.isArchived) return null;\n          if (channel.isPrivate && !channel.channelPermissions.isMember)\n            return null;\n\n          return channel;\n        })\n        .filter(channel => channel && !channel.channelPermissions.isBlocked);\n\n      const sortedChannels = this.sortChannels(channels);\n\n      return (\n        <React.Fragment>\n          <SidebarSectionHeader>\n            <SidebarSectionHeading>Channels</SidebarSectionHeading>\n            {isOwner && (\n              <Tooltip content={'Manage channels'}>\n                <span>\n                  <WhiteIconButton to={`/${community.slug}/settings`}>\n                    <Icon glyph={'settings'} size={24} />\n                  </WhiteIconButton>\n                </span>\n              </Tooltip>\n            )}\n          </SidebarSectionHeader>\n\n          <List data-cy=\"channel-list\">\n            <Route exact path={`/${community.slug}`}>\n              {({ match }) => (\n                <Link to={`/${community.slug}?tab=posts`}>\n                  <Row\n                    isActive={\n                      !!match && location.search.indexOf('tab=posts') > -1\n                    }\n                  >\n                    <Content>\n                      <Label>\n                        # All{' '}\n                        {currentUser && community.communityPermissions.isMember\n                          ? 'your '\n                          : ' '}\n                        channels\n                      </Label>\n                    </Content>\n                    <Actions>\n                      <Icon glyph=\"view-forward\" size={24} />\n                    </Actions>\n                  </Row>\n                </Link>\n              )}\n            </Route>\n            {sortedChannels.map(channel => {\n              if (!channel) return null;\n              return (\n                <ErrorBoundary key={channel.id}>\n                  <Route path={`/${channel.community.slug}/${channel.slug}`}>\n                    {({ match }) => (\n                      <ChannelListItem\n                        channel={channel}\n                        name={channel.name}\n                        isActive={!!match}\n                      />\n                    )}\n                  </Route>\n                </ErrorBoundary>\n              );\n            })}\n          </List>\n        </React.Fragment>\n      );\n    }\n\n    return null;\n  }\n}\n\nexport const ChannelsList = compose(\n  getCommunityChannels,\n  viewNetworkHandler,\n  withCurrentUser,\n  withRouter,\n  connect()\n)(Component);\n"
  },
  {
    "path": "src/views/community/components/communityFeeds.js",
    "content": "// @flow\nimport React, { useEffect, useLayoutEffect } from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter, type History, type Location } from 'react-router-dom';\nimport querystring from 'query-string';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport MembersList from './membersList';\nimport { TeamMembersList } from './teamMembersList';\nimport { MobileCommunityInfoActions } from './mobileCommunityInfoActions';\nimport { ChannelsList } from './channelsList';\nimport { CommunityMeta } from 'src/components/entities/profileCards/components/communityMeta';\nimport MessagesSubscriber from 'src/views/thread/components/messagesSubscriber';\nimport { PostsFeeds } from './postsFeeds';\nimport { SegmentedControl, Segment } from 'src/components/segmentedControl';\nimport { useAppScroller } from 'src/hooks/useAppScroller';\nimport usePrevious from 'src/hooks/usePrevious';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { FeedsContainer, SidebarSection, InfoContainer } from '../style';\n\ntype Props = {\n  community: CommunityInfoType,\n  location: Location,\n  history: History,\n  currentUser: UserInfoType,\n};\n\nconst Feeds = (props: Props) => {\n  const { community, location, history } = props;\n  const { search } = location;\n  const { tab } = querystring.parse(search);\n\n  const changeTab = (tab: string) => {\n    return history.replace({\n      ...location,\n      search: querystring.stringify({ tab }),\n    });\n  };\n\n  const handleTabRedirect = () => {\n    const { search } = location;\n    const { tab } = querystring.parse(search);\n\n    if (!tab) {\n      changeTab('posts');\n    }\n\n    if (tab === 'chat' && !community.watercoolerId) {\n      changeTab('posts');\n    }\n  };\n\n  useEffect(() => {\n    handleTabRedirect();\n  }, [tab]);\n\n  const renderFeed = () => {\n    switch (tab) {\n      case 'chat': {\n        if (!community.watercoolerId) return null;\n        return (\n          <React.Fragment>\n            <MessagesSubscriber isWatercooler id={community.watercoolerId} />\n          </React.Fragment>\n        );\n      }\n      case 'posts': {\n        return <PostsFeeds community={community} />;\n      }\n      case 'members': {\n        return (\n          <MembersList\n            id={community.id}\n            filter={{ isMember: true, isBlocked: false }}\n          />\n        );\n      }\n      case 'info': {\n        return (\n          <InfoContainer>\n            <SidebarSection style={{ paddingBottom: '16px' }}>\n              <CommunityMeta community={community} />\n            </SidebarSection>\n\n            <SidebarSection>\n              <TeamMembersList\n                community={community}\n                id={community.id}\n                first={100}\n                filter={{ isModerator: true, isOwner: true }}\n              />\n            </SidebarSection>\n\n            <SidebarSection>\n              <ChannelsList id={community.id} communitySlug={community.slug} />\n            </SidebarSection>\n\n            <SidebarSection>\n              <MobileCommunityInfoActions community={community} />\n            </SidebarSection>\n          </InfoContainer>\n        );\n      }\n      default:\n        return null;\n    }\n  };\n\n  /*\n    Segments preserve scroll position when switched by default. We dont want\n    this behavior - if you change the feed (eg threads => members) you should\n    always end up at the top of the list. However, if the next active segment\n    is chat, we want that scrolled to the bottom by default, since the behavior\n    of chat is to scroll up for older messages\n  */\n  const { scrollToBottom, scrollToTop, scrollTo, ref } = useAppScroller();\n  const lastTab = usePrevious(tab);\n  const lastScroll = ref ? ref.scrollTop : null;\n  useLayoutEffect(() => {\n    if (lastTab && lastTab !== tab && lastScroll) {\n      sessionStorage.setItem(`last-scroll-${lastTab}`, lastScroll.toString());\n    }\n    const stored =\n      sessionStorage && sessionStorage.getItem(`last-scroll-${tab}`);\n    if (tab === 'chat') {\n      scrollToBottom();\n      // If the user goes back, restore the scroll position\n    } else if (stored && history.action === 'POP') {\n      scrollTo(Number(stored));\n    } else {\n      scrollToTop();\n    }\n  }, [tab]);\n\n  // Store the last scroll position on unmount\n  useLayoutEffect(() => {\n    return () => {\n      const elem = document.getElementById('main');\n      if (!elem) return;\n      sessionStorage.setItem(`last-scroll-${tab}`, elem.scrollTop.toString());\n    };\n  }, []);\n\n  const segments = ['posts', 'members', 'info'];\n  if (community.watercoolerId) segments.splice(1, 0, 'chat');\n\n  // if the community being viewed changes, and the previous community had\n  // a watercooler but the next one doesn't, select the posts tab on the new one\n  useEffect(() => {\n    handleTabRedirect();\n  }, [community.slug]);\n\n  return (\n    <FeedsContainer data-cy=\"community-view-content\">\n      <SegmentedControl>\n        {segments.map(segment => {\n          return (\n            <Segment\n              key={segment}\n              hideOnDesktop\n              isActive={segment === tab}\n              onClick={() => changeTab(segment)}\n            >\n              {segment[0].toUpperCase() + segment.substr(1)}\n            </Segment>\n          );\n        })}\n      </SegmentedControl>\n      {renderFeed()}\n    </FeedsContainer>\n  );\n};\n\nexport const CommunityFeeds = compose(\n  withRouter,\n  withCurrentUser\n)(Feeds);\n"
  },
  {
    "path": "src/views/community/components/membersList.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport { ErrorBoundary } from 'src/components/error';\nimport { deduplicateChildren } from 'src/components/infiniteScroll/deduplicateChildren';\nimport getCommunityMembersQuery, {\n  type GetCommunityMembersType,\n} from 'shared/graphql/queries/community/getCommunityMembers';\nimport { Card } from 'src/components/card';\nimport NextPageButton from 'src/components/nextPageButton';\nimport { Loading } from 'src/components/loading';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport ViewError from 'src/components/viewError';\nimport { UserListItem } from 'src/components/entities';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype Props = {\n  data: {\n    community: GetCommunityMembersType,\n    fetchMore: Function,\n    networkStatus: number,\n  },\n  dispatch: Dispatch<Object>,\n  isLoading: boolean,\n  isFetchingMore: boolean,\n  history: Object,\n  currentUser: ?Object,\n};\n\nclass MembersList extends React.Component<Props> {\n  shouldComponentUpdate(nextProps) {\n    const curr = this.props;\n    // fetching more\n    if (curr.data.networkStatus === 7 && nextProps.data.networkStatus === 3)\n      return false;\n    return true;\n  }\n\n  render() {\n    const {\n      data: { community },\n      isLoading,\n      currentUser,\n      isFetchingMore,\n    } = this.props;\n\n    if (isLoading) {\n      return <Loading />;\n    }\n\n    if (community) {\n      const { edges: members } = community.members;\n      const nodes = members.map(member => member && member.node);\n      const uniqueNodes = deduplicateChildren(nodes, 'id');\n      const hasNextPage = community.members.pageInfo.hasNextPage;\n\n      return (\n        <React.Fragment>\n          {uniqueNodes.map(node => {\n            if (!node) return null;\n\n            const { user } = node;\n            return (\n              <ErrorBoundary key={user.id}>\n                <UserListItem\n                  userObject={user}\n                  name={user.name}\n                  username={user.username}\n                  description={user.description}\n                  profilePhoto={user.profilePhoto}\n                  isCurrentUser={currentUser && user.id === currentUser.id}\n                  avatarSize={40}\n                  showHoverProfile={false}\n                  messageButton={currentUser && user.id !== currentUser.id}\n                />\n              </ErrorBoundary>\n            );\n          })}\n          {hasNextPage && (\n            <NextPageButton\n              isFetchingMore={isFetchingMore}\n              fetchMore={this.props.data.fetchMore}\n              bottomOffset={-100}\n            >\n              Load more members\n            </NextPageButton>\n          )}\n        </React.Fragment>\n      );\n    }\n\n    return (\n      <Card>\n        <ViewError\n          refresh\n          heading={'We weren’t able to fetch the members of this community.'}\n        />\n      </Card>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  withCurrentUser,\n  getCommunityMembersQuery,\n  viewNetworkHandler,\n  connect()\n)(MembersList);\n"
  },
  {
    "path": "src/views/community/components/mobileCommunityInfoActions.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport type { Dispatch } from 'redux';\nimport { connect } from 'react-redux';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport { openModal } from 'src/actions/modals';\nimport Icon from 'src/components/icon';\nimport {\n  SidebarSectionHeader,\n  SidebarSectionHeading,\n  List,\n  ListItem,\n  ListItemLink,\n  ListItemLabel,\n  ListItemContent,\n  NameWarn,\n} from '../style';\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  community: CommunityInfoType,\n};\n\nconst Component = (props: Props) => {\n  const { community, dispatch } = props;\n  const { communityPermissions } = community;\n  const { isMember, isOwner, isModerator } = communityPermissions;\n  const isTeamMember = isOwner || isModerator;\n\n  const leaveCommunity = () =>\n    dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: community.id,\n        entity: 'team-member-leaving-community',\n        message: 'Are you sure you want to leave this community?',\n        buttonLabel: 'Leave Community',\n      })\n    );\n\n  if (!isMember && !isOwner && !isModerator) return null;\n\n  return (\n    <React.Fragment>\n      <SidebarSectionHeader>\n        <SidebarSectionHeading>More</SidebarSectionHeading>\n      </SidebarSectionHeader>\n\n      <List>\n        {isTeamMember && (\n          <ListItemLink to={`/${community.slug}/settings`}>\n            <ListItemContent>\n              <ListItemLabel>Community settings</ListItemLabel>\n            </ListItemContent>\n            <Icon glyph=\"view-forward\" size={24} />\n          </ListItemLink>\n        )}\n\n        {!isOwner && isMember && (\n          <ListItem onClick={leaveCommunity}>\n            <ListItemContent>\n              <NameWarn>Leave community</NameWarn>\n            </ListItemContent>\n            <Icon glyph=\"door-leave\" size={24} />\n          </ListItem>\n        )}\n      </List>\n    </React.Fragment>\n  );\n};\n\nexport const MobileCommunityInfoActions = compose(connect())(Component);\n"
  },
  {
    "path": "src/views/community/components/postsFeeds.js",
    "content": "// @flow\nimport React, { useState } from 'react';\nimport compose from 'recompose/compose';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport getCommunityThreads from 'shared/graphql/queries/community/getCommunityThreadConnection';\nimport ThreadFeed from 'src/components/threadFeed';\nimport Select from 'src/components/select';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { PostsFeedsSelectorContainer } from '../style';\n\nconst CommunityThreadFeed = compose(getCommunityThreads)(ThreadFeed);\n\ntype Props = {\n  community: GetCommunityType,\n  currentUser: ?UserInfoType,\n};\n\nexport const PostsFeeds = withCurrentUser((props: Props) => {\n  const { community, currentUser } = props;\n  const defaultFeed = !currentUser ? 'trending' : 'latest';\n  const [activeFeed, setActiveFeed] = useState(defaultFeed);\n\n  return (\n    <React.Fragment>\n      <PostsFeedsSelectorContainer>\n        <Select\n          value={activeFeed}\n          onChange={e => setActiveFeed(e.target.value)}\n        >\n          <option key=\"latest\" value=\"latest\">\n            Latest\n          </option>\n          <option key=\"trending\" value=\"trending\">\n            Popular\n          </option>\n        </Select>\n      </PostsFeedsSelectorContainer>\n\n      <CommunityThreadFeed\n        viewContext=\"communityProfile\"\n        slug={community.slug}\n        id={community.id}\n        setThreadsStatus={false}\n        isNewAndOwned={false}\n        community={community}\n        pinnedThreadId={community.pinnedThreadId}\n        sort={activeFeed}\n      />\n    </React.Fragment>\n  );\n});\n"
  },
  {
    "path": "src/views/community/components/teamMembersList.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport { ErrorBoundary } from 'src/components/error';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport getCommunityMembersQuery, {\n  type GetCommunityMembersType,\n} from 'shared/graphql/queries/community/getCommunityMembers';\nimport { Loading } from 'src/components/loading';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport { UserListItem } from 'src/components/entities';\nimport Icon from 'src/components/icon';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Tooltip from 'src/components/tooltip';\nimport { WhiteIconButton } from 'src/components/button';\nimport { List, SidebarSectionHeader, SidebarSectionHeading } from '../style';\n\ntype Props = {\n  ...$Exact<ViewNetworkHandlerType>,\n  currentUser: ?UserInfoType,\n  community: GetCommunityType,\n  data: {\n    community: GetCommunityMembersType,\n  },\n};\n\nclass Component extends React.Component<Props> {\n  render() {\n    const {\n      isLoading,\n      hasError,\n      queryVarIsChanging,\n      data,\n      currentUser,\n    } = this.props;\n\n    const isOwner = this.props.community.communityPermissions.isOwner;\n\n    if (isLoading || queryVarIsChanging)\n      return (\n        <React.Fragment>\n          <SidebarSectionHeader>\n            <SidebarSectionHeading>Team</SidebarSectionHeading>\n          </SidebarSectionHeader>\n          <Loading style={{ padding: '32px' }} />\n        </React.Fragment>\n      );\n\n    if (hasError) return null;\n\n    const { community } = data;\n\n    const { edges: members } = community.members;\n    const nodes = members\n      .map(member => member && member.node)\n      .filter(node => node && (node.isOwner || node.isModerator))\n      .filter(Boolean);\n\n    return (\n      <React.Fragment>\n        <SidebarSectionHeader>\n          <SidebarSectionHeading>Team</SidebarSectionHeading>\n          {isOwner && (\n            <Tooltip content={'Manage team'}>\n              <span>\n                <WhiteIconButton to={`/${community.slug}/settings/members`}>\n                  <Icon glyph={'settings'} size={24} />\n                </WhiteIconButton>\n              </span>\n            </Tooltip>\n          )}\n        </SidebarSectionHeader>\n\n        <List>\n          {nodes.map(({ user }) => (\n            <ErrorBoundary key={user.id}>\n              <UserListItem\n                userObject={user}\n                name={user.name}\n                username={user.username}\n                profilePhoto={user.profilePhoto}\n                isCurrentUser={currentUser && user.id === currentUser.id}\n                avatarSize={40}\n                showHoverProfile={false}\n                messageButton={currentUser && user.id !== currentUser.id}\n              />\n            </ErrorBoundary>\n          ))}\n        </List>\n      </React.Fragment>\n    );\n  }\n}\n\nexport const TeamMembersList = compose(\n  withRouter,\n  withCurrentUser,\n  getCommunityMembersQuery,\n  viewNetworkHandler,\n  connect()\n)(Component);\n"
  },
  {
    "path": "src/views/community/containers/privateCommunity.js",
    "content": "// @flow\nimport React from 'react';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport { Emoji, Heading, Description, PrivateCommunityWrapper } from '../style';\nimport { ViewGrid, CenteredGrid } from 'src/components/layout';\n\ntype Props = {\n  community: GetCommunityType,\n};\n\nexport const PrivateCommunity = (props: Props) => {\n  const { community } = props;\n  const { communityPermissions } = community;\n  const { isPending } = communityPermissions;\n\n  const heading = isPending\n    ? 'Your request to join is pending'\n    : 'This community is private';\n\n  const description = isPending\n    ? 'Your request to join this community is pending. The owners have been notified, and you will be notified if your request is approved.'\n    : 'You can request to join this community below. The owners will be notified of your request, and you will be notified if your request is approved.';\n\n  return (\n    <ViewGrid data-cy=\"community-view-private\">\n      <CenteredGrid>\n        <PrivateCommunityWrapper>\n          <Emoji role=\"img\" aria-label=\"Private\">\n            🔑\n          </Emoji>\n          <Heading>{heading}</Heading>\n          <Description>{description}</Description>\n        </PrivateCommunityWrapper>\n      </CenteredGrid>\n    </ViewGrid>\n  );\n};\n"
  },
  {
    "path": "src/views/community/containers/signedIn.js",
    "content": "// @flow\nimport React, { useState, useEffect } from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport { withRouter, type Location } from 'react-router-dom';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Head from 'src/components/head';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport { CommunityFeeds } from '../components/communityFeeds';\nimport {\n  ViewGrid,\n  SecondaryPrimaryColumnGrid,\n  PrimaryColumn,\n  SecondaryColumn,\n} from 'src/components/layout';\nimport Sidebar from 'src/components/communitySidebar';\nimport { FullScreenRedirectView } from 'src/views/viewHelpers/fullScreenRedirect';\n\ntype Props = {\n  community: CommunityInfoType,\n  currentUser: ?UserInfoType,\n  dispatch: Dispatch<Object>,\n  location: Location,\n};\n\nconst Component = (props: Props) => {\n  const { community, dispatch, location } = props;\n\n  const [metaInfo, setMetaInfo] = useState(\n    generateMetaInfo({\n      type: 'community',\n      data: {\n        name: community.name,\n        description: community.description,\n      },\n    })\n  );\n\n  useEffect(() => {\n    setMetaInfo(\n      generateMetaInfo({\n        type: 'community',\n        data: {\n          name: `${community.name} community`,\n          description: community.description,\n        },\n      })\n    );\n    dispatch(\n      setTitlebarProps({\n        title: community.name,\n        titleIcon: (\n          <CommunityAvatar\n            isClickable={false}\n            community={community}\n            size={24}\n          />\n        ),\n      })\n    );\n  }, [community.id]);\n\n  useEffect(() => {\n    dispatch(\n      setTitlebarProps({\n        title: community.name,\n        titleIcon: (\n          <CommunityAvatar\n            isClickable={false}\n            community={community}\n            size={24}\n          />\n        ),\n      })\n    );\n  }, [location]);\n\n  const { title, description } = metaInfo;\n\n  if (community.redirect && community.website) {\n    return <FullScreenRedirectView community={community} />;\n  }\n\n  return (\n    <React.Fragment>\n      <Head\n        title={title}\n        description={description}\n        image={community.profilePhoto}\n      >\n        {community.redirect && community.noindex && (\n          <meta name=\"robots\" content=\"noindex, nofollow\" />\n        )}\n      </Head>\n\n      <ViewGrid data-cy=\"community-view\">\n        <SecondaryPrimaryColumnGrid>\n          <SecondaryColumn>\n            <Sidebar community={community} />\n          </SecondaryColumn>\n\n          <PrimaryColumn>\n            <CommunityFeeds community={community} />\n          </PrimaryColumn>\n        </SecondaryPrimaryColumnGrid>\n      </ViewGrid>\n    </React.Fragment>\n  );\n};\n\nexport const SignedIn = compose(\n  withCurrentUser,\n  withRouter,\n  connect()\n)(Component);\n"
  },
  {
    "path": "src/views/community/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport type { Match } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport {\n  getCommunityByMatch,\n  type GetCommunityType,\n} from 'shared/graphql/queries/community/getCommunity';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Login from 'src/views/login';\nimport { CLIENT_URL } from 'src/api/constants';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport { SignedIn } from './containers/signedIn';\nimport { PrivateCommunity } from './containers/privateCommunity';\n\ntype Props = {\n  ...$Exact<ViewNetworkHandlerType>,\n  currentUser: ?UserInfoType,\n  match: Match,\n  data: {\n    community: GetCommunityType,\n  },\n};\n\nconst CommunityView = (props: Props) => {\n  const { isLoading, queryVarIsChanging, hasError, currentUser } = props;\n\n  if (isLoading || queryVarIsChanging) return <LoadingView />;\n\n  const { community } = props.data;\n\n  if (!community || hasError) return <ErrorView />;\n\n  const { isPrivate, communityPermissions } = community;\n  const { isMember, isBlocked } = communityPermissions;\n\n  if (currentUser && !isBlocked && !isPrivate && !isMember)\n    return <SignedIn community={community} />;\n\n  if (isBlocked) return <ErrorView />;\n\n  if (isPrivate && !currentUser) {\n    const redirectPath = `${CLIENT_URL}/${community.slug}`;\n    return <Login redirectPath={redirectPath} />;\n  }\n\n  if (isPrivate && currentUser && !isMember) {\n    return <PrivateCommunity community={community} />;\n  }\n\n  return <SignedIn community={community} />;\n};\n\nexport default compose(\n  withCurrentUser,\n  getCommunityByMatch,\n  viewNetworkHandler,\n  connect()\n)(CommunityView);\n"
  },
  {
    "path": "src/views/community/style.js",
    "content": "// @flow\nimport styled, { css } from 'styled-components';\nimport theme from 'shared/theme';\nimport { Link } from 'react-router-dom';\nimport { Truncate } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\nimport { CardStyles } from 'src/views/viewHelpers';\n\nconst listItemStyles = css`\n  padding: 12px 12px 12px 16px;\n  display: flex;\n  justify-content: space-between;\n  border-bottom: 1px solid ${theme.bg.divider};\n\n  &:last-of-type {\n    border-bottom: 0;\n  }\n\n  &:hover {\n    background: ${theme.bg.wash};\n  }\n\n  .icon {\n    color: ${theme.text.alt};\n  }\n`;\nexport const ListItem = styled.div`\n  ${listItemStyles};\n`;\nexport const ListItemLink = styled(Link)`\n  ${listItemStyles};\n`;\n\nexport const ListItemContent = styled.div`\n  display: flex;\n  align-items: center;\n\n  .icon {\n    color: ${theme.text.secondary};\n    margin-right: 6px;\n    position: relative;\n    top: 1px;\n  }\n`;\n\nexport const ListItemLabel = styled.div`\n  color: ${theme.text.default};\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.2;\n  vertical-align: middle;\n  display: flex;\n  align-items: center;\n  display: inline-block;\n  ${Truncate};\n`;\n\nexport const SidebarSection = styled.section`\n  background: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  margin-top: 24px;\n  border-radius: 4px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border: 0;\n    margin-top: 0;\n\n    &:last-of-type {\n      border-bottom: 1px solid ${theme.bg.border};\n    }\n\n    &:not(:first-of-type) {\n      border-top: 1px solid ${theme.bg.border};\n    }\n  }\n`;\n\nexport const SidebarSectionHeader = styled.div`\n  display: flex;\n  border-bottom: 1px solid ${theme.bg.border};\n  align-items: center;\n  justify-content: space-between;\n  padding: 16px;\n  position: sticky;\n  top: 0;\n  background: ${theme.bg.default};\n  z-index: 11;\n  border-radius: 4px 4px 0 0;\n\n  a {\n    display: flex;\n    flex: none;\n    align-items: center;\n    color: ${theme.text.alt};\n\n    &:hover {\n      color: ${theme.text.default};\n    }\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    z-index: 1;\n    background: ${theme.bg.wash};\n    border-bottom: 1px solid ${theme.bg.border};\n    padding: 24px 16px 8px 16px;\n    position: relative;\n  }\n`;\n\nexport const SidebarSectionHeading = styled.div`\n  font-size: 16px;\n  font-weight: 700;\n  color: ${theme.text.default};\n  display: flex;\n  flex: 1 0 auto;\n  padding-right: 16px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    font-size: 14px;\n    font-weight: 600;\n    color: ${theme.text.secondary};\n  }\n`;\n\nexport const FeedsContainer = styled.section`\n  display: flex;\n  flex-direction: column;\n  background: ${theme.bg.default};\n`;\n\nexport const Row = styled.div`\n  display: flex;\n`;\n\nexport const Name = styled.div`\n  color: ${theme.text.default};\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.2;\n  vertical-align: middle;\n  display: flex;\n  align-items: center;\n  display: inline-block;\n  ${Truncate};\n`;\n\nexport const NameWarn = styled.div`\n  color: ${theme.warn.default};\n  font-size: 15px;\n  font-weight: 500;\n  line-height: 1.2;\n  vertical-align: middle;\n  display: flex;\n  align-items: center;\n  display: inline-block;\n  ${Truncate};\n`;\n\nexport const List = styled.div`\n  display: flex;\n  flex-direction: column;\n  border-radius: 0 0 4px 4px;\n  overflow: hidden;\n`;\n\nexport const PrivateCommunityWrapper = styled.div`\n  ${CardStyles};\n  padding: 16px;\n`;\n\nexport const ActionsRow = styled.div`\n  display: grid;\n  grid-gap: 16px;\n  grid-template-columns: repeat(2, 1fr);\n  margin-top: 32px;\n\n  button {\n    display: flex;\n    flex: 1 0 auto;\n    width: 100%;\n  }\n`;\n\nexport const Emoji = styled.span`\n  font-size: 40px;\n  margin-bottom: 16px;\n`;\n\nexport const Heading = styled.h3`\n  font-size: 24px;\n  font-weight: 700;\n  color: ${theme.text.default};\n`;\nexport const Description = styled.p`\n  margin-top: 8px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n`;\n\nexport const PostsFeedsSelectorContainer = styled.div`\n  padding: 8px 16px;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: ${theme.bg.wash};\n  display: flex;\n  justify-content: space-between;\n`;\n\nexport const FeedsStretch = styled.div`\n  flex: 1;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n\n  display: grid;\n  grid-template-columns: minmax(min-content, 1fr);\n  grid-template-rows: 1fr;\n  width: 100%;\n  align-items: flex-end;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    /* account for fixed position chat input */\n    padding-bottom: 56px;\n    grid-template-rows: 1fr;\n  }\n`;\n\nexport const InfoContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  background: ${theme.bg.wash};\n  padding-bottom: 64px;\n`;\n\nexport const NewActivityDot = styled.div`\n  width: 8px;\n  height: 8px;\n  border-radius: 4px;\n  background: ${theme.warn.default};\n  align-self: center;\n  margin-right: 16px;\n`;\n"
  },
  {
    "path": "src/views/communityLogin/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport FullscreenView from 'src/components/fullscreenView';\nimport LoginButtonSet from 'src/components/loginButtonSet';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport { CLIENT_URL } from 'src/api/constants';\nimport {\n  Title,\n  Subtitle,\n  LoginImageContainer,\n  FullscreenContent,\n  CodeOfConduct,\n} from './style';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport {\n  getCommunityByMatch,\n  type GetCommunityType,\n} from 'shared/graphql/queries/community/getCommunity';\nimport queryString from 'query-string';\nimport { LoadingView, ErrorView } from 'src/views/viewHelpers';\nimport { OutlineButton } from 'src/components/button';\n\ntype Props = {\n  data: {\n    community: GetCommunityType,\n  },\n  ...$Exact<ViewNetworkHandlerType>,\n  history: Object,\n  location: Object,\n  match: Object,\n  redirectPath: ?string,\n};\n\ntype State = {\n  redirectPath: ?string,\n};\n\nexport class Login extends React.Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      redirectPath: props.redirectPath,\n    };\n  }\n\n  escape = () => {\n    this.props.history.push(`/${this.props.match.params.communitySlug}`);\n  };\n\n  componentDidMount() {\n    const { location, redirectPath } = this.props;\n\n    if (redirectPath) {\n      this.setState({ redirectPath });\n    }\n\n    if (location && !redirectPath) {\n      const searchObj = queryString.parse(this.props.location.search);\n      this.setState({ redirectPath: searchObj.r });\n    }\n  }\n\n  render() {\n    const {\n      data: { community },\n      isLoading,\n      match,\n    } = this.props;\n    const { redirectPath } = this.state;\n\n    if (community && community.id) {\n      return (\n        <FullscreenView closePath={`${CLIENT_URL}`}>\n          <FullscreenContent\n            data-cy=\"community-login-page\"\n            style={{ justifyContent: 'center' }}\n          >\n            <LoginImageContainer>\n              <CommunityAvatar\n                community={community}\n                showHoverProfile={false}\n                size={88}\n              />\n            </LoginImageContainer>\n            <Title>Log in</Title>\n            <Subtitle>\n              Spectrum is a place where communities can share, discuss, and grow\n              together. Sign in below to get in on the conversation.\n            </Subtitle>\n\n            <LoginButtonSet\n              redirectPath={\n                redirectPath || `${CLIENT_URL}/${match.params.communitySlug}`\n              }\n              signinType={'signin'}\n              githubOnly\n            />\n\n            <OutlineButton\n              css={{ width: '100%' }}\n              to={`/login?r=${redirectPath ||\n                `${CLIENT_URL}/${match.params.communitySlug}`}`}\n            >\n              Existing user? Click here to log in\n            </OutlineButton>\n\n            <CodeOfConduct>\n              By using Spectrum, you agree to our{' '}\n              <a\n                href=\"https://github.com/withspectrum/code-of-conduct\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Code of Conduct\n              </a>\n            </CodeOfConduct>\n          </FullscreenContent>\n        </FullscreenView>\n      );\n    }\n\n    if (isLoading) return <LoadingView />;\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  getCommunityByMatch,\n  viewNetworkHandler\n)(Login);\n"
  },
  {
    "path": "src/views/communityLogin/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { zIndex } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Title = styled.h1`\n  color: ${theme.text.default};\n  width: 100%;\n  font-weight: 600;\n  font-size: 32px;\n  line-height: 1.25;\n  margin-top: 24px;\n  margin-bottom: 8px;\n  padding: 0;\n  text-align: center;\n`;\n\nexport const Subtitle = styled.h2`\n  width: 100%;\n  color: ${theme.text.alt};\n  font-weight: 500;\n  font-size: 20px;\n  line-height: 1.4;\n  margin-bottom: 16px;\n  padding: 0 32px;\n  text-align: center;\n  white-space: pre-wrap;\n\n  b {\n    font-weight: 700;\n  }\n\n  a {\n    color: ${theme.brand.default};\n  }\n\n  li {\n    margin-top: 8px;\n    list-style-type: none;\n  }\n`;\n\nexport const LoginImageContainer = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 16px;\n  margin-top: 32px;\n`;\n\nexport const SigninLink = styled.span`\n  color: ${theme.brand.default};\n  margin-left: 6px;\n  cursor: pointer;\n`;\n\nexport const FullscreenContent = styled.div`\n  width: 100%;\n  max-width: ${MEDIA_BREAK}px;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  padding: 32px 16px;\n  flex: 1 0 auto;\n`;\n\nexport const CodeOfConduct = styled.p`\n  display: inline-block;\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  border-radius: 8px;\n  margin-top: 64px;\n  margin-left: 32px;\n  margin-right: 32px;\n  text-align: center;\n  position: relative;\n  z-index: ${zIndex.card + 1};\n\n  a {\n    color: ${theme.brand.default};\n    font-weight: 600;\n  }\n`;\n"
  },
  {
    "path": "src/views/communityMembers/components/communityMembers.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport { withApollo } from 'react-apollo';\nimport { Loading } from 'src/components/loading';\nimport GetMembers from './getMembers';\nimport queryString from 'query-string';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  SectionCard,\n  SectionTitle,\n  SectionCardFooter,\n} from 'src/components/settingsViews/style';\nimport { Filters, Filter, FetchMore, Row } from '../style';\nimport { ListContainer } from 'src/components/listItems/style';\nimport ViewError from 'src/components/viewError';\nimport { UserListItem } from 'src/components/entities';\nimport { Notice } from 'src/components/listItems/style';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  id: string,\n  client: Object,\n  currentUser: Object,\n  dispatch: Dispatch<Object>,\n  history: Object,\n  location: Object,\n  community: Object,\n};\n\ntype State = {\n  filter: ?{\n    isMember?: boolean,\n    isModerator?: boolean,\n    isBlocked?: boolean,\n    isOwner?: boolean,\n  },\n};\n\nclass CommunityMembers extends React.Component<Props, State> {\n  initialState = {\n    filter: { isMember: true, isBlocked: false },\n  };\n\n  state = this.initialState;\n\n  componentDidMount() {\n    const { filter } = queryString.parse(this.props.location.search);\n    if (!filter) return;\n\n    if (filter === 'team') {\n      return this.viewTeam();\n    }\n  }\n\n  viewMembers = () => {\n    return this.setState({\n      filter: { isMember: true, isBlocked: false },\n    });\n  };\n\n  viewTeam = () => {\n    return this.setState({\n      filter: { isModerator: true, isOwner: true },\n    });\n  };\n\n  generateUserProfile = communityMember => {\n    const { user } = communityMember;\n    return (\n      <React.Fragment>\n        <Row style={{ position: 'relative' }}>\n          <UserListItem\n            userObject={user}\n            key={user.id}\n            id={user.id}\n            name={user.name}\n            username={user.username}\n            description={user.description}\n            isCurrentUser={user.id === this.props.currentUser.id}\n            profilePhoto={user.profilePhoto}\n            avatarSize={40}\n            showHoverProfile={false}\n            messageButton={user.id !== this.props.currentUser.id}\n          />\n        </Row>\n      </React.Fragment>\n    );\n  };\n\n  render() {\n    const { filter } = this.state;\n    const { id, community } = this.props;\n\n    return (\n      <SectionCard>\n        <SectionTitle>\n          Community Members · {community.metaData.members.toLocaleString()}\n        </SectionTitle>\n\n        <Filters>\n          <Filter\n            onClick={this.viewMembers}\n            active={filter && filter.isMember ? true : false}\n          >\n            Members\n          </Filter>\n          <Filter\n            onClick={this.viewTeam}\n            active={\n              filter && filter.isModerator && filter.isOwner ? true : false\n            }\n          >\n            Team\n          </Filter>\n        </Filters>\n\n        <GetMembers\n          filter={filter}\n          id={id}\n          render={({ isLoading, community, isFetchingMore, fetchMore }) => {\n            const members =\n              community &&\n              community.members &&\n              community.members.edges.map(member => member && member.node);\n\n            if (members && members.length > 0) {\n              return (\n                <ListContainer data-cy=\"community-settings-members-list\">\n                  {filter && filter.isBlocked && !community.isPrivate && (\n                    <Notice>\n                      <strong>A note about blocked users:</strong> Your\n                      community is publicly viewable (except for private\n                      channels). This means that a blocked user may be able to\n                      see the content and conversations in your community.\n                      However, they will be prevented from creating new\n                      conversations, or leaving messages in existing\n                      conversations.\n                    </Notice>\n                  )}\n\n                  {members.map(communityMember => {\n                    if (!communityMember) return null;\n                    return this.generateUserProfile(communityMember);\n                  })}\n\n                  {community && community.members.pageInfo.hasNextPage && (\n                    <SectionCardFooter>\n                      <FetchMore\n                        color={'brand.default'}\n                        loading={isFetchingMore}\n                        onClick={fetchMore}\n                      >\n                        {isFetchingMore ? 'Loading...' : 'Load more'}\n                      </FetchMore>\n                    </SectionCardFooter>\n                  )}\n                </ListContainer>\n              );\n            }\n\n            if (isLoading) {\n              return <Loading />;\n            }\n\n            if (!members || members.length === 0) {\n              if (filter && filter.isBlocked) {\n                return (\n                  <ViewError\n                    emoji={' '}\n                    heading={'No blocked members found'}\n                    subheading={\n                      'Nobody has been blocked yet - nice! When someone is blocked, they will appear here'\n                    }\n                  />\n                );\n              }\n\n              if (filter && filter.isMember) {\n                return (\n                  <ViewError\n                    emoji={' '}\n                    heading={'No members found'}\n                    subheading={\n                      \"We couldn't find any members in your community. That's strange...\"\n                    }\n                  />\n                );\n              }\n\n              if (filter && filter.isModerator && filter.isOwner) {\n                return (\n                  <ViewError\n                    emoji={' '}\n                    heading={'No team members found'}\n                    subheading={\n                      \"You haven't added any team members to your community yet.\"\n                    }\n                  />\n                );\n              }\n            }\n\n            return null;\n          }}\n        />\n      </SectionCard>\n    );\n  }\n}\n\nexport default compose(\n  withApollo,\n  withCurrentUser,\n  withRouter,\n  connect()\n)(CommunityMembers);\n"
  },
  {
    "path": "src/views/communityMembers/components/getMembers.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport getCommunityMembersQuery, {\n  type GetCommunityMembersType,\n} from 'shared/graphql/queries/community/getCommunityMembers';\n\ntype Props = {\n  data: {\n    fetchMore: Function,\n    community: GetCommunityMembersType,\n  },\n  ...$Exact<ViewNetworkHandlerType>,\n  render: Function,\n};\n\nclass CommunityMembers extends React.Component<Props> {\n  render() {\n    const {\n      data: { community, fetchMore },\n      isLoading,\n      isFetchingMore,\n    } = this.props;\n\n    return this.props.render({\n      community,\n      isLoading,\n      isFetchingMore,\n      fetchMore,\n    });\n  }\n}\n\nexport default compose(\n  getCommunityMembersQuery,\n  viewNetworkHandler\n)(CommunityMembers);\n"
  },
  {
    "path": "src/views/communityMembers/components/mutationWrapper.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  mutation: ?Function,\n  variables: any,\n  dispatch: Dispatch<Object>,\n  render: Function,\n};\n\ntype State = {\n  isLoading: boolean,\n};\n\nclass MutationWrapper extends React.Component<Props, State> {\n  initialState = { isLoading: false };\n  state = this.initialState;\n\n  init = () => {\n    if (!this.props.mutation) return;\n    this.setState({ isLoading: true });\n    return this.mutate();\n  };\n\n  terminate = () => {\n    return this.setState(this.initialState);\n  };\n\n  mutate = () => {\n    if (!this.props.mutation) return;\n    return this.props\n      .mutation(this.props.variables)\n      .then(() => {\n        this.props.dispatch(\n          addToastWithTimeout('success', 'Saved permissions')\n        );\n        return this.terminate();\n      })\n      .catch(err => {\n        this.props.dispatch(addToastWithTimeout('error', err.message));\n        return this.terminate();\n      });\n  };\n\n  render() {\n    return <div onClick={this.init}>{this.props.render(this.state)}</div>;\n  }\n}\n\nexport default connect()(MutationWrapper);\n"
  },
  {
    "path": "src/views/communityMembers/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport CommunityMembers from './components/communityMembers';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { SectionsContainer, Column } from 'src/components/settingsViews/style';\nimport { ErrorBoundary, SettingsFallback } from 'src/components/error';\nimport { ErrorView } from 'src/views/viewHelpers';\n\ntype Props = {\n  currentUser: Object,\n  community: GetCommunityType,\n  dispatch: Dispatch<Object>,\n  match: Object,\n  history: Object,\n};\n\nclass CommunityMembersSettings extends React.Component<Props> {\n  render() {\n    const { community, history } = this.props;\n\n    if (community && community.id) {\n      return (\n        <SectionsContainer>\n          <Column>\n            <ErrorBoundary fallbackComponent={SettingsFallback}>\n              <CommunityMembers\n                history={history}\n                id={community.id}\n                community={community}\n              />\n            </ErrorBoundary>\n          </Column>\n        </SectionsContainer>\n      );\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  connect()\n)(CommunityMembersSettings);\n"
  },
  {
    "path": "src/views/communityMembers/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { TextButton } from 'src/components/button';\n\nexport const Heading = styled.h1`\n  margin-left: 16px;\n  font-size: 32px;\n  color: ${theme.text.default};\n  font-weight: 800;\n`;\n\nexport const Subheading = styled.h3`\n  margin-left: 16px;\n  font-size: 16px;\n  color: ${theme.text.alt};\n  font-weight: 500;\n  line-height: 1;\n  margin-bottom: 8px;\n`;\n\nexport const StyledHeader = styled.div`\n  display: flex;\n  padding: 32px;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: ${theme.bg.default};\n  width: 100%;\n  align-items: center;\n`;\n\nexport const HeaderText = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: space-around;\n`;\n\nexport const StyledThreadListItem = styled.div`\n  display: flex;\n  border-bottom: 1px solid ${theme.bg.border};\n  padding: 16px 0;\n  flex-direction: column;\n\n  &:last-of-type {\n    border-bottom: 0;\n    padding-bottom: 0;\n  }\n`;\nexport const ThreadListItemTitle = styled.h4`\n  font-size: 16px;\n  color: ${theme.text.default};\n  line-height: 1.28;\n  font-weight: 500;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const ThreadListItemSubtitle = styled.h5`\n  font-size: 14px;\n  color: ${theme.text.alt};\n  line-height: 1.28;\n  margin-top: 4px;\n\n  a:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const CustomMessageToggle = styled.h4`\n  font-size: 14px;\n  color: ${theme.text.alt};\n  margin-top: 16px;\n\n  &:hover {\n    color: ${theme.brand.default};\n    cursor: pointer;\n  }\n\n  div {\n    position: relative;\n    top: 5px;\n    margin-right: 4px;\n  }\n`;\n\nexport const CustomMessageTextAreaStyles = {\n  width: '100%',\n  borderRadius: '8px',\n  padding: '16px',\n  marginTop: '8px',\n  fontSize: '14px',\n};\n\nexport const Filters = styled.ul`\n  display: flex;\n  margin: 0 -16px 16px;\n  padding: 0 16px;\n  flex: 1;\n  border-bottom: 1px solid ${theme.bg.border};\n`;\n\nexport const Filter = styled.li`\n  color: ${props =>\n    props.active ? props.theme.text.default : props.theme.text.alt};\n  font-weight: 400;\n  font-size: 16px;\n  list-style-type: none;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 12px 16px;\n  margin-bottom: -1px;\n  border-bottom: 1px solid\n    ${props => (props.active ? props.theme.text.default : 'transparent')};\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const FetchMore = styled(TextButton)`\n  display: flex;\n  flex: 1;\n  justify-content: center;\n  padding: 8px 16px;\n  align-items: center;\n  font-size: 14px;\n  color: ${theme.text.alt};\n  cursor: pointer;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\nexport const TokenInputWrapper = styled.div`\n  position: relative;\n  cursor: pointer;\n\n  input {\n    cursor: pointer;\n  }\n\n  &:after {\n    content: 'Copy link';\n    position: absolute;\n    right: 8px;\n    top: 50%;\n    transform: translateY(-50%);\n    font-size: 10px;\n    text-transform: uppercase;\n    color: ${theme.text.reverse};\n    background: ${theme.text.alt};\n    padding: 4px 8px;\n    border-radius: 4px;\n    font-weight: 700;\n  }\n\n  &:hover {\n    &:after {\n      background: ${theme.success.alt};\n    }\n  }\n`;\n\nexport const Row = styled.div`\n  display: flex;\n  align-items: flex-start;\n\n  a {\n    display: flex;\n    flex: 1 1 auto;\n  }\n`;\n"
  },
  {
    "path": "src/views/communitySettings/components/channelList.js",
    "content": "// @flow\nimport React from 'react';\nimport { Link } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { Loading } from 'src/components/loading';\nimport Icon from 'src/components/icon';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport ViewError from 'src/components/viewError';\nimport Tooltip from 'src/components/tooltip';\nimport getCommunityChannels from 'shared/graphql/queries/community/getCommunityChannelConnection';\nimport type { GetCommunityChannelConnectionType } from 'shared/graphql/queries/community/getCommunityChannelConnection';\nimport type { Dispatch } from 'redux';\nimport { ListContainer } from '../style';\nimport { SectionCard, SectionTitle } from 'src/components/settingsViews/style';\nimport { ChannelListItem } from 'src/components/listItems';\n\ntype Props = {\n  data: {\n    community: GetCommunityChannelConnectionType,\n  },\n  isLoading: boolean,\n  dispatch: Dispatch<Object>,\n  communitySlug: string,\n};\n\nclass ChannelList extends React.Component<Props> {\n  render() {\n    const {\n      data: { community },\n      isLoading,\n    } = this.props;\n\n    if (community) {\n      const channels = community.channelConnection.edges.map(c => c && c.node);\n\n      return (\n        <SectionCard data-cy=\"channel-list\">\n          <SectionTitle>Channels</SectionTitle>\n\n          <ListContainer style={{ padding: '0 16px' }}>\n            {channels.length > 0 &&\n              channels.map(channel => {\n                if (!channel) return null;\n                return (\n                  <ChannelListItem key={channel.id} channel={channel}>\n                    <Link\n                      to={`/${channel.community.slug}/${channel.slug}/settings`}\n                    >\n                      <Tooltip content={'Manage channel'}>\n                        <span>\n                          <Icon glyph=\"settings\" />\n                        </span>\n                      </Tooltip>\n                    </Link>\n                  </ChannelListItem>\n                );\n              })}\n          </ListContainer>\n        </SectionCard>\n      );\n    }\n\n    if (isLoading) {\n      return (\n        <SectionCard>\n          <Loading />\n        </SectionCard>\n      );\n    }\n\n    return (\n      <SectionCard>\n        <ViewError\n          refresh\n          small\n          heading={'We couldn’t load the channels for this community.'}\n        />\n      </SectionCard>\n    );\n  }\n}\n\nexport default compose(\n  connect(),\n  getCommunityChannels,\n  viewNetworkHandler\n)(ChannelList);\n"
  },
  {
    "path": "src/views/communitySettings/components/editForm.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport editCommunityMutation from 'shared/graphql/mutations/community/editCommunity';\nimport type { EditCommunityType } from 'shared/graphql/mutations/community/editCommunity';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport { openModal } from 'src/actions/modals';\nimport Tooltip from 'src/components/tooltip';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport { PrimaryOutlineButton } from 'src/components/button';\nimport { Notice } from 'src/components/listItems/style';\nimport Icon from 'src/components/icon';\nimport {\n  Input,\n  UnderlineInput,\n  TextArea,\n  PhotoInput,\n  Error,\n  CoverInput,\n} from 'src/components/formElements';\nimport {\n  Form,\n  FormTitle,\n  Description,\n  Actions,\n  TertiaryActionContainer,\n  ImageInputWrapper,\n  DeleteCoverWrapper,\n  DeleteCoverButton,\n} from 'src/components/editForm/style';\nimport { SectionCard, SectionTitle } from 'src/components/settingsViews/style';\nimport type { Dispatch } from 'redux';\n\ntype State = {\n  name: string,\n  slug: string,\n  description: string,\n  communityId: string,\n  website: string,\n  image: string,\n  coverPhoto: string,\n  file: ?Object,\n  coverFile: ?Object,\n  communityData: Object,\n  photoSizeError: boolean,\n  nameError: boolean,\n  isLoading: boolean,\n};\n\ntype Props = {\n  community: GetCommunityType,\n  dispatch: Dispatch<Object>,\n  editCommunity: Function,\n};\n\nclass EditForm extends React.Component<Props, State> {\n  constructor(props) {\n    super(props);\n\n    const { community } = this.props;\n    this.state = {\n      name: community.name,\n      slug: community.slug,\n      description: community.description ? community.description : '',\n      communityId: community.id,\n      website: community.website ? community.website : '',\n      image: community.profilePhoto,\n      coverPhoto: community.coverPhoto,\n      file: null,\n      coverFile: null,\n      nameError: false,\n      communityData: community,\n      photoSizeError: false,\n      isLoading: false,\n    };\n  }\n\n  changeName = e => {\n    const name = e.target.value;\n\n    if (name.length > 20) {\n      this.setState({\n        name,\n        nameError: true,\n      });\n\n      return;\n    }\n\n    this.setState({\n      name,\n      nameError: false,\n    });\n  };\n\n  changeDescription = e => {\n    const description = e.target.value;\n    this.setState({\n      description,\n    });\n  };\n\n  changeSlug = e => {\n    const slug = e.target.value;\n    this.setState({\n      slug,\n    });\n  };\n\n  changeWebsite = e => {\n    const website = e.target.value;\n    this.setState({\n      website,\n    });\n  };\n\n  setCommunityPhoto = e => {\n    let reader = new FileReader();\n    let file = e.target.files[0];\n\n    if (!file) return;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    if (file && file.size > 3000000) {\n      return this.setState({\n        photoSizeError: true,\n        isLoading: false,\n      });\n    }\n\n    reader.onloadend = () => {\n      this.setState({\n        file: file,\n        // $FlowFixMe\n        image: reader.result,\n        photoSizeError: false,\n        isLoading: false,\n      });\n    };\n\n    if (file) {\n      reader.readAsDataURL(file);\n    }\n  };\n\n  setCommunityCover = e => {\n    let reader = new FileReader();\n    let file = e.target.files[0];\n\n    if (!file) return;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    if (file && file.size > 3000000) {\n      return this.setState({\n        photoSizeError: true,\n        isLoading: false,\n      });\n    }\n\n    reader.onloadend = () => {\n      this.setState({\n        coverFile: file,\n        // $FlowFixMe\n        coverPhoto: reader.result,\n        photoSizeError: false,\n        isLoading: false,\n      });\n    };\n\n    if (file) {\n      reader.readAsDataURL(file);\n    }\n  };\n\n  save = e => {\n    e.preventDefault();\n    const {\n      name,\n      description,\n      website,\n      file,\n      coverFile,\n      coverPhoto,\n      communityId,\n      photoSizeError,\n    } = this.state;\n    const input = {\n      name,\n      description,\n      website,\n      file,\n      coverFile,\n      coverPhoto,\n      communityId,\n    };\n\n    if (photoSizeError) {\n      return;\n    }\n\n    this.setState({\n      isLoading: true,\n    });\n\n    this.props\n      .editCommunity(input)\n      .then(({ data }: EditCommunityType) => {\n        const { editCommunity: community } = data;\n\n        this.setState({\n          isLoading: false,\n        });\n\n        // community was returned\n        if (community !== undefined) {\n          this.props.dispatch(\n            addToastWithTimeout('success', 'Community saved!')\n          );\n        }\n        return;\n      })\n      .catch(err => {\n        this.setState({\n          isLoading: false,\n        });\n\n        this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  triggerDeleteCommunity = (e, communityId) => {\n    e.preventDefault();\n    const { name, communityData } = this.state;\n    const message = (\n      <div>\n        <p>\n          Are you sure you want to delete your community, <b>{name}</b>?\n        </p>{' '}\n        <p>\n          <b>{communityData.metaData.members} members</b> will be removed from\n          the community and the channels you’ve created will be deleted.\n        </p>\n        <p>\n          All threads, messages, reactions, and media shared in your community\n          will be deleted.\n        </p>\n        <p>This cannot be undone.</p>\n      </div>\n    );\n\n    return this.props.dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: communityId,\n        entity: 'community',\n        message,\n      })\n    );\n  };\n\n  deleteCoverPhoto = e => {\n    e.preventDefault();\n    this.setState({ coverPhoto: '', coverFile: null });\n  };\n\n  render() {\n    const {\n      name,\n      slug,\n      description,\n      image,\n      coverPhoto,\n      website,\n      photoSizeError,\n      nameError,\n      isLoading,\n    } = this.state;\n    const { community } = this.props;\n\n    if (!community) {\n      return (\n        <SectionCard>\n          <FormTitle>This community doesn’t exist yet.</FormTitle>\n          <Description>Want to make it?</Description>\n          <Actions>\n            <PrimaryOutlineButton>Create</PrimaryOutlineButton>\n          </Actions>\n        </SectionCard>\n      );\n    }\n\n    return (\n      <SectionCard>\n        <SectionTitle>Community Settings</SectionTitle>\n        <Form onSubmit={this.save}>\n          <ImageInputWrapper>\n            {coverPhoto && !/default_images/.test(coverPhoto) && (\n              <DeleteCoverWrapper>\n                <DeleteCoverButton onClick={e => this.deleteCoverPhoto(e)}>\n                  <Icon glyph=\"view-close-small\" size={'16'} />\n                </DeleteCoverButton>\n              </DeleteCoverWrapper>\n            )}\n            <CoverInput\n              onChange={this.setCommunityCover}\n              defaultValue={coverPhoto}\n              preview={true}\n              allowGif\n            />\n\n            <PhotoInput\n              type={'community'}\n              onChange={this.setCommunityPhoto}\n              defaultValue={image}\n            />\n          </ImageInputWrapper>\n\n          <Input\n            dataCy=\"community-settings-name-input\"\n            defaultValue={name}\n            onChange={this.changeName}\n          >\n            Name\n          </Input>\n          <UnderlineInput defaultValue={slug} disabled>\n            spectrum.chat/\n          </UnderlineInput>\n\n          {nameError && (\n            <Error>Community names can be up to 20 characters long.</Error>\n          )}\n\n          <TextArea\n            defaultValue={description}\n            onChange={this.changeDescription}\n            dataCy=\"community-settings-description-input\"\n          >\n            Description\n          </TextArea>\n\n          <Input\n            defaultValue={website}\n            onChange={this.changeWebsite}\n            dataCy=\"community-settings-website-input\"\n          >\n            Optional: Add your community’s website\n          </Input>\n\n          <Actions>\n            <PrimaryOutlineButton\n              loading={isLoading}\n              onClick={this.save}\n              disabled={photoSizeError}\n              type=\"submit\"\n              data-cy=\"community-settings-edit-save-button\"\n            >\n              {isLoading ? 'Saving...' : 'Save'}\n            </PrimaryOutlineButton>\n            <TertiaryActionContainer>\n              {community.communityPermissions.isOwner && (\n                <Tooltip content={`Delete ${name}`}>\n                  <span>\n                    <Icon\n                      glyph=\"delete\"\n                      color=\"text.placeholder\"\n                      hoverColor={'warn.alt'}\n                      onClick={e =>\n                        this.triggerDeleteCommunity(e, community.id)\n                      }\n                    />\n                  </span>\n                </Tooltip>\n              )}\n            </TertiaryActionContainer>\n          </Actions>\n\n          {photoSizeError && (\n            <Notice style={{ marginTop: '16px' }}>\n              Photo uploads should be less than 3mb\n            </Notice>\n          )}\n        </Form>\n      </SectionCard>\n    );\n  }\n}\n\nexport default compose(\n  connect(),\n  editCommunityMutation,\n  withRouter\n)(EditForm);\n"
  },
  {
    "path": "src/views/communitySettings/components/overview.js",
    "content": "// @flow\nimport * as React from 'react';\nimport EditForm from './editForm';\nimport ChannelList from './channelList';\nimport { SectionsContainer, Column } from 'src/components/settingsViews/style';\nimport RedirectSettings from './redirect';\nimport { ErrorBoundary, SettingsFallback } from 'src/components/error';\n\ntype Props = {\n  communitySlug: string,\n  community: Object,\n};\n\nclass Overview extends React.Component<Props> {\n  render() {\n    const { community, communitySlug } = this.props;\n\n    return (\n      <SectionsContainer>\n        <Column>\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <EditForm community={community} />\n          </ErrorBoundary>\n\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <RedirectSettings community={community} />\n          </ErrorBoundary>\n        </Column>\n        <Column>\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <ChannelList id={community.id} communitySlug={communitySlug} />\n          </ErrorBoundary>\n        </Column>\n      </SectionsContainer>\n    );\n  }\n}\n\nexport default Overview;\n"
  },
  {
    "path": "src/views/communitySettings/components/redirect.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { type GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport {\n  SectionCard,\n  SectionTitle,\n  SectionSubtitle,\n  SectionCardFooter,\n} from 'src/components/settingsViews/style';\nimport { OutlineButton } from 'src/components/button';\nimport toggleCommunityRedirect from 'shared/graphql/mutations/community/toggleCommunityRedirect';\nimport toggleCommunityNoindex from 'shared/graphql/mutations/community/toggleCommunityNoindex';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  community: GetCommunityType,\n  toggleCommunityRedirect: Function,\n  toggleCommunityNoindex: Function,\n  dispatch: Dispatch<Object>,\n};\n\ntype State = {\n  isLoadingRedirect: boolean,\n  isLoadingNoindex: boolean,\n};\n\nclass RedirectSettings extends React.Component<Props, State> {\n  state = {\n    isLoadingRedirect: false,\n    isLoadingNoindex: false,\n  };\n\n  toggleRedirect = e => {\n    e.preventDefault();\n\n    this.setState({\n      isLoadingRedirect: true,\n    });\n\n    return this.props\n      .toggleCommunityRedirect(this.props.community.id)\n      .then(() => {\n        this.setState({ isLoadingRedirect: false });\n        return this.props.dispatch(\n          addToastWithTimeout('success', 'Community redirect setting saved')\n        );\n      })\n      .catch(err => {\n        this.setState({ isLoadingRedirect: false });\n        return this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  toggleNoindex = e => {\n    e.preventDefault();\n\n    this.setState({\n      isLoadingNoindex: true,\n    });\n\n    return this.props\n      .toggleCommunityNoindex(this.props.community.id)\n      .then(() => {\n        this.setState({ isLoadingNoindex: false });\n        return this.props.dispatch(\n          addToastWithTimeout('success', 'Community setting saved')\n        );\n      })\n      .catch(err => {\n        this.setState({ isLoadingNoindex: false });\n        return this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  render() {\n    const { community } = this.props;\n\n    if (community) {\n      return (\n        <SectionCard data-cy=\"community-settings-redirect\">\n          <SectionTitle>Migrate your community elsewhere</SectionTitle>\n          <SectionSubtitle style={{ marginTop: '8px' }}>\n            Enabling this setting will redirect your community and channel pages\n            to your community's website.\n          </SectionSubtitle>\n          <SectionSubtitle style={{ marginTop: '8px' }}>\n            Existing conversations will stay accessible on Spectrum at their\n            current URLs, but no new members can join and no new conversations\n            can be created.\n          </SectionSubtitle>\n          <SectionSubtitle style={{ marginTop: '8px' }}>\n            We recommend redirecting to a page that explains why users were\n            redirected from Spectrum. For example, you can include a query param\n            in your community website setting (e.g.{' '}\n            <code>community.acme.com/?spectrum=true</code>) to show a special\n            notice to users arriving there.\n          </SectionSubtitle>\n          <SectionCardFooter>\n            <OutlineButton\n              disabled={this.state.isLoadingRedirect}\n              onClick={this.toggleRedirect}\n              style={{ alignSelf: 'flex-start' }}\n            >\n              {this.state.isLoadingRedirect\n                ? 'Loading...'\n                : this.props.community.redirect\n                ? 'Disable'\n                : 'Enable'}\n            </OutlineButton>\n          </SectionCardFooter>\n          {this.props.community.redirect && (\n            <React.Fragment>\n              <SectionCardFooter\n                style={{ marginTop: '24px', paddingTop: '24px' }}\n              >\n                <SectionSubtitle>\n                  Optional: Prevent threads in my community from being indexed\n                  by search engines while redirection is active.\n                </SectionSubtitle>\n              </SectionCardFooter>\n              <SectionCardFooter style={{ borderTop: '0', paddingTop: '0' }}>\n                <OutlineButton\n                  disabled={this.state.isLoadingNoindex}\n                  onClick={this.toggleNoindex}\n                  style={{ alignSelf: 'flex-start' }}\n                >\n                  {this.state.isLoadingNoindex\n                    ? 'Loading...'\n                    : this.props.community.noindex\n                    ? 'Disable'\n                    : 'Enable'}\n                </OutlineButton>\n              </SectionCardFooter>\n            </React.Fragment>\n          )}\n        </SectionCard>\n      );\n    }\n\n    return null;\n  }\n}\n\nexport default compose(\n  toggleCommunityRedirect,\n  toggleCommunityNoindex,\n  connect()\n)(RedirectSettings);\n"
  },
  {
    "path": "src/views/communitySettings/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { Route, Switch } from 'react-router-dom';\nimport { getCommunitySettingsByMatch } from 'shared/graphql/queries/community/getCommunitySettings';\nimport type { GetCommunityType } from 'shared/graphql/queries/community/getCommunity';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport Head from 'src/components/head';\nimport Header from 'src/components/settingsViews/header';\nimport { SegmentedControl, Segment } from 'src/components/segmentedControl';\nimport { View } from './style';\nimport type { ContextRouter } from 'react-router';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport { ViewGrid } from 'src/components/layout';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport Members from '../communityMembers';\nimport Overview from './components/overview';\n\ntype Props = {\n  data: {\n    community: GetCommunityType,\n  },\n  isLoading: boolean,\n  hasError: boolean,\n  ...$Exact<ContextRouter>,\n};\n\nclass CommunitySettings extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    dispatch(\n      setTitlebarProps({\n        title: 'Settings',\n      })\n    );\n  }\n\n  render() {\n    const {\n      data: { community },\n      location,\n      match,\n      isLoading,\n      history,\n    } = this.props;\n\n    // this is hacky, but will tell us if we're viewing analytics or the root settings view\n    const pathname = location.pathname;\n    const lastIndex = pathname.lastIndexOf('/');\n    const activeTab = pathname.substr(lastIndex + 1);\n    const communitySlug = match.params.communitySlug;\n\n    if (community && community.id) {\n      const canViewCommunitySettings =\n        community.communityPermissions.isOwner ||\n        community.communityPermissions.isModerator;\n\n      if (!canViewCommunitySettings) {\n        return <ErrorView />;\n      }\n\n      const subnavItems = [\n        {\n          to: `/${community.slug}/settings`,\n          label: 'Overview',\n          activeLabel: 'settings',\n        },\n        {\n          to: `/${community.slug}/settings/members`,\n          label: 'Members',\n          activeLabel: 'members',\n        },\n      ];\n\n      const subheading = {\n        to: `/${community.slug}`,\n        label: `Return to ${community.name}`,\n      };\n\n      const avatar = {\n        profilePhoto: community.profilePhoto,\n        community,\n      };\n\n      let title = community.name + ' settings';\n\n      return (\n        <React.Fragment>\n          <Head title={title} />\n\n          <ViewGrid>\n            <View data-cy=\"community-settings\">\n              <Header\n                avatar={avatar}\n                subheading={subheading}\n                heading={'Settings'}\n              />\n\n              <SegmentedControl>\n                {subnavItems.map(item => (\n                  <Segment\n                    key={item.label}\n                    to={item.to}\n                    isActive={activeTab === item.activeLabel}\n                  >\n                    {item.label}\n                  </Segment>\n                ))}\n              </SegmentedControl>\n\n              <Switch>\n                <Route path={`${match.url}/members`}>\n                  {() => <Members community={community} history={history} />}\n                </Route>\n                <Route path={`${match.url}`}>\n                  {() => (\n                    <Overview\n                      community={community}\n                      communitySlug={communitySlug}\n                    />\n                  )}\n                </Route>\n              </Switch>\n            </View>\n          </ViewGrid>\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading) {\n      return <LoadingView />;\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  connect(),\n  getCommunitySettingsByMatch,\n  viewNetworkHandler\n)(CommunitySettings);\n"
  },
  {
    "path": "src/views/communitySettings/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport Card from 'src/components/card';\nimport { Link } from 'react-router-dom';\nimport { FlexCol, H1, H2, H3, Span } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ListHeader = styled.div`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  border-bottom: 2px solid ${theme.bg.border};\n  padding-bottom: 16px;\n`;\n\nexport const ListHeading = styled(H3)`\n  font-weight: 800;\n  font-size: 20px;\n  color: ${theme.text.default};\n`;\n\nexport const ListContainer = styled(FlexCol)`\n  margin: 8px -16px 0;\n  width: calc(100% + 32px);\n`;\n\nexport const MoreLink = styled(Link)`\n  font-size: 14px;\n  font-weight: 700;\n  color: ${theme.brand.alt};\n`;\n\nexport const StyledCard = styled(Card)`\n  padding: 16px 16px 16px 20px;\n`;\n\nexport const ButtonContainer = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n  padding: 16px 0 8px;\n`;\n\nexport const EmailInviteForm = styled.div`\n  display: flex;\n  align-items: center;\n\n  &:first-of-type {\n    margin-top: 16px;\n  }\n`;\n\nexport const EmailInviteInput = styled.input`\n  display: flex;\n  flex: 1 1 50%;\n  padding: 8px 12px;\n  font-size: 14px;\n  border-radius: 4px;\n  border: 2px solid\n    ${props => (props.error ? props.theme.warn.default : props.theme.bg.border)};\n  margin-bottom: 8px;\n  margin-top: 8px;\n  margin-left: 4px;\n  margin-right: 4px;\n\n  &:first-of-type {\n    margin-left: 0;\n  }\n\n  &:last-of-type {\n    margin-right: 0;\n  }\n\n  &:focus {\n    border: 2px solid ${theme.brand.default};\n  }\n\n  @media screen and (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const AddRow = styled.div`\n  display: flex;\n  width: 100%;\n  justify-content: center;\n  padding: 8px;\n  background: ${theme.bg.wash};\n  margin-top: 8px;\n  margin-bottom: 16px;\n  font-size: 14px;\n  color: ${theme.text.alt};\n  font-weight: 500;\n  border-radius: 4px;\n\n  &:hover {\n    color: ${theme.text.default};\n    cursor: pointer;\n  }\n`;\n\nexport const RemoveRow = styled.div`\n  margin-left: 4px;\n  color: ${theme.text.alt};\n\n  &:hover {\n    cursor: pointer;\n    color: ${theme.text.default};\n  }\n`;\n\nexport const Title = styled(H1)`\n  font-size: 20px;\n`;\n\nexport const Pitch = styled(FlexCol)`\n  margin: 0 0 32px 0;\n`;\n\nexport const PitchItem = styled(FlexCol)`\n  display: inline-block;\n  font-size: 14px;\n  line-height: 1.4;\n\n  div {\n    font-size: 32px;\n    text-align: center;\n    align-self: center;\n  }\n\n  p {\n    margin-top: 8px;\n    text-align: center;\n  }\n\n  b {\n    font-weight: 700;\n  }\n\n  & + & {\n    margin-top: 16px;\n  }\n`;\n\nexport const Cost = styled(FlexCol)`\n  align-items: center;\n  text-align: center;\n  justify-content: flex-end;\n  flex: none;\n`;\n\nexport const CostNumber = styled(H2)`\n  margin-top: 16px;\n  font-size: 44px;\n  letter-spacing: -2px;\n  vertical-align: baseline;\n  position: relative;\n  left: -16px;\n  color: ${theme.text.default};\n\n  &:before {\n    content: '$';\n    vertical-align: top;\n    position: absolute;\n    top: 16px;\n    right: calc(100% + 2px);\n    font-weight: 400;\n    font-size: 20px;\n    letter-spacing: normal;\n    color: ${theme.text.alt};\n  }\n\n  &:after {\n    content: ${props => (props.per ? `'/ ${props.per}'` : \"''\")};\n    color: ${theme.text.alt};\n    position: absolute;\n    font-size: 14px;\n    white-space: nowrap;\n    left: calc(100% + 4px);\n    bottom: 16px;\n    font-weight: 500;\n    letter-spacing: normal;\n  }\n`;\n\nexport const CostPer = styled(Span)`\n  color: ${theme.text.alt};\n  position: relative;\n  left: -12px;\n  font-weight: 500;\n  letter-spacing: normal;\n`;\n\nexport const CostSubtext = styled(FlexCol)`\n  color: ${theme.text.alt};\n  flex: none;\n  margin-bottom: 24px;\n  justify-content: flex-start;\n  font-size: 14px;\n  font-weight: 500;\n`;\n\nexport const View = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  align-self: stretch;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n  }\n`;\n\nexport const MessageIcon = styled.div`\n  color: ${theme.brand.alt};\n  cursor: pointer;\n`;\n"
  },
  {
    "path": "src/views/directMessages/components/avatars.js",
    "content": "// @flow\nimport React from 'react';\nimport { UserAvatar } from 'src/components/avatar';\nimport type { ParticipantType } from 'shared/graphql/fragments/directMessageThread/directMessageThreadInfo';\nimport {\n  AvatarContainer,\n  TwoAvatarContainer,\n  TwoAvatarWrap,\n  ThreeAvatarContainer,\n  Remainder,\n} from './style';\n\nexport const renderAvatars = (users: Array<ParticipantType>) => {\n  if (users.length === 1) {\n    return (\n      <AvatarContainer>\n        <UserAvatar\n          user={users[0]}\n          size={44}\n          isClickable={false}\n          showHoverProfile={false}\n        />\n      </AvatarContainer>\n    );\n  }\n\n  if (users.length === 2) {\n    return (\n      <TwoAvatarContainer>\n        {users.map(user => {\n          return (\n            <TwoAvatarWrap key={user.id}>\n              <UserAvatar\n                user={user}\n                size={34}\n                isClickable={false}\n                showHoverProfile={false}\n              />\n            </TwoAvatarWrap>\n          );\n        })}\n      </TwoAvatarContainer>\n    );\n  }\n\n  if (users.length === 3) {\n    return (\n      <ThreeAvatarContainer>\n        {users.map(user => {\n          return (\n            <UserAvatar\n              user={user}\n              key={user.id}\n              size={20}\n              isClickable={false}\n              showHoverProfile={false}\n            />\n          );\n        })}\n      </ThreeAvatarContainer>\n    );\n  }\n\n  if (users.length === 4) {\n    return (\n      <ThreeAvatarContainer>\n        {users.map(user => {\n          return (\n            <UserAvatar\n              user={user}\n              key={user.id}\n              size={19}\n              isClickable={false}\n              showHoverProfile={false}\n            />\n          );\n        })}\n      </ThreeAvatarContainer>\n    );\n  }\n\n  if (users.length > 4) {\n    const remainder = users.length % 4;\n\n    return (\n      <ThreeAvatarContainer>\n        {users.map((user, i) => {\n          while (i < 3) {\n            return (\n              <UserAvatar\n                user={user}\n                key={user.id}\n                size={19}\n                isClickable={false}\n                showHoverProfile={false}\n              />\n            );\n          }\n\n          return null;\n        })}\n\n        <Remainder>\n          <span>+{remainder}</span>\n        </Remainder>\n      </ThreeAvatarContainer>\n    );\n  }\n\n  return null;\n};\n"
  },
  {
    "path": "src/views/directMessages/components/header.js",
    "content": "import React from 'react';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport Head from 'src/components/head';\nimport {\n  StyledHeader,\n  PhotosContainer,\n  Photo,\n  Names,\n  Username,\n  PhotoWrapper,\n} from './style';\n\nconst Header = ({ thread, currentUser }) => {\n  const trimmedUsers = thread.participants.filter(\n    user => user.userId !== currentUser.id\n  );\n\n  // don't show the header in a 1:1 dm because we already have the titlebar\n  if (trimmedUsers.length === 1) {\n    return (\n      <Head\n        title={`Conversation with ${trimmedUsers[0].name}`}\n        description={`Conversation with ${trimmedUsers[0].name}`}\n      />\n    );\n  }\n\n  const photos = trimmedUsers.map(user => (\n    <PhotoWrapper key={user.id}>\n      <Photo user={user} size={56} />\n    </PhotoWrapper>\n  ));\n\n  const names = trimmedUsers.map(user => user.name).join(', ');\n  const username =\n    trimmedUsers.length === 1 && trimmedUsers[0].username\n      ? trimmedUsers[0].username\n      : '';\n\n  const { title, description } = generateMetaInfo({\n    type: 'directMessage',\n    data: {\n      title: `${names}`,\n      description: `Conversation with ${names}`,\n    },\n  });\n\n  return (\n    <StyledHeader data-cy=\"dm-header\">\n      <Head title={title} description={description} />\n      <PhotosContainer>{photos}</PhotosContainer>\n      <Names>{names}</Names>\n      <Username>{username && `@${username}`}</Username>\n    </StyledHeader>\n  );\n};\n\nexport default Header;\n"
  },
  {
    "path": "src/views/directMessages/components/loading.js",
    "content": "// @flow\nimport React from 'react';\nimport { LoadingDM } from 'src/components/loading';\nimport { View, MessagesList } from '../style';\n\nexport default () => (\n  <View>\n    <MessagesList>\n      <div>\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n        <LoadingDM />\n      </div>\n    </MessagesList>\n  </View>\n);\n"
  },
  {
    "path": "src/views/directMessages/components/messageThreadListItem.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { timeDifference } from 'shared/time-difference';\nimport { renderAvatars } from './avatars';\nimport type { GetDirectMessageThreadType } from 'shared/graphql/queries/directMessageThread/getDirectMessageThread';\nimport {\n  Wrapper,\n  WrapperLink,\n  Row,\n  Meta,\n  MessageGroupTextContainer,\n  MessageGroupByline,\n  Usernames,\n  Timestamp,\n} from './style';\n\ntype Props = {\n  active: boolean,\n  currentUser: Object,\n  thread: GetDirectMessageThreadType,\n};\n\nclass ListCardItemDirectMessageThread extends React.Component<Props> {\n  render() {\n    const { thread, currentUser, active } = this.props;\n\n    // convert the server time to an iso timestamp\n    const timestamp = new Date(thread.threadLastActive).getTime();\n\n    // get the difference in a readable format (e.g 'a week ago')\n    const threadTimeDifference = timeDifference(Date.now(), timestamp);\n\n    // filter currentUser out\n    const participants = thread.participants.filter(\n      user => user.userId !== currentUser.id\n    );\n    // concat a string of users' names for thread messages\n    let participantsArray =\n      participants.length > 1\n        ? participants\n            .map(user => user.name)\n            .join(', ')\n            .replace(/,(?!.*,)/gim, ' and')\n        : participants[0].name;\n    // pass participants to a helper function to generate the avatar displays\n    const avatars = renderAvatars(participants);\n\n    return (\n      <Wrapper active={active}>\n        <WrapperLink to={`/messages/${thread.id}`}>\n          <Row>\n            {avatars}\n            <MessageGroupTextContainer>\n              <MessageGroupByline>\n                <Usernames>\n                  <p>{participantsArray}</p>\n                </Usernames>\n                <Timestamp>{threadTimeDifference}</Timestamp>\n              </MessageGroupByline>\n              <Meta nowrap>{thread.snippet}</Meta>\n            </MessageGroupTextContainer>\n          </Row>\n        </WrapperLink>\n      </Wrapper>\n    );\n  }\n}\n\nexport default ListCardItemDirectMessageThread;\n"
  },
  {
    "path": "src/views/directMessages/components/messages.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { sortAndGroupMessages } from 'shared/clients/group-messages';\nimport ChatMessages from 'src/components/messageGroup';\nimport { Loading } from 'src/components/loading';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport NextPageButton from 'src/components/nextPageButton';\nimport getDirectMessageThreadMessages from 'shared/graphql/queries/directMessageThread/getDirectMessageThreadMessageConnection';\nimport type { GetDirectMessageThreadMessageConnectionType } from 'shared/graphql/queries/directMessageThread/getDirectMessageThreadMessageConnection';\nimport { MessagesScrollWrapper } from './style';\nimport { ErrorBoundary } from 'src/components/error';\n\ntype Props = {\n  id: string,\n  data: {\n    loading: boolean,\n    directMessageThread: GetDirectMessageThreadMessageConnectionType,\n    messages: Array<Object>,\n    hasNextPage: boolean,\n    fetchMore: Function,\n  },\n  isLoading: boolean,\n  hasError: boolean,\n  isFetchingMore: boolean,\n};\n\nclass MessagesWithData extends React.Component<Props> {\n  componentDidMount() {\n    const thread = this.props.data.directMessageThread;\n    // Scroll to bottom on mount if we got cached data as getSnapshotBeforeUpdate does not fire for mounts\n    if (thread) {\n      const elem = document.getElementById('main');\n      if (!elem) return;\n      elem.scrollTop = elem.scrollHeight;\n    }\n  }\n\n  getSnapshotBeforeUpdate(prev) {\n    const curr = this.props;\n    // First load\n    if (\n      !prev.data.directMessageThread &&\n      curr.data.directMessageThread &&\n      curr.data.directMessageThread.messageConnection.edges.length > 0\n    ) {\n      return {\n        type: 'bottom',\n      };\n    }\n\n    // New messages\n    if (\n      prev.data.directMessageThread &&\n      curr.data.directMessageThread &&\n      prev.data.directMessageThread.messageConnection.edges.length <\n        curr.data.directMessageThread.messageConnection.edges.length\n    ) {\n      const elem = document.getElementById('main');\n      if (!elem) return null;\n\n      // If we are near the bottom when new messages come in, stick to the bottom\n      if (elem.scrollHeight < elem.scrollTop + elem.clientHeight + 400) {\n        return {\n          type: 'bottom',\n        };\n      }\n\n      const prevEdges = prev.data.directMessageThread.messageConnection.edges.filter(\n        Boolean\n      );\n      const currEdges = curr.data.directMessageThread.messageConnection.edges.filter(\n        Boolean\n      );\n      // If messages were added at the end, keep the scroll position the same\n      if (\n        currEdges[currEdges.length - 1].node.id ===\n        prevEdges[prevEdges.length - 1].node.id\n      ) {\n        return null;\n      }\n\n      // If messages were added at the top, persist the scroll position\n      return {\n        type: 'persist',\n        values: {\n          top: elem.scrollTop,\n          height: elem.scrollHeight,\n        },\n      };\n    }\n    return null;\n  }\n\n  componentDidUpdate(prev, _, snapshot) {\n    if (snapshot) {\n      const elem = document.getElementById('main');\n      if (elem) {\n        switch (snapshot.type) {\n          case 'bottom': {\n            elem.scrollTop = elem.scrollHeight;\n            break;\n          }\n          case 'persist': {\n            elem.scrollTop =\n              elem.scrollHeight - snapshot.values.height + snapshot.values.top;\n            break;\n          }\n          default: {\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  render() {\n    const {\n      data: { messages, directMessageThread, hasNextPage, fetchMore },\n      hasError,\n      isLoading,\n      isFetchingMore,\n    } = this.props;\n\n    if (hasError) {\n      return <div>Error!</div>;\n    }\n\n    // NOTE(@mxstbr): The networkStatus check shouldn't be there, but if I remove\n    // it the loading indicator doesn't show when switching between threads which\n    // is hella annoying as the old msgs stick around until the new ones are there.\n    // TODO: FIXME and remove the networkStatus === 7\n    if (isFetchingMore || (messages && messages.length > 0)) {\n      let unsortedMessages = messages.map(message => message.node);\n\n      const unique = array => {\n        const processed = [];\n        for (let i = array.length - 1; i >= 0; i--) {\n          if (processed.indexOf(array[i].id) < 0) {\n            processed.push(array[i].id);\n          } else {\n            array.splice(i, 1);\n          }\n        }\n        return array;\n      };\n\n      const uniqueMessages = unique(unsortedMessages);\n      const sortedMessages = sortAndGroupMessages(uniqueMessages);\n\n      return (\n        <MessagesScrollWrapper>\n          <ErrorBoundary>\n            {hasNextPage && (\n              <NextPageButton\n                isFetchingMore={isFetchingMore}\n                fetchMore={fetchMore}\n              />\n            )}\n            <ChatMessages\n              messages={sortedMessages}\n              uniqueMessageCount={uniqueMessages.length}\n              threadType={'directMessageThread'}\n              thread={directMessageThread}\n            />\n          </ErrorBoundary>\n        </MessagesScrollWrapper>\n      );\n    }\n\n    if (isLoading) {\n      return (\n        <MessagesScrollWrapper>\n          <Loading style={{ padding: '64px 0' }} />\n        </MessagesScrollWrapper>\n      );\n    }\n\n    return null;\n  }\n}\n\nconst Messages = compose(\n  getDirectMessageThreadMessages,\n  viewNetworkHandler\n)(MessagesWithData);\n\nexport default Messages;\n"
  },
  {
    "path": "src/views/directMessages/components/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { UserAvatar } from 'src/components/avatar';\nimport { MEDIA_BREAK, TITLEBAR_HEIGHT } from 'src/components/layout';\nimport {\n  Truncate,\n  FlexCol,\n  FlexRow,\n  H3,\n  H4,\n  P,\n  hexa,\n  zIndex,\n} from 'src/components/globals';\n\nexport const ThreadsListScrollContainer = styled.div`\n  height: calc(100vh - ${TITLEBAR_HEIGHT}px);\n  background: ${theme.bg.default};\n`;\n\nexport const Wrapper = styled(FlexCol)`\n  flex: 0 0 auto;\n  justify-content: center;\n  max-width: 100%;\n  min-height: 64px;\n  position: relative;\n  background: ${props => (props.active ? theme.bg.wash : theme.bg.default)};\n  border-bottom: 1px solid ${theme.bg.divider};\n  box-shadow: ${props =>\n    props.active ? `inset 2px 0 0 ${props.theme.text.placeholder}` : 'none'};\n\n  &:hover {\n    cursor: pointer;\n    background: ${theme.bg.wash};\n  }\n`;\n\nexport const WrapperLink = styled(Link)`\n  height: 100%;\n  display: flex;\n  align-items: center;\n  padding: 16px 12px 16px 16px;\n`;\n\nexport const Col = styled(FlexCol)`\n  flex: 1;\n`;\n\nexport const Row = styled(FlexRow)`\n  flex: 1 0 auto;\n  align-items: center;\n  max-width: 100%;\n\n  a {\n    display: flex;\n    align-items: center;\n  }\n`;\n\nexport const Heading = styled(H3)`\n  font-weight: 700;\n`;\n\nexport const Meta = styled(H4)`\n  font-size: 15px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n\n  ${props => (props.nowrap ? Truncate() : '')};\n`;\n\nexport const Description = styled(P)`\n  margin-top: 8px;\n  font-weight: 400;\n  color: ${theme.text.default};\n`;\n\nexport const MessageGroupTextContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1 0 calc(100% - 64px);\n  overflow: hidden;\n  position: relative;\n  top: -1px;\n`;\n\nexport const MessageGroupByline = styled.div`\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: baseline;\n`;\n\nexport const Usernames = styled.span`\n  display: flex;\n  overflow: hidden;\n  flex-wrap: nowrap;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden;\n  color: ${theme.text.default};\n  font-weight: 600;\n  line-height: 1.2;\n  margin-bottom: 1px;\n  font-size: 15px;\n  flex: 1 1 100%;\n\n  p {\n    ${Truncate()};\n  }\n`;\n\nexport const Timestamp = styled.span`\n  font-size: 14px;\n  text-align: right;\n  color: ${theme.text.alt};\n  padding-right: 4px;\n  display: inline-block;\n  flex: 1 0 auto;\n  margin-left: 8px;\n`;\n\nexport const Snippet = styled.p`\n  font-size: 15px;\n  font-weight: 400;\n  color: ${theme.text.secondary};\n  padding-right: 4px;\n  display: inline-block;\n  line-height: 1.3;\n  margin-top: 0;\n  max-width: 100%;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n`;\n\nexport const AvatarContainer = styled.div`\n  margin-right: 16px;\n  width: 44px;\n  height: 44px;\n  position: relative;\n\n  img {\n    box-shadow: 0 0 0 2px #fff;\n  }\n`;\n\nexport const TwoAvatarContainer = styled(AvatarContainer)`\n  width: 60px;\n  height: 60px;\n  position: relative;\n\n  span {\n    margin: 1px;\n\n    &:first-child {\n      position: absolute;\n      z-index: ${zIndex.avatar};\n      top: 4px;\n      left: 0;\n    }\n\n    &:last-child {\n      position: absolute;\n      z-index: ${zIndex.avatar + 1};\n      bottom: 4px;\n      right: 0;\n    }\n  }\n`;\n\nexport const TwoAvatarWrap = styled(AvatarContainer)`\n  &:first-child {\n    position: absolute;\n    z-index: ${zIndex.avatar};\n    top: 4px;\n    left: 0;\n    width: 34px;\n    height: 34px;\n  }\n\n  &:last-child {\n    position: absolute;\n    z-index: ${zIndex.avatar + 1};\n    bottom: 4px;\n    right: 0;\n    margin: 0;\n    width: 34px;\n    height: 34px;\n  }\n`;\n\nexport const ThreeAvatarContainer = styled(AvatarContainer)`\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n\n  img {\n    margin: 1px;\n\n    &:last-child {\n      margin-top: 0;\n    }\n  }\n`;\n\nexport const Remainder = styled.span`\n  border-radius: 19px;\n  width: 19px;\n  height: 19px;\n  padding: 0 2px;\n  font-size: 9px;\n  font-weight: 700;\n  color: ${theme.text.alt};\n  background: ${theme.bg.wash};\n  margin: 2px 1px 1px 2px;\n  overflow: hidden;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n`;\n\nexport const ComposerInputWrapper = styled.div`\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  display: block;\n`;\n\nexport const Grow = styled.div`\n  position: relative;\n  flex: 1 1 auto;\n  justify-content: center;\n  align-items: stretch;\n  width: 100%;\n  height: 100%;\n`;\n\nexport const ComposerInput = styled.input`\n  font-size: 16px;\n  padding: 15px 16px;\n  width: 100%;\n  border-bottom: 1px solid ${theme.bg.border};\n  position: relative;\n  z-index: ${zIndex.search};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 20px 16px;\n  }\n`;\n\nexport const SearchSpinnerContainer = styled.span`\n  position: absolute;\n  top: 8px;\n  right: 8px;\n  width: 32px;\n  height: 32px;\n  z-index: ${zIndex.loading};\n`;\n\nexport const SearchResultsDropdown = styled.ul`\n  border-radius: 8px;\n  overflow: hidden;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n  position: absolute;\n  top: ${props => (props.moved ? '104px' : '60px')};\n  left: 8px;\n  display: inline-block;\n  width: 320px;\n  max-height: 420px;\n  overflow-y: auto;\n  z-index: ${zIndex.dropDown};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n    left: 0;\n    border-radius: 0 0 8px 8px;\n  }\n`;\n\nexport const SearchResult = styled.li`\n  display: flex;\n  align-items: center;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: ${props => (props.focused ? props.theme.bg.wash : '#fff')};\n  width: 100%;\n  ${Truncate()} padding: 8px 16px 8px 8px;\n\n  &:only-child {\n    border-bottom: none;\n  }\n\n  &:last-child {\n    border-bottom: none;\n  }\n\n  &:hover {\n    background: ${theme.bg.wash};\n    cursor: pointer;\n  }\n`;\n\nexport const SearchResultImage = styled(UserAvatar)``;\n\nexport const SearchResultTextContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1 1 auto;\n  margin-left: 12px;\n`;\n\nexport const SearchResultDisplayName = styled.p`\n  font-size: 14px;\n  font-weight: 600;\n  color: ${theme.text.default};\n  line-height: 1.4;\n`;\n\nexport const SearchResultUsername = styled.p`\n  font-size: 12px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  line-height: 1.4;\n`;\n\nexport const SearchResultNull = styled.p`\n  text-align: center;\n  font-size: 14px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n`;\n\nexport const SelectedUsersPills = styled.ul`\n  position: relative;\n  width: 100%;\n  font-size: 16px;\n  padding: 9px 12px;\n  width: 100%;\n  background: #fff;\n`;\n\nexport const Pill = styled.li`\n  list-style-type: none;\n  display: inline-block;\n  font-size: 14px;\n  background: ${props =>\n    props.selected\n      ? props.theme.brand.default\n      : hexa(props.theme.brand.default, 0.1)};\n  box-shadow: inset 0 0 1px rgba(123, 22, 255, 0.15);\n  color: ${props =>\n    props.selected ? props.theme.bg.default : props.theme.brand.default};\n  border-radius: 4px;\n  padding: 2px 12px;\n  margin-right: 4px;\n`;\n\nexport const StyledHeader = styled.div`\n  display: flex;\n  flex: ${props => (props.fill ? '1 0 auto' : '0 0 auto')};\n  justify-content: center;\n  align-items: center;\n  align-self: ${props => (props.fill ? 'center' : 'flex-start')};\n  flex-direction: column;\n  width: 100%;\n  background: ${props => (props.wash ? props.theme.bg.wash : '#fff')};\n  padding: 32px;\n  padding-bottom: 0;\n`;\n\nexport const PhotosContainer = styled.div`\n  display: block;\n  padding: 8px 0;\n`;\n\nexport const PhotoWrapper = styled.span`\n  margin: 0 6px;\n  display: inline-block;\n`;\n\nexport const Photo = styled(UserAvatar)`\n  border: 1px solid #fff;\n`;\n\nexport const Names = styled.h2`\n  display: block;\n  font-weight: 800;\n  font-size: 24px;\n  color: ${theme.text.default};\n  text-align: center;\n  line-height: 1.4;\n`;\n\nexport const Username = styled.h3`\n  display: block;\n  font-weight: 500;\n  font-size: 14px;\n  color: ${theme.text.alt};\n  margin: 0;\n  display: flex;\n`;\n\nexport const MessagesScrollWrapper = styled.div`\n  width: 100%;\n  padding-top: 24px;\n`;\n"
  },
  {
    "path": "src/views/directMessages/components/threadsList.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport VisibilitySensor from 'react-visibility-sensor';\nimport DirectMessageListItem from './messageThreadListItem';\nimport getCurrentUserDMThreadConnection, {\n  type GetCurrentUserDMThreadConnectionType,\n} from 'shared/graphql/queries/directMessageThread/getCurrentUserDMThreadConnection';\nimport { deduplicateChildren } from 'src/components/infiniteScroll/deduplicateChildren';\nimport { LoadingDM } from 'src/components/loading';\nimport { ThreadsListScrollContainer } from './style';\nimport { ErrorBoundary } from 'src/components/error';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { useConnectionRestored } from 'src/hooks/useConnectionRestored';\nimport type { WebsocketConnectionType } from 'src/reducers/connectionStatus';\nimport type { Query } from 'react-apollo';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport { DesktopTitlebar } from 'src/components/titlebar';\nimport { NoCommunitySelected, NoCommunityHeading } from '../style';\n\ntype Props = {\n  currentUser: Object,\n  networkOnline: boolean,\n  websocketConnection: WebsocketConnectionType,\n  activeThreadId: ?string,\n  ...$Exact<ViewNetworkHandlerType>,\n  dmData: {\n    ...$Exact<Query>,\n    user: {\n      ...$Exact<GetCurrentUserDMThreadConnectionType>,\n    },\n  },\n};\n\nclass ThreadsList extends React.Component<Props> {\n  componentDidUpdate(prev: Props) {\n    const curr = this.props;\n\n    const didReconnect = useConnectionRestored({ curr, prev });\n    if (didReconnect && curr.dmData.refetch) {\n      curr.dmData.refetch();\n    }\n  }\n\n  shouldComponentUpdate(nextProps) {\n    const curr = this.props;\n    // fetching more\n    if (curr.dmData.networkStatus === 7 && nextProps.dmData.networkStatus === 3)\n      return false;\n    return true;\n  }\n\n  paginate = () => {\n    const { dmData, activeThreadId } = this.props;\n    // don't accidentally paginate the threadslist in the background on mobile\n    if (window && window.innerWidth < 768 && activeThreadId) return;\n    return dmData.fetchMore();\n  };\n\n  onLoadMoreVisible = (isVisible: boolean) => {\n    if (this.props.isFetchingMore || !isVisible) return;\n    return this.paginate();\n  };\n\n  render() {\n    const { currentUser, dmData, activeThreadId, isFetchingMore } = this.props;\n\n    if (!dmData) return null;\n\n    const dmDataExists =\n      currentUser && dmData.user && dmData.user.directMessageThreadsConnection;\n    const threads =\n      dmDataExists &&\n      dmData.user.directMessageThreadsConnection.edges &&\n      dmData.user.directMessageThreadsConnection.edges.length > 0\n        ? dmData.user.directMessageThreadsConnection.edges\n            .map(thread => thread && thread.node)\n            .sort((a, b) => {\n              const x =\n                a &&\n                a.threadLastActive &&\n                new Date(a.threadLastActive).getTime();\n              const y =\n                b &&\n                b.threadLastActive &&\n                new Date(b.threadLastActive).getTime();\n              const val = parseInt(y, 10) - parseInt(x, 10);\n              return val;\n            })\n        : [];\n\n    const hasNextPage =\n      dmData.user &&\n      dmData.user.directMessageThreadsConnection &&\n      dmData.user.directMessageThreadsConnection.pageInfo &&\n      dmData.user.directMessageThreadsConnection.pageInfo.hasNextPage;\n\n    const uniqueThreads = deduplicateChildren(threads, 'id');\n\n    if (!dmDataExists && dmData.loading) {\n      return (\n        <ThreadsListScrollContainer>\n          <DesktopTitlebar title={'Messages'} />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n          <LoadingDM />\n        </ThreadsListScrollContainer>\n      );\n    }\n\n    if (!uniqueThreads || uniqueThreads.length === 0) {\n      return (\n        <ThreadsListScrollContainer>\n          <DesktopTitlebar title={'Messages'} />\n          <NoCommunitySelected hideOnDesktop>\n            <div>\n              <NoCommunityHeading>No conversation selected</NoCommunityHeading>\n            </div>\n          </NoCommunitySelected>\n        </ThreadsListScrollContainer>\n      );\n    }\n\n    const LoadingDMWithVisibility = () => (\n      <VisibilitySensor\n        active={!isFetchingMore}\n        delayedCall\n        partialVisibility\n        scrollCheck\n        intervalDelay={250}\n        onChange={this.onLoadMoreVisible}\n        offset={{\n          bottom: -250,\n        }}\n      >\n        <LoadingDM key={0} />\n      </VisibilitySensor>\n    );\n\n    return (\n      <React.Fragment>\n        <DesktopTitlebar title={'Messages'} />\n        <ThreadsListScrollContainer>\n          {uniqueThreads.map(thread => {\n            if (!thread) return null;\n            return (\n              <ErrorBoundary key={thread.id}>\n                <DirectMessageListItem\n                  thread={thread}\n                  currentUser={currentUser}\n                  active={activeThreadId === thread.id}\n                />\n              </ErrorBoundary>\n            );\n          })}\n          {hasNextPage && <LoadingDMWithVisibility />}\n        </ThreadsListScrollContainer>\n      </React.Fragment>\n    );\n  }\n}\n\nconst map = state => ({\n  networkOnline: state.connectionStatus.networkOnline,\n  websocketConnection: state.connectionStatus.websocketConnection,\n});\n\nexport default compose(\n  withCurrentUser,\n  getCurrentUserDMThreadConnection,\n  viewNetworkHandler,\n  // $FlowIssue\n  connect(map)\n)(ThreadsList);\n"
  },
  {
    "path": "src/views/directMessages/containers/existingThread.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport { withApollo } from 'react-apollo';\nimport { Link } from 'react-router-dom';\nimport Icon from 'src/components/icon';\nimport Messages from '../components/messages';\nimport Header from '../components/header';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport getDirectMessageThread, {\n  type GetDirectMessageThreadType,\n} from 'shared/graphql/queries/directMessageThread/getDirectMessageThread';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport { UserAvatar } from 'src/components/avatar';\nimport { MessagesContainer, ViewContent } from '../style';\nimport { Loading } from 'src/components/loading';\nimport { ErrorBoundary } from 'src/components/error';\nimport type { WebsocketConnectionType } from 'src/reducers/connectionStatus';\nimport { useConnectionRestored } from 'src/hooks/useConnectionRestored';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { LoadingView, ErrorView } from 'src/views/viewHelpers';\nimport { DesktopTitlebar } from 'src/components/titlebar';\n\ntype Props = {\n  data: {\n    refetch: Function,\n    directMessageThread: GetDirectMessageThreadType,\n  },\n  isLoading: boolean,\n  match: Object,\n  id: ?string,\n  currentUser: Object,\n  threadSliderIsOpen: boolean,\n  networkOnline: boolean,\n  websocketConnection: WebsocketConnectionType,\n  dispatch: Dispatch<Object>,\n};\n\nclass ExistingThread extends React.Component<Props> {\n  componentDidMount() {\n    const { threadId } = this.props.match.params;\n\n    // escape to prevent this from running on mobile\n    if (!threadId) return;\n  }\n\n  componentDidUpdate(prev) {\n    const curr = this.props;\n    const { dispatch, currentUser } = curr;\n\n    const didReconnect = useConnectionRestored({ curr, prev });\n    if (didReconnect && curr.data.refetch) {\n      curr.data.refetch();\n    }\n\n    if (curr.data.directMessageThread) {\n      const thread = curr.data.directMessageThread;\n      const trimmedUsers = thread.participants.filter(\n        user => user.userId !== currentUser.id\n      );\n      const titleIcon =\n        trimmedUsers.length === 1 ? (\n          <UserAvatar user={trimmedUsers[0]} size={24} />\n        ) : null;\n      const rightAction =\n        trimmedUsers.length === 1 ? (\n          <Link to={`/users/${trimmedUsers[0].username}`}>\n            <Icon glyph={'info'} />\n          </Link>\n        ) : null;\n      const names = trimmedUsers.map(user => user.name).join(', ');\n      dispatch(\n        setTitlebarProps({\n          title: names,\n          titleIcon,\n          rightAction,\n          leftAction: 'view-back',\n        })\n      );\n    }\n\n    // if the thread slider is open, dont be focusing shit up in heyuhr\n    if (curr.threadSliderIsOpen) return;\n    if (prev.match.params.threadId !== curr.match.params.threadId) {\n      const threadId = curr.match.params.threadId;\n\n      // prevent unnecessary behavior on mobile\n      if (!threadId) return;\n    }\n  }\n\n  render() {\n    const id = this.props.match.params.threadId;\n    const { currentUser, data, isLoading } = this.props;\n\n    if (id !== 'new') {\n      if (data.directMessageThread) {\n        const thread = data.directMessageThread;\n        const trimmedUsers = thread.participants.filter(\n          user => user.userId !== currentUser.id\n        );\n        const titleIcon =\n          trimmedUsers.length === 1 ? (\n            <UserAvatar user={trimmedUsers[0]} size={24} />\n          ) : null;\n        const rightAction =\n          trimmedUsers.length === 1 ? (\n            <Link to={`/users/${trimmedUsers[0].username}`}>\n              <Icon glyph={'info'} />\n            </Link>\n          ) : null;\n        const names = trimmedUsers.map(user => user.name).join(', ');\n        return (\n          <div style={{ display: 'flex', flexDirection: 'column' }}>\n            <DesktopTitlebar\n              title={names}\n              titleIcon={titleIcon}\n              rightAction={rightAction}\n            />\n            <MessagesContainer>\n              <ViewContent>\n                {!isLoading ? (\n                  <React.Fragment>\n                    <ErrorBoundary>\n                      <Header thread={thread} currentUser={currentUser} />\n                    </ErrorBoundary>\n\n                    <Messages\n                      id={id}\n                      currentUser={currentUser}\n                      thread={thread}\n                    />\n                  </React.Fragment>\n                ) : (\n                  <Loading />\n                )}\n              </ViewContent>\n            </MessagesContainer>\n          </div>\n        );\n      }\n\n      if (isLoading) {\n        return <LoadingView />;\n      }\n\n      return <ErrorView />;\n    }\n\n    /*\n      if we are viewing /new we will handle the messages view in the composer\n      component\n    */\n    return null;\n  }\n}\n\nconst map = state => ({\n  networkOnline: state.connectionStatus.networkOnline,\n  websocketConnection: state.connectionStatus.websocketConnection,\n  threadSliderIsOpen: state.threadSlider.isOpen,\n});\nexport default compose(\n  // $FlowIssue\n  connect(map),\n  getDirectMessageThread,\n  withApollo,\n  withCurrentUser,\n  viewNetworkHandler\n)(ExistingThread);\n"
  },
  {
    "path": "src/views/directMessages/containers/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport type { Match } from 'react-router';\nimport Head from 'src/components/head';\nimport ThreadsList from '../components/threadsList';\nimport ExistingThread from './existingThread';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport {\n  ViewGrid,\n  SecondaryPrimaryColumnGrid,\n  PrimaryColumn,\n} from 'src/components/layout';\nimport {\n  StyledSecondaryColumn,\n  NoCommunitySelected,\n  NoCommunityHeading,\n} from '../style';\n\ntype Props = {\n  match: Match,\n  dispatch: Dispatch<Object>,\n};\n\ntype State = {\n  activeThreadId: string,\n};\n\nclass DirectMessages extends React.Component<Props, State> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    dispatch(\n      setTitlebarProps({\n        title: 'Messages',\n      })\n    );\n  }\n\n  componentDidUpdate() {\n    const { match, dispatch } = this.props;\n    const { params } = match;\n    if (!params.threadId) {\n      dispatch(\n        setTitlebarProps({\n          title: 'Messages',\n        })\n      );\n    }\n  }\n\n  render() {\n    const { match } = this.props;\n    const activeThreadId = match.params.threadId;\n\n    return (\n      <ViewGrid>\n        <SecondaryPrimaryColumnGrid>\n          <StyledSecondaryColumn shouldHideThreadList={!!activeThreadId}>\n            <ThreadsList activeThreadId={activeThreadId} />\n          </StyledSecondaryColumn>\n\n          <PrimaryColumn>\n            {activeThreadId ? (\n              <ExistingThread id={activeThreadId} match={match} />\n            ) : (\n              <NoCommunitySelected>\n                <Head title={'Messages'} />\n                <div>\n                  <NoCommunityHeading>\n                    No conversation selected\n                  </NoCommunityHeading>\n                </div>\n              </NoCommunitySelected>\n            )}\n          </PrimaryColumn>\n        </SecondaryPrimaryColumnGrid>\n      </ViewGrid>\n    );\n  }\n}\n\nexport default connect()(DirectMessages);\n"
  },
  {
    "path": "src/views/directMessages/index.js",
    "content": "// @flow\nimport React from 'react';\nimport Loadable from 'react-loadable';\nimport { LoadingView } from 'src/views/viewHelpers';\n\n/* prettier-ignore */\nconst DirectMessages = Loadable({\n  loader: () => import('./containers/index.js'/* webpackChunkName: \"DirectMessages\" */),\n  loading: ({ isLoading }) => isLoading && <LoadingView />,\n});\n\nexport default DirectMessages;\n"
  },
  {
    "path": "src/views/directMessages/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { SecondaryColumn, MEDIA_BREAK } from 'src/components/layout';\n\nexport const View = styled.main`\n  grid-area: main;\n  display: grid;\n  grid-template-columns: minmax(320px, 400px) 1fr;\n`;\n\nexport const ViewContent = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-end;\n  flex: 1;\n`;\n\nexport const MessagesList = styled.div`\n  background: ${theme.bg.default};\n  border-right: 1px solid ${theme.bg.border};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    min-width: 320px;\n    border-right: none;\n    max-width: 100%;\n    display: ${props => (props.isViewingThread ? 'none' : 'flex')};\n  }\n`;\n\nexport const MessagesContainer = styled.div`\n  display: flex;\n  flex-direction: column;\n  background: ${theme.bg.default};\n  flex: 1;\n`;\n\nexport const NoThreads = styled(MessagesContainer)`\n  position: absolute;\n  top: 50%;\n  width: 100%;\n  transform: translateY(-50%);\n  background: #fff;\n\n  h2 {\n    max-width: 600px;\n  }\n`;\n\nexport const ComposeHeader = styled.div`\n  position: sticky;\n  top: 0;\n  z-index: 10;\n  justify-content: flex-end;\n  padding: 8px;\n  border-bottom: 1px solid ${theme.bg.border};\n  color: ${theme.brand.default};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const StyledSecondaryColumn = styled(SecondaryColumn)`\n  border-left: 1px solid ${theme.bg.border};\n  border-right: 1px solid ${theme.bg.border};\n  padding-right: 0;\n  padding-bottom: 0;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-left: 0;\n    border-right: 0;\n    display: grid;\n    display: ${props => (props.shouldHideThreadList ? 'none' : 'block')};\n  }\n`;\n\nexport const NoCommunitySelected = styled.div`\n  display: flex;\n  height: 100vh;\n  align-items: center;\n  justify-content: center;\n  flex-direction: column;\n  text-align: center;\n  padding: 24px;\n  background: ${theme.bg.default};\n\n  button {\n    flex: 1;\n  }\n\n  @media (min-width: ${MEDIA_BREAK}px) {\n    ${props =>\n      props.hideOnDesktop &&\n      css`\n        display: none;\n      `}\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const NoCommunityHeading = styled.h3`\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.3;\n  margin-bottom: 8px;\n  color: ${theme.text.default};\n`;\nexport const NoCommunitySubheading = styled.p`\n  margin-top: 8px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n  padding-right: 24px;\n  margin-bottom: 24px;\n`;\n"
  },
  {
    "path": "src/views/explore/collections.js",
    "content": "export const collections = [\n  {\n    title: 'Top Communities',\n    curatedContentType: 'top-communities-by-members',\n    communities: [\n      'spectrum',\n      'codesandbox',\n      'codepen',\n      'figma',\n      'react',\n      'specfm',\n      'product-design',\n      'sketch',\n      'styled-components',\n      'framer',\n      'frontend',\n      'wip',\n      'abstract',\n      'crypto',\n      'sketchcasts',\n      'tech-tea',\n      'design-code',\n      'journalism',\n    ],\n  },\n  {\n    title: 'Design',\n    curatedContentType: 'design-communities',\n    communities: [\n      'product-design',\n      'icon-design',\n      'typography',\n      'illustrators',\n      'design-management',\n      'specfm',\n      'up-coming',\n      'sketchcasts',\n      'google-design',\n      'design-code',\n      'codepen',\n      'vectors',\n      'designhunt',\n      'figma',\n      'sketch',\n      'framer',\n      'abstract',\n      'invision',\n      'compositor',\n      'zeplin',\n      'origami-studio',\n      'fuse',\n    ],\n  },\n  {\n    title: 'Web development',\n    curatedContentType: 'development-communities',\n    communities: [\n      'react',\n      'node',\n      'codesandbox',\n      'vue-js',\n      'angular',\n      'ember-js',\n      'laravel',\n      'elixir',\n      'styled-components',\n      'graphql',\n      'css-in-js',\n      'electron',\n      'android',\n      'swiftdev',\n      'react-native',\n      'frontend',\n      'specfm',\n      'realm',\n      'expo',\n      'compositor',\n      'codepen',\n      'bootstrap',\n      'tachyons',\n      'divjoy',\n    ],\n  },\n  {\n    title: 'Tech',\n    curatedContentType: 'tech-communities',\n    communities: [\n      'tech-tea',\n      'balancemymoney',\n      'crypto',\n      'btc',\n      'ethereum',\n      'augmented-reality',\n      'voice-interfaces',\n    ],\n  },\n  {\n    title: 'Life',\n    curatedContentType: 'life-communities',\n    communities: [\n      'for-good',\n      'mental-health',\n      'dev-fit',\n      'music',\n      'photography',\n      'tabletop-rpg',\n      'gaming',\n      'careers',\n      'job-opportunities',\n      'need-some-work',\n    ],\n  },\n];\n"
  },
  {
    "path": "src/views/explore/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport Head from 'src/components/head';\nimport { Charts } from './view';\nimport { ErrorBoundary } from 'src/components/error';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { ViewGrid } from 'src/components/layout';\nimport { setTitlebarProps } from 'src/actions/titlebar';\n\ntype Props = {\n  currentUser?: Object,\n  dispatch: Function,\n};\n\nclass Explore extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    dispatch(setTitlebarProps({ title: 'Explore' }));\n  }\n\n  render() {\n    const { title, description } = generateMetaInfo({\n      type: 'explore',\n    });\n\n    // previous features include: Vectors, Frontend Cafe, Abstract, Work in Progress, Mental Health\n    // const featureSlug = 'crypto';\n    // const featureNotes = `Crypto is a place to discuss crypto-currencies and tokens. As blockchain technology becomes more and more mainstream, communities like Crypto allow more people to get involved, learn, and share what they know. We're all for that, so if you're an existing investor, a newcomer to crypto-currencies, or just interested in learning about blockchain, check out Crypto!`;\n\n    return (\n      <React.Fragment>\n        <Head title={title} description={description} />\n        <ViewGrid data-cy=\"explore-page\">\n          <ErrorBoundary>\n            <Charts />\n          </ErrorBoundary>\n        </ViewGrid>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  connect()\n)(Explore);\n"
  },
  {
    "path": "src/views/explore/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport {\n  FlexCol,\n  FlexRow,\n  H1,\n  H2,\n  H3,\n  P,\n  Transition,\n  Shadow,\n  hexa,\n  zIndex,\n} from 'src/components/globals';\nimport { StyledCard } from 'src/components/listItems/style';\nimport ScrollRow from 'src/components/scrollRow';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ViewTitle = styled(H1)`\n  margin-left: 48px;\n  margin-top: 48px;\n  font-size: 32px;\n  font-weight: 900;\n  color: ${theme.text.reverse};\n  position: relative;\n  z-index: ${zIndex.base};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-left: 16px;\n    margin-top: 16px;\n  }\n`;\n\nexport const ViewSubtitle = styled(H2)`\n  margin-left: 48px;\n  color: ${theme.text.reverse};\n  position: relative;\n  z-index: ${zIndex.base};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-left: 16px;\n    font-size: 16px;\n    line-height: 20px;\n  }\n`;\n\nexport const ListCard = styled(StyledCard)`\n  padding: 0;\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: flex;\n    margin-bottom: 32px;\n  }\n`;\n\nexport const Section = styled(FlexCol)`\n  padding: 32px;\n  padding-top: 0;\n  display: flex;\n  flex: none;\n  justify-content: space-between;\n  position: relative;\n  z-index: ${zIndex.base};\n  align-self: stretch;\n`;\n\nexport const SectionWrapper = styled(FlexRow)`\n  flex: none;\n  align-items: flex-start;\n  justify-content: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n  }\n`;\n\nexport const ViewHeader = styled(Section)`\n  flex: none;\n  padding: 120px 0 0 0;\n  justify-content: flex-end;\n  background-color: ${theme.space.dark};\n  background-image: ${({ theme }) =>\n    `radial-gradient(farthest-corner at 50% 100%, ${hexa(\n      theme.brand.alt,\n      0.75\n    )}, ${theme.space.dark} )`};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 48px 24px 0 24px;\n  }\n`;\n\nexport const SectionWithGradientTransition = styled(Section)`\n  background-image: ${({ theme }) =>\n    `linear-gradient(${theme.bg.default}, ${theme.bg.wash})`};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 32px;\n  }\n`;\n\nexport const SectionTitle = styled(H2)`\n  color: ${theme.text.default};\n  margin-left: 16px;\n  font-size: 32px;\n  margin-bottom: 16px;\n  font-weight: 800;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    font-size: 24px;\n  }\n`;\n\nexport const SectionSubtitle = styled(H3)`\n  color: ${theme.text.default};\n  margin-bottom: 8px;\n  margin-left: 48px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-left: 16px;\n  }\n`;\n\nexport const Row = styled(ScrollRow)`\n  max-width: 100%;\n  width: 100%;\n  flex: 0 0 320px;\n  padding: 8px 16px 32px 16px;\n  overflow-x: scroll;\n  align-items: flex-start;\n\n  &:after,\n  &:before {\n    content: '';\n    display: inline-block;\n    flex: 0 0 32px;\n    align-self: stretch;\n    background-color: transparent;\n  }\n`;\n\nexport const Item = styled(FlexCol)`\n  padding: 16px;\n  flex: 0 0 280px;\n  flex-order: ${props => (props.active ? '2' : '1')};\n  background-color: ${theme.bg.default};\n  color: ${theme.text.default};\n  border-radius: 16px;\n  margin-right: 24px;\n  justify-content: space-between;\n  position: relative;\n  opacity: ${props => (props.active ? '0.85' : '1')};\n  box-shadow: ${Shadow.low} ${props => hexa(props.theme.text.placeholder, 1)};\n  transition: ${Transition.hover.off};\n\n  &:hover {\n    box-shadow: ${Shadow.high} ${props => hexa(props.theme.text.placeholder, 1)};\n    transition: ${Transition.hover.on};\n    opacity: 1;\n  }\n`;\n\nexport const ItemTitle = styled(H2)`\n  font-weight: 700;\n  color: ${theme.text.default};\n`;\n\nexport const ItemCopy = styled(P)`\n  color: ${theme.text.default};\n  margin: 8px 0;\n`;\n\nexport const ItemMeta = styled(ItemCopy)`\n  font-weight: 900;\n  color: ${theme.text.placeholder};\n`;\n\nexport const Constellations = styled.div`\n  background-color: transparent;\n  background: url(/img/constellations.svg) center top no-repeat;\n  position: absolute;\n  background-size: cover 100%;\n  z-index: ${zIndex.background};\n  height: calc(100% + 4px);\n  width: 110%;\n  top: -10px;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  pointer-events: none;\n`;\n\nexport const ErrorState = styled(FlexCol)`\n  width: 100%;\n  margin-top: 32px;\n  h2 {\n    text-align: center;\n    opacity: 0.5;\n  }\n\n  p {\n    text-align: center;\n    opacity: 0.5;\n  }\n  &:not(:first-of-type) {\n    display: none;\n  }\n`;\n\nexport const ListWithTitle = styled(FlexCol)`\n  flex: auto;\n`;\n\nexport const ListTitle = styled(H2)`\n  border-bottom: 1px solid ${theme.bg.border};\n  padding-bottom: 8px;\n  padding-left: 16px;\n  font-weight: 500;\n  font-size: 18px;\n  margin-top: 32px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding-left: 32px;\n  }\n`;\n\nexport const ListWrapper = styled(FlexRow)`\n  display: grid;\n  grid-template-columns: repeat(3, minmax(320px, 1fr));\n  align-items: start;\n  grid-gap: 16px;\n  padding-bottom: 32px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-columns: repeat(2, minmax(320px, 1fr));\n  }\n\n  @media (max-width: 720px) {\n    grid-template-columns: 1fr;\n  }\n`;\n\nexport const ListItem = styled(FlexRow)``;\n\nexport const Collections = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: auto;\n`;\n\nexport const CollectionWrapper = styled.div`\n  display: flex;\n  flex-direction: column;\n  padding: 32px;\n  flex: auto;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 16px;\n  }\n`;\n\nexport const LoadingContainer = styled.div`\n  padding: 32px;\n`;\n\nexport const ProfileCardWrapper = styled.section`\n  background: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  border-radius: 4px;\n  overflow: hidden;\n`;\n"
  },
  {
    "path": "src/views/explore/view.js",
    "content": "// @flow\nimport * as React from 'react';\nimport styled from 'styled-components';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { collections } from './collections';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  ListWithTitle,\n  ListTitle,\n  ListWrapper,\n  Collections,\n  CollectionWrapper,\n  ProfileCardWrapper,\n} from './style';\nimport { getCommunitiesBySlug } from 'shared/graphql/queries/community/getCommunities';\nimport type { GetCommunitiesType } from 'shared/graphql/queries/community/getCommunities';\nimport { SegmentedControl, Segment } from 'src/components/segmentedControl';\nimport { ErrorBoundary } from 'src/components/error';\nimport { Loading } from 'src/components/loading';\nimport { ErrorView } from 'src/views/viewHelpers';\nimport { CommunityProfileCard } from 'src/components/entities';\n\nconst ChartGrid = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: auto;\n`;\n\nexport const Charts = () => {\n  return <ChartGrid>{collections && <CollectionSwitcher />}</ChartGrid>;\n};\n\ntype State = {\n  selectedView: string,\n};\n\nclass CollectionSwitcher extends React.Component<{}, State> {\n  state = {\n    selectedView: 'top-communities-by-members',\n  };\n\n  parentRef = null;\n  ref = null;\n\n  componentDidMount() {\n    this.parentRef = document.getElementById('main');\n  }\n\n  handleSegmentClick(selectedView) {\n    if (this.state.selectedView === selectedView) return;\n\n    return this.setState({ selectedView });\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    const currState = this.state;\n    if (prevState.selectedView !== currState.selectedView) {\n      if (!this.parentRef || !this.ref) return;\n      return (this.parentRef.scrollTop = this.ref.offsetTop);\n    }\n  }\n\n  render() {\n    return (\n      <Collections ref={el => (this.ref = el)}>\n        <SegmentedControl>\n          {collections.map((collection, i) => (\n            <Segment\n              key={i}\n              onClick={() =>\n                this.handleSegmentClick(collection.curatedContentType)\n              }\n              isActive={\n                collection.curatedContentType === this.state.selectedView\n              }\n            >\n              {collection.title}\n            </Segment>\n          ))}\n        </SegmentedControl>\n\n        <CollectionWrapper>\n          {collections.map((collection, index) => {\n            const communitySlugs = collection.communities;\n            return (\n              <div key={index}>\n                {collection.curatedContentType === this.state.selectedView && (\n                  <Category\n                    slugs={communitySlugs}\n                    curatedContentType={collection.curatedContentType}\n                  />\n                )}\n              </div>\n            );\n          })}\n        </CollectionWrapper>\n      </Collections>\n    );\n  }\n}\n\ntype CategoryListProps = {\n  title: string,\n  currentUser?: Object,\n  slugs: Array<string>,\n  data: {\n    communities?: GetCommunitiesType,\n  },\n  isLoading: boolean,\n};\nclass CategoryList extends React.Component<CategoryListProps> {\n  render() {\n    const {\n      data: { communities },\n      title,\n      slugs,\n      isLoading,\n    } = this.props;\n\n    if (communities) {\n      let filteredCommunities = communities;\n      if (slugs) {\n        filteredCommunities = communities.filter(c => {\n          if (!c) return null;\n          if (slugs.indexOf(c.slug) > -1) return c;\n          return null;\n        });\n      }\n\n      return (\n        <ListWithTitle>\n          {title ? <ListTitle>{title}</ListTitle> : null}\n          <ListWrapper>\n            {filteredCommunities.map(\n              (community, i) =>\n                community && (\n                  <ErrorBoundary key={i}>\n                    <ProfileCardWrapper>\n                      <CommunityProfileCard community={community} />\n                    </ProfileCardWrapper>\n                  </ErrorBoundary>\n                )\n            )}\n          </ListWrapper>\n        </ListWithTitle>\n      );\n    }\n\n    if (isLoading) {\n      return <Loading style={{ padding: '64px 32px', minHeight: '100vh' }} />;\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport const Category = compose(\n  withCurrentUser,\n  getCommunitiesBySlug,\n  viewNetworkHandler,\n  connect()\n)(CategoryList);\n"
  },
  {
    "path": "src/views/globalTitlebar/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter, type History } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { MobileTitlebar } from 'src/components/titlebar';\nimport { ErrorBoundary } from 'src/components/error';\nimport { isViewingMarketingPage } from 'src/helpers/is-viewing-marketing-page';\n\nexport type TitlebarPayloadProps = {\n  title: string,\n  titleIcon?: React$Node,\n  rightAction?: React$Node,\n  leftAction?: React$Element<*> | 'menu' | 'view-back',\n};\n\ntype TitlebarProps = {\n  ...$Exact<TitlebarPayloadProps>,\n  history: History,\n  currentUser: ?Object,\n};\n\nconst GlobalTitlebar = (props: TitlebarProps): React$Node => {\n  const {\n    title = 'Spectrum',\n    titleIcon = null,\n    rightAction = null,\n    leftAction = 'menu',\n    history,\n    currentUser,\n  } = props;\n\n  if (isViewingMarketingPage(history, currentUser)) {\n    return null;\n  }\n\n  return (\n    <ErrorBoundary fallbackComponent={<MobileTitlebar title=\"Error\" />}>\n      <MobileTitlebar\n        title={title}\n        titleIcon={titleIcon}\n        leftAction={leftAction}\n        rightAction={rightAction}\n      />\n    </ErrorBoundary>\n  );\n};\n\nconst map = (state): * => state.titlebar;\n\nexport default compose(\n  withRouter,\n  withCurrentUser,\n  connect(map)\n)(GlobalTitlebar);\n"
  },
  {
    "path": "src/views/homeViewRedirect/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { withRouter } from 'react-router';\nimport compose from 'recompose/compose';\nimport {\n  getCurrentUserCommunityConnection,\n  type GetUserCommunityConnectionType,\n} from 'shared/graphql/queries/user/getUserCommunityConnection';\nimport { SERVER_URL } from 'src/api/constants';\nimport { LoadingView } from 'src/views/viewHelpers';\nimport type { History } from 'react-router';\n\ntype Props = {\n  data: {\n    user: GetUserCommunityConnectionType,\n    loading: boolean,\n  },\n  history: History,\n};\n\nconst HomeViewRedirect = (props: Props) => {\n  console.log(' home view redirect');\n  const { data, history } = props;\n  const { user, loading } = data;\n\n  if (loading) return <LoadingView />;\n\n  console.log({ user });\n\n  // if the user slipped past our route fallback for signed in/out, force\n  // a logout and redirect back to the home page\n  if (!user) return history.replace(`${SERVER_URL}/auth/logout`);\n\n  const { communityConnection } = user;\n  const { edges } = communityConnection;\n  const communities = edges.map(edge => edge && edge.node);\n  // if the user hasn't joined any communities yet, help them find some\n  if (!communities || communities.length === 0) {\n    history.replace('/explore');\n    return null;\n  }\n\n  // Otherwise select the first one by rep\n  const sorted = communities.slice().filter(Boolean);\n\n  const first = sorted[0];\n  history.replace(`/${first.slug}`);\n  return null;\n};\n\nexport default compose(\n  getCurrentUserCommunityConnection,\n  withRouter\n)(HomeViewRedirect);\n"
  },
  {
    "path": "src/views/login/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { withRouter } from 'react-router';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport FullscreenView from 'src/components/fullscreenView';\nimport LoginButtonSet from 'src/components/loginButtonSet';\nimport { LargeTitle, FullscreenContent, CodeOfConduct } from './style';\nimport { CLIENT_URL } from 'src/api/constants';\nimport { setTitlebarProps } from 'src/actions/titlebar';\n\ntype Props = {\n  redirectPath: ?string,\n  signinType?: ?string,\n  close?: Function,\n  location?: Object,\n  dispatch: Function,\n  githubOnly?: boolean,\n};\n\nclass Login extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    dispatch(setTitlebarProps({ title: 'Login' }));\n  }\n\n  render() {\n    const { redirectPath, signinType = 'signin', githubOnly } = this.props;\n\n    return (\n      <FullscreenView closePath={CLIENT_URL}>\n        <FullscreenContent\n          data-cy=\"login-page\"\n          style={{ justifyContent: 'center' }}\n        >\n          <LargeTitle>Log in</LargeTitle>\n\n          <LoginButtonSet\n            githubOnly={githubOnly}\n            redirectPath={redirectPath}\n            signinType={signinType}\n          />\n\n          <CodeOfConduct>\n            By using Spectrum, you agree to our{' '}\n            <a\n              href=\"https://github.com/withspectrum/code-of-conduct\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              Code of Conduct\n            </a>\n            ,{' '}\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={\n                'https://help.github.com/en/github/site-policy/github-privacy-statement'\n              }\n            >\n              Privacy Statement\n            </a>\n            {', and '}\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={\n                'https://help.github.com/en/github/site-policy/github-terms-of-service'\n              }\n            >\n              Terms of Service\n            </a>\n            .\n          </CodeOfConduct>\n        </FullscreenContent>\n      </FullscreenView>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  connect()\n)(Login);\n"
  },
  {
    "path": "src/views/login/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { FlexRow, FlexCol, Gradient, zIndex } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Title = styled.h1`\n  color: ${theme.text.default};\n  width: 100%;\n  font-weight: 800;\n  font-size: 24px;\n  line-height: 1.25;\n  margin-bottom: 8px;\n  padding: 0;\n  font-size: 24px;\n  text-align: center;\n  letter-spacing: 0.2px;\n`;\n\nexport const LargeTitle = styled(Title)`\n  font-size: 40px;\n  font-weight: 900;\n  letter-spacing: 0.3px;\n  margin-bottom: 16px;\n`;\n\nexport const SmallTitle = styled(Title)`\n  font-size: 18px;\n`;\n\nexport const MiniTitle = styled(Title)`\n  font-weight: 700;\n  font-size: 1rem;\n  line-height: 1.25;\n`;\n\nexport const Actions = styled.div`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  button {\n    margin: 0 8px;\n  }\n`;\n\nexport const Subtitle = styled.h2`\n  width: 100%;\n  color: ${theme.text.alt};\n  font-weight: 500;\n  font-size: 16px;\n  line-height: 1.4;\n  margin-bottom: 16px;\n  padding: 0 32px;\n  text-align: center;\n\n  b {\n    font-weight: 700;\n  }\n\n  a {\n    color: ${theme.brand.default};\n  }\n\n  li {\n    margin-top: 8px;\n    list-style-type: none;\n  }\n`;\n\nexport const LargeSubtitle = styled(Subtitle)`\n  font-size: 20px;\n`;\n\nexport const MiniSubtitle = styled(Subtitle)`\n  font-weight: 600;\n  color: ${theme.text.alt};\n  font-size: 0.875rem;\n  line-height: 1.4;\n`;\n\nexport const SmallSubtitle = styled(Subtitle)`\n  font-size: 15px;\n`;\n\nexport const Cost = styled(Subtitle)`\n  margin-top: 8px;\n  font-weight: bold;\n`;\n\nexport const NullCol = styled(FlexCol)`\n  background-image: ${props =>\n    props.bg ? `url('/img/fills/${props.bg}.svg')` : 'none'};\n  background-color: transparent;\n  background-size: 110% auto;\n  background-repeat: ${props => (props.repeat ? 'repeat-y' : 'no-repeat')};\n  background-position: ${props =>\n    props.repeat ? 'center top' : 'center center'};\n  width: 100%;\n  height: auto;\n  min-height: 160px;\n  flex: 0 0 auto;\n  padding: ${props => (props.noPadding ? '0' : '2rem')};\n  justify-content: center;\n  align-items: center;\n  position: relative;\n  align-self: center;\n`;\n\nexport const NullRow = styled(FlexRow)`\n  background-image: url('/img/fills/${props =>\n    props.bg ? `${props.bg}` : 'locked'}.svg');\n  background-color: transparent;\n  background-size: 110% auto;\n  background-repeat: no-repeat;\n  background-attachment: center;\n  width: 100%;\n  height: auto;\n  padding: 1rem 15%;\n`;\n\nexport const Profile = styled.div`\n  position: relative;\n  padding: 16px 0;\n\n  img {\n    border-radius: 48px;\n    width: 48px;\n    height: 48px;\n  }\n\n  span {\n    background-color: ${theme.success.default};\n    background-image: ${({ theme }) =>\n      Gradient(theme.success.alt, theme.success.default)};\n    position: absolute;\n    left: 75%;\n    top: 48px;\n    color: ${theme.text.reverse};\n    font-size: 10px;\n    font-weight: 800;\n    padding: 2px 4px;\n    border-radius: 8px;\n    line-height: 1.5;\n    border: 2px solid #fff;\n    z-index: ${zIndex.avatar + 1};\n  }\n`;\n\nexport const UpsellIconContainer = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 16px;\n  margin-top: 32px;\n  color: ${theme.text.alt};\n`;\n\nexport const SigninLink = styled.span`\n  color: ${theme.brand.default};\n  margin-left: 6px;\n  cursor: pointer;\n`;\n\nexport const FullscreenContent = styled.div`\n  width: 100%;\n  max-width: ${MEDIA_BREAK}px;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  padding: 32px 16px;\n  flex: 1 0 auto;\n  @media (min-width: ${MEDIA_BREAK}px) {\n    padding-top: 40px;\n  }\n`;\n\nexport const CodeOfConduct = styled.p`\n  display: inline-block;\n  font-size: 14px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  border-radius: 8px;\n  margin-top: 64px;\n  margin-left: 32px;\n  margin-right: 32px;\n  text-align: center;\n  position: relative;\n  z-index: ${zIndex.card + 1};\n\n  a {\n    color: ${theme.brand.default};\n    font-weight: 600;\n  }\n`;\n"
  },
  {
    "path": "src/views/navigation/accessibility.js",
    "content": "// @flow\nimport React from 'react';\nimport { SkipLink } from './style';\n\nexport const Skip = () => <SkipLink href=\"#main\">Skip to content</SkipLink>;\n\nexport const getAccessibilityActiveState = (active: boolean) => {\n  return {\n    'data-active': active,\n    'aria-current': active ? 'page' : undefined,\n  };\n};\n"
  },
  {
    "path": "src/views/navigation/communityList.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { Route, type History } from 'react-router-dom';\nimport Tooltip from 'src/components/tooltip';\nimport { MIN_WIDTH_TO_EXPAND_NAVIGATION } from 'src/components/layout';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { ErrorBoundary } from 'src/components/error';\nimport {\n  getCurrentUserCommunityConnection,\n  type GetUserCommunityConnectionType,\n} from 'shared/graphql/queries/user/getUserCommunityConnection';\nimport { getAccessibilityActiveState } from './accessibility';\nimport { AvatarGrid, AvatarLink, Avatar, Label } from './style';\n\ntype Props = {\n  data: {\n    user: GetUserCommunityConnectionType,\n  },\n  history: History,\n  sidenavIsOpen: boolean,\n  setNavigationIsOpen: Function,\n};\n\nconst CommunityListItem = props => {\n  const { isActive, community, sidenavIsOpen, onClick } = props;\n\n  const isWideViewport =\n    window && window.innerWidth > MIN_WIDTH_TO_EXPAND_NAVIGATION;\n\n  return (\n    <Tooltip\n      content={community.name}\n      placement={'left'}\n      isEnabled={!isWideViewport}\n    >\n      <AvatarGrid isActive={isActive}>\n        <AvatarLink\n          to={`/${community.slug}?tab=posts`}\n          onClick={onClick}\n          {...getAccessibilityActiveState(isActive)}\n        >\n          <Avatar src={community.profilePhoto} size={sidenavIsOpen ? 32 : 36} />\n\n          <Label>{community.name}</Label>\n        </AvatarLink>\n      </AvatarGrid>\n    </Tooltip>\n  );\n};\n\nconst CommunityList = (props: Props) => {\n  const { data, sidenavIsOpen, setNavigationIsOpen } = props;\n  const { user } = data;\n\n  if (!user) return null;\n\n  const { communityConnection } = user;\n  const { edges } = communityConnection;\n  const communities = edges.map(edge => edge && edge.node);\n\n  const sorted = communities.slice();\n\n  return sorted.map((community, index) => {\n    if (!community) return null;\n\n    const { communityPermissions } = community;\n    const { isMember, isBlocked } = communityPermissions;\n    if (!isMember || isBlocked) return null;\n\n    return (\n      <ErrorBoundary key={community.id}>\n        <Route path=\"/:communitySlug\">\n          {({ match }) => {\n            const isActive =\n              match &&\n              match.params &&\n              match.params.communitySlug === community.slug;\n\n            return (\n              <CommunityListItem\n                isActive={isActive}\n                community={community}\n                index={index}\n                sidenavIsOpen={sidenavIsOpen}\n                onClick={() => setNavigationIsOpen(false)}\n              />\n            );\n          }}\n        </Route>\n      </ErrorBoundary>\n    );\n  });\n};\nexport default compose(\n  getCurrentUserCommunityConnection,\n  viewNetworkHandler\n)(CommunityList);\n"
  },
  {
    "path": "src/views/navigation/directMessagesTab.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { Route, withRouter } from 'react-router-dom';\nimport Icon from 'src/components/icon';\nimport Tooltip from 'src/components/tooltip';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { getAccessibilityActiveState } from './accessibility';\nimport { NavigationContext } from 'src/helpers/navigation-context';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { MIN_WIDTH_TO_EXPAND_NAVIGATION } from 'src/components/layout';\nimport { AvatarGrid, AvatarLink, Label, IconWrapper, RedDot } from './style';\n\ntype Props = {\n  count: number,\n  isActive: boolean,\n  dispatch: Function,\n  refetch: Function,\n  currentUser?: Object,\n};\n\nconst DirectMessagesTab = (props: Props) => {\n  const { count } = props;\n\n  const isWideViewport =\n    window && window.innerWidth > MIN_WIDTH_TO_EXPAND_NAVIGATION;\n\n  return (\n    <NavigationContext.Consumer>\n      {({ setNavigationIsOpen }) => (\n        <Route path=\"/messages\">\n          {({ match }) => (\n            <Tooltip\n              content=\"Messages\"\n              placement={'left'}\n              isEnabled={!isWideViewport}\n            >\n              <AvatarGrid isActive={match && match.url.includes('/messages')}>\n                <AvatarLink\n                  to={'/messages'}\n                  data-cy=\"navigation-messages\"\n                  onClick={() => setNavigationIsOpen(false)}\n                  {...getAccessibilityActiveState(\n                    match && match.url.includes('/messages')\n                  )}\n                >\n                  <IconWrapper>\n                    <Icon glyph=\"message-simple\" />\n                    {count > 0 && (\n                      <RedDot\n                        data-cy=\"unread-dm-badge\"\n                        style={{ right: '-3px' }}\n                      />\n                    )}\n                  </IconWrapper>\n\n                  <Label>Messages</Label>\n                </AvatarLink>\n              </AvatarGrid>\n            </Tooltip>\n          )}\n        </Route>\n      )}\n    </NavigationContext.Consumer>\n  );\n};\n\nconst map = state => ({\n  networkOnline: state.connectionStatus.networkOnline,\n  websocketConnection: state.connectionStatus.websocketConnection,\n});\n\nexport default compose(\n  // $FlowIssue\n  connect(map),\n  viewNetworkHandler,\n  withRouter,\n  withCurrentUser\n)(DirectMessagesTab);\n"
  },
  {
    "path": "src/views/navigation/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter, Route, type History } from 'react-router-dom';\nimport Tooltip from 'src/components/tooltip';\nimport { UserAvatar } from 'src/components/avatar';\nimport { isViewingMarketingPage } from 'src/helpers/is-viewing-marketing-page';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  Overlay,\n  NavigationWrapper,\n  NavigationGrid,\n  AvatarGrid,\n  AvatarLink,\n  Label,\n  IconWrapper,\n  Divider,\n  DesktopMenuIconsCover,\n} from './style';\nimport Icon from 'src/components/icon';\nimport NavHead from './navHead';\nimport DirectMessagesTab from './directMessagesTab';\nimport { Skip, getAccessibilityActiveState } from './accessibility';\nimport CommunityList from './communityList';\nimport { NavigationContext } from 'src/helpers/navigation-context';\nimport { MIN_WIDTH_TO_EXPAND_NAVIGATION } from 'src/components/layout';\n\ntype Props = {\n  history: History,\n  currentUser?: Object,\n  isLoadingCurrentUser: boolean,\n};\n\nconst Navigation = (props: Props) => {\n  const { currentUser, history, isLoadingCurrentUser } = props;\n  const isMarketingPage = isViewingMarketingPage(history, currentUser);\n  if (isMarketingPage) return null;\n  const isWideViewport =\n    window && window.innerWidth > MIN_WIDTH_TO_EXPAND_NAVIGATION;\n  if (!isLoadingCurrentUser && !currentUser) {\n    return (\n      <NavigationContext.Consumer>\n        {({ navigationIsOpen, setNavigationIsOpen }) => (\n          <NavigationWrapper data-cy=\"navigation-bar\" isOpen={navigationIsOpen}>\n            <Overlay\n              isOpen={navigationIsOpen}\n              onClick={() => setNavigationIsOpen(false)}\n            />\n\n            <NavigationGrid isOpen={navigationIsOpen}>\n              <DesktopMenuIconsCover />\n\n              <Route path=\"/explore\">\n                {({ match }) => (\n                  <Tooltip\n                    content=\"Explore\"\n                    placement={'left'}\n                    isEnabled={!isWideViewport}\n                  >\n                    <AvatarGrid isActive={!!match}>\n                      <AvatarLink\n                        to={'/explore'}\n                        data-cy=\"navigation-explore\"\n                        onClick={() => setNavigationIsOpen(false)}\n                        {...getAccessibilityActiveState(!!match)}\n                      >\n                        <IconWrapper>\n                          <Icon glyph=\"explore\" />\n                        </IconWrapper>\n\n                        <Label>Explore</Label>\n                      </AvatarLink>\n                    </AvatarGrid>\n                  </Tooltip>\n                )}\n              </Route>\n\n              <Divider />\n\n              <Route path=\"/login\">\n                {({ match }) => (\n                  <Tooltip\n                    content=\"Log in\"\n                    placement={'left'}\n                    isEnabled={!isWideViewport}\n                  >\n                    <AvatarGrid isActive={!!match}>\n                      <AvatarLink\n                        to={'/login'}\n                        data-cy=\"navigation-login\"\n                        onClick={() => setNavigationIsOpen(false)}\n                        {...getAccessibilityActiveState(!!match)}\n                      >\n                        <IconWrapper>\n                          <Icon glyph=\"door-enter\" />\n                        </IconWrapper>\n\n                        <Label>Log in</Label>\n                      </AvatarLink>\n                    </AvatarGrid>\n                  </Tooltip>\n                )}\n              </Route>\n            </NavigationGrid>\n          </NavigationWrapper>\n        )}\n      </NavigationContext.Consumer>\n    );\n  }\n\n  if (currentUser) {\n    return (\n      <NavigationContext.Consumer>\n        {({ navigationIsOpen, setNavigationIsOpen }) => (\n          <NavigationWrapper data-cy=\"navigation-bar\" isOpen={navigationIsOpen}>\n            <NavHead {...props} />\n            <Skip />\n\n            <Overlay\n              isOpen={navigationIsOpen}\n              onClick={() => setNavigationIsOpen(false)}\n            />\n\n            <NavigationGrid isOpen={navigationIsOpen}>\n              <DesktopMenuIconsCover />\n              <Route path=\"/messages\">\n                {({ match }) => <DirectMessagesTab isActive={!!match} />}\n              </Route>\n\n              <Route path=\"/explore\">\n                {({ match }) => (\n                  <Tooltip\n                    content=\"Explore\"\n                    placement={'left'}\n                    isEnabled={!isWideViewport}\n                  >\n                    <AvatarGrid\n                      isActive={\n                        match && match.url === '/explore' && match.isExact\n                      }\n                    >\n                      <AvatarLink\n                        to={'/explore'}\n                        data-cy=\"navigation-explore\"\n                        onClick={() => setNavigationIsOpen(false)}\n                        {...getAccessibilityActiveState(\n                          match && match.url === '/explore' && match.isExact\n                        )}\n                      >\n                        <IconWrapper>\n                          <Icon glyph=\"explore\" />\n                        </IconWrapper>\n\n                        <Label>Explore</Label>\n                      </AvatarLink>\n                    </AvatarGrid>\n                  </Tooltip>\n                )}\n              </Route>\n\n              <Route path=\"/users/:username\">\n                {({ match }) => (\n                  <Tooltip\n                    content=\"Profile\"\n                    placement={'left'}\n                    isEnabled={!isWideViewport}\n                  >\n                    <AvatarGrid\n                      isActive={\n                        match &&\n                        match.params &&\n                        match.params.username === currentUser.username\n                      }\n                      style={{ marginTop: '4px' }}\n                    >\n                      <AvatarLink\n                        to={'/me'}\n                        data-cy=\"navigation-profile\"\n                        onClick={() => setNavigationIsOpen(false)}\n                        {...getAccessibilityActiveState(\n                          history.location.pathname ===\n                            `/users/${currentUser.username}`\n                        )}\n                      >\n                        <UserAvatar\n                          size={32}\n                          user={currentUser}\n                          isClickable={false}\n                          showHoverProfile={false}\n                        />\n                        <Label>Profile</Label>\n                      </AvatarLink>\n                    </AvatarGrid>\n                  </Tooltip>\n                )}\n              </Route>\n\n              <Divider />\n\n              <CommunityList\n                setNavigationIsOpen={setNavigationIsOpen}\n                navigationIsOpen={navigationIsOpen}\n                {...props}\n              />\n            </NavigationGrid>\n          </NavigationWrapper>\n        )}\n      </NavigationContext.Consumer>\n    );\n  }\n\n  return <NavigationWrapper />;\n};\n\nexport default compose(\n  withCurrentUser,\n  withRouter\n)(Navigation);\n"
  },
  {
    "path": "src/views/navigation/navHead.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport Head from 'src/components/head';\n\nconst NavHead = () => {\n  return (\n    <Head>\n      <link\n        rel=\"shortcut icon\"\n        id=\"dynamic-favicon\"\n        // $FlowIssue\n        href={`${process.env.PUBLIC_URL}/img/favicon.ico`}\n      />\n    </Head>\n  );\n};\n\nexport default compose(connect())(NavHead);\n"
  },
  {
    "path": "src/views/navigation/style.js",
    "content": "// @flow\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport theme from 'shared/theme';\nimport { hexa, Truncate } from 'src/components/globals';\nimport {\n  MEDIA_BREAK,\n  NAVBAR_WIDTH,\n  NAVBAR_EXPANDED_WIDTH,\n  MIN_WIDTH_TO_EXPAND_NAVIGATION,\n} from 'src/components/layout';\n\nexport const Overlay = styled.div`\n  position: fixed;\n  display: ${props => (props.isOpen ? 'block' : 'none')};\n  width: 100%;\n  height: 100%;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 9998 /* on top of titlebar */;\n  background: rgba(0, 0, 0, 0.4);\n`;\n\nexport const RedDot = styled.span`\n  width: 16px;\n  height: 16px;\n  border-radius: 8px;\n  border: 3px solid ${theme.bg.default};\n  position: absolute;\n  background: ${theme.warn.alt};\n  top: 0;\n  right: 0px;\n`;\n\nexport const BlackDot = styled.span`\n  width: 16px;\n  height: 16px;\n  border-radius: 8px;\n  border: 3px solid ${theme.bg.default};\n  position: absolute;\n  background: ${theme.text.placeholder};\n  top: 2px;\n  right: 10px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    background: ${theme.warn.alt};\n    left: 40px;\n    top: 0px;\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    background: ${theme.warn.alt};\n    left: 40px;\n    top: 0px;\n  }\n`;\n\nexport const NavigationWrapper = styled.div`\n  grid-area: navigation;\n  position: sticky;\n  top: 0;\n  width: ${NAVBAR_WIDTH}px;\n  height: 100vh;\n  overflow: hidden;\n  overflow-y: auto;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: ${props => (props.isOpen ? 'block' : 'none')};\n    position: fixed;\n    width: 100%;\n    height: 100vh;\n    z-index: 9997;\n    box-shadow: 2px 0 8px rgba(0, 0, 0, 0.16);\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    width: ${NAVBAR_EXPANDED_WIDTH}px;\n  }\n`;\n\nexport const DesktopMenuIconsCover = styled.div`\n  position: fixed;\n  width: ${NAVBAR_WIDTH - 1}px;\n  height: 40px;\n  border-bottom: 1px solid ${theme.bg.border};\n  background: #fff;\n  top: 0;\n  display: none;\n  z-index: 1;\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    width: ${NAVBAR_EXPANDED_WIDTH - 1}px;\n  }\n`;\n\nexport const NavigationGrid = styled.div`\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  align-content: start;\n  grid-template-rows: auto;\n  height: 100%;\n  background: ${theme.bg.default};\n  border-right: 1px solid ${theme.bg.border};\n  position: fixed;\n  top: 0;\n  width: 100%;\n  max-width: ${NAVBAR_WIDTH}px;\n  overflow: hidden;\n  overflow-y: auto;\n  padding: 12px 0 16px;\n\n  &::-webkit-scrollbar {\n    width: 0px;\n    height: 0px;\n    background: transparent; /* make scrollbar transparent */\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    position: fixed;\n    top: 0;\n    z-index: 9999 /* on top of overlay and titlebar */;\n    width: 100%;\n    max-width: ${NAVBAR_EXPANDED_WIDTH}px;\n    grid-gap: 0px;\n    padding: 12px 0;\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    z-index: 9999 /* on top of overlay and titlebar */;\n    width: 100%;\n    max-width: ${NAVBAR_EXPANDED_WIDTH}px;\n    grid-gap: 0px;\n    padding: 12px 0;\n  }\n`;\n\nexport const AvatarGrid = styled.div`\n  display: grid;\n  grid-template-columns: minmax(0, 1fr);\n  align-content: start;\n  color: ${props => (props.isActive ? theme.text.default : theme.text.alt)};\n  font-weight: ${props => (props.isActive ? '600' : '500')};\n  background: ${props =>\n    props.isActive ? hexa(theme.text.default, 0.04) : theme.bg.default};\n\n  a img {\n    opacity: ${props => (props.isActive ? '1' : '0.4')};\n    filter: ${props => (props.isActive ? 'none' : 'grayscale(80%)')};\n  }\n\n  ${props =>\n    props.isActive &&\n    css`\n      box-shadow: inset 3px 0 0 ${theme.text.default};\n\n      img,\n      a img {\n        filter: grayscale(0%) !important;\n        opacity: 1 !important;\n      }\n    `}\n\n  &:hover {\n    box-shadow: inset 3px 0 0\n      ${props => (props.isActive ? theme.brand.default : theme.bg.border)};\n    background: ${props =>\n      props.isActive ? hexa(theme.brand.default, 0.04) : theme.bg.wash};\n    color: ${props =>\n      props.isActive ? theme.brand.default : theme.text.secondary};\n\n    img,\n    a img {\n      filter: grayscale(0%);\n      opacity: 1;\n    }\n\n    ${BlackDot} {\n      background-color: ${theme.warn.alt};\n    }\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    img,\n    a img {\n      filter: grayscale(0%);\n      opacity: 1;\n    }\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    img,\n    a img {\n      filter: grayscale(0%);\n      opacity: 1;\n    }\n  }\n`;\n\nexport const AvatarLink = styled(Link)`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  padding: 8px 12px;\n  position: relative;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: row;\n    justify-content: flex-start;\n    padding: 8px 20px 8px 12px;\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    flex-direction: row;\n    justify-content: flex-start;\n    padding: 8px 20px 8px 12px;\n  }\n`;\n\nexport const Avatar = styled.img`\n  width: ${props => props.size}px;\n  height: ${props => props.size}px;\n  border-radius: 6px;\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16);\n  transition: box-shadow 0.2s ease-in-out;\n\n  &:hover {\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n    transition: box-shadow 0.2s ease-in-out;\n  }\n`;\n\nexport const Shortcut = styled.span`\n  font-size: 12px;\n  font-weight: 500;\n  margin-top: 2px;\n  text-align: center;\n  margin-bottom: -4px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    display: none;\n  }\n`;\n\nexport const Label = styled.span`\n  font-size: 15px;\n  margin-left: 12px;\n  padding-right: 12px;\n  ${Truncate};\n  display: none;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: block;\n  }\n\n  @media (min-width: ${MIN_WIDTH_TO_EXPAND_NAVIGATION}px) {\n    display: block;\n  }\n`;\n\nexport const IconWrapper = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 6px;\n  opacity: 1;\n  position: relative;\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const Divider = styled.div`\n  height: 1px;\n  background: ${theme.bg.border};\n  margin: 8px 0;\n`;\n\n// We make it a real link element because anchor links don’t work properly with React Router.\n// Ref: https://github.com/ReactTraining/react-router/issues/394.\nexport const SkipLink = styled.a`\n  overflow: hidden;\n  position: absolute;\n  height: 1px;\n  width: 1px;\n\n  &:focus {\n    height: auto;\n    width: auto;\n  }\n`;\n"
  },
  {
    "path": "src/views/newUserOnboarding/components/setUsername/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport slugg from 'slugg';\nimport { connect } from 'react-redux';\nimport { withApollo } from 'react-apollo';\nimport compose from 'recompose/compose';\nimport { Error, Success } from 'src/components/formElements';\nimport UsernameSearch from 'src/components/usernameSearch';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport { Form, Row } from './style';\nimport editUserMutation from 'shared/graphql/mutations/user/editUser';\nimport { ContinueButton } from '../../style';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  client: Object,\n  editUser: Function,\n  save: Function,\n  dispatch: Dispatch<Object>,\n  user: ?Object,\n};\n\ntype State = {\n  username: string,\n  error: string,\n  success: string,\n  isLoading: boolean,\n};\n\nclass SetUsername extends React.Component<Props, State> {\n  _isMounted = false;\n\n  constructor(props) {\n    super(props);\n    const { user } = props;\n\n    // try to intelligently suggest a starting username based on the\n    // person's name, or firstname/lastname\n    let username = user\n      ? user.name\n        ? slugg(user.name)\n        : user.firstName && user.lastName\n        ? `${user.firstName}-${user.lastName}`\n        : ''\n      : '';\n\n    this.state = {\n      username: username,\n      error: '',\n      success: '',\n      isLoading: false,\n    };\n  }\n\n  componentDidMount() {\n    this._isMounted = true;\n  }\n\n  componentWillUnmount() {\n    this._isMounted = false;\n  }\n\n  handleUsernameValidation = ({ error, success, username }) => {\n    this.setState({\n      error,\n      success,\n      username,\n    });\n  };\n\n  saveUsername = e => {\n    e.preventDefault();\n    const { username } = this.state;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    const input = {\n      username,\n    };\n\n    this.props\n      .editUser(input)\n      .then(() => {\n        if (!this._isMounted) return;\n        this.setState({\n          isLoading: false,\n          success: '',\n        });\n\n        // trigger a method in the newUserOnboarding component class\n        // to determine what to do next with this user - either push them\n        // to community discovery or close the onboarding completely\n        return this.props.save();\n      })\n      .catch(err => {\n        if (!this._isMounted) return;\n        this.setState({\n          isLoading: false,\n          success: '',\n        });\n        this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  render() {\n    const { username, isLoading, error, success } = this.state;\n\n    return (\n      <Form onSubmit={this.saveUsername}>\n        <Row>\n          <UsernameSearch\n            placeholder={'Your username...'}\n            autoFocus={true}\n            username={username}\n            onValidationResult={this.handleUsernameValidation}\n            dataCy={'username-search'}\n          />\n        </Row>\n\n        <Row style={{ minHeight: '43px' }}>\n          {error && <Error data-cy=\"username-search-error\">{error}</Error>}\n          {success && (\n            <Success data-cy=\"username-search-success\">{success}</Success>\n          )}\n        </Row>\n\n        <Row>\n          <ContinueButton\n            onClick={this.saveUsername}\n            disabled={!username || error}\n            loading={isLoading}\n            data-cy=\"save-username-button\"\n          >\n            {isLoading ? 'Saving...' : 'Save and Continue'}\n          </ContinueButton>\n        </Row>\n      </Form>\n    );\n  }\n}\n\nexport default compose(\n  editUserMutation,\n  withApollo,\n  connect()\n)(SetUsername);\n"
  },
  {
    "path": "src/views/newUserOnboarding/components/setUsername/style.js",
    "content": "// $FlowFixMe\nimport styled from 'styled-components';\n\nexport const Row = styled.div`\n  display: flex;\n  justify-content: center;\n  position: relative;\n`;\n\nexport const Form = styled.form`\n  display: flex;\n  position: relative;\n  flex-direction: column;\n  width: 100%;\n  margin-top: 32px;\n`;\n"
  },
  {
    "path": "src/views/newUserOnboarding/index.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport queryString from 'query-string';\nimport compose from 'recompose/compose';\nimport { withRouter, type History, type Location } from 'react-router-dom';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport SetUsername from './components/setUsername';\nimport type { UserInfoType } from 'shared/graphql/fragments/user/userInfo';\nimport { SERVER_URL, CLIENT_URL } from 'src/api/constants';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport { ViewGrid, CenteredGrid } from 'src/components/layout';\nimport Login from 'src/views/login';\nimport { LogOutButton, Emoji, Heading, Description, Card } from './style';\n\ntype Props = {\n  currentUser: UserInfoType,\n  history: History,\n  location: Location,\n  dispatch: Dispatch<Object>,\n};\n\nclass NewUserOnboarding extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    dispatch(\n      setTitlebarProps({\n        title: 'Create username',\n      })\n    );\n  }\n\n  saveUsername = () => {\n    const { history, location } = this.props;\n    const { state } = location;\n    if (state && state.redirect) return history.replace(state.redirect);\n    return history.replace('/');\n  };\n\n  render() {\n    const { currentUser } = this.props;\n\n    let r;\n    if (this.props.location) {\n      const searchObj = queryString.parse(this.props.location.search);\n      r = searchObj.r;\n    }\n\n    const redirectPath =\n      r !== undefined\n        ? // $FlowFixMe\n          `${r}`\n        : `${CLIENT_URL}/home`;\n\n    if (!currentUser) {\n      return <Login githubOnly redirectPath={redirectPath} />;\n    }\n\n    if (currentUser && currentUser.username) {\n      this.saveUsername();\n      return null;\n    }\n\n    const heading = 'Create a username';\n    const subheading = 'You can change this at any time, so no pressure!';\n    const emoji = '👋';\n    return (\n      <ViewGrid data-cy=\"new-user-onboarding\">\n        <CenteredGrid>\n          <Card>\n            <Emoji role=\"img\" aria-label=\"Oops\">\n              {emoji}\n            </Emoji>\n            <Heading>{heading}</Heading>\n            <Description>{subheading}</Description>\n\n            <SetUsername user={currentUser} save={this.saveUsername} />\n\n            <LogOutButton\n              data-cy=\"new-user-onboarding-logout\"\n              target=\"_self\"\n              href={`${SERVER_URL}/auth/logout`}\n            >\n              Log out\n            </LogOutButton>\n          </Card>\n        </CenteredGrid>\n      </ViewGrid>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  withCurrentUser,\n  connect()\n)(NewUserOnboarding);\n"
  },
  {
    "path": "src/views/newUserOnboarding/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { PrimaryButton, TextButton } from 'src/components/button';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const ContinueButton = styled(PrimaryButton)`\n  font-size: 17px;\n  font-weight: 600;\n  padding: 12px 16px;\n  flex: 1;\n  max-width: 100%;\n  margin: 16px auto 64px;\n`;\n\nexport const LogOutButton = styled(TextButton)`\n  flex: 1;\n  color: ${theme.text.alt};\n`;\nexport const Emoji = styled.span`\n  font-size: 40px;\n  margin-bottom: 16px;\n`;\n\nexport const Heading = styled.h3`\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.3;\n  margin-bottom: 8px;\n  color: ${theme.text.default};\n`;\n\nexport const Description = styled.p`\n  margin-top: 8px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n  padding-right: 24px;\n`;\n\nexport const Card = styled.div`\n  background: ${theme.bg.wash};\n  padding: 16px;\n  text-align: center;\n  max-width: 480px;\n  justify-self: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n    border: none;\n    border-bottom: 1px solid ${theme.bg.border};\n  }\n`;\n"
  },
  {
    "path": "src/views/pages/components/communities.js",
    "content": ""
  },
  {
    "path": "src/views/pages/components/footer.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { Footer, FooterGrid, Masthead, Safety } from '../style';\n\nexport default () => {\n  return (\n    <Footer>\n      <FooterGrid>\n        <Masthead>\n          <Safety>\n            <span>Safety</span>\n            <a\n              href=\"https://github.com/withspectrum/code-of-conduct\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              Code of Conduct\n            </a>\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={\n                'https://help.github.com/en/github/site-policy/github-privacy-statement'\n              }\n            >\n              Privacy Statement\n            </a>\n            <a\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n              href={\n                'https://help.github.com/en/github/site-policy/github-terms-of-service'\n              }\n            >\n              Terms of Service\n            </a>\n          </Safety>\n        </Masthead>\n      </FooterGrid>\n    </Footer>\n  );\n};\n"
  },
  {
    "path": "src/views/pages/components/logos.js",
    "content": "// @flow\nimport React from 'react';\nimport styled from 'styled-components';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nconst Logo = styled.img`\n  height: 32px;\n  object-fit: contain;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    height: 24px;\n  }\n`;\n\nexport const AbstractLogo = () => <Logo src=\"/img/logos/abstract.svg\" alt=\"\" />;\n\nexport const BootstrapLogo = () => (\n  <Logo src=\"/img/logos/bootstrap.svg\" alt=\"\" />\n);\n\nexport const ExpoLogo = () => <Logo src=\"/img/logos/expo.svg\" alt=\"\" />;\n\nexport const FigmaLogo = () => <Logo src=\"/img/logos/figma.svg\" alt=\"\" />;\n\nexport const InvisionLogo = () => <Logo src=\"/img/logos/invision.svg\" alt=\"\" />;\n\nexport const NodeLogo = () => <Logo src=\"/img/logos/nodejs.svg\" alt=\"\" />;\n\nexport const RealmLogo = () => <Logo src=\"/img/logos/realm.svg\" alt=\"\" />;\n\nexport const SketchLogo = () => <Logo src=\"/img/logos/sketch.svg\" alt=\"\" />;\n"
  },
  {
    "path": "src/views/pages/components/nav.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport Icon from 'src/components/icon';\nimport { Link } from 'react-router-dom';\nimport { Logo } from 'src/components/logo';\nimport { UserAvatar } from 'src/components/avatar';\nimport Head from 'src/components/head';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport {\n  NavContainer,\n  Tabs,\n  LogoTab,\n  MenuTab,\n  LoginTab,\n  AuthTab,\n  LogoLink,\n  AuthLink,\n  LoginLink,\n  ExploreLink,\n  MenuContainer,\n  MenuOverlay,\n} from '../style';\n\ntype Props = {\n  currentUser: Object,\n  location: Object,\n  dark?: boolean,\n};\n\ntype State = {\n  menuIsOpen: boolean,\n};\n\nclass Nav extends React.Component<Props, State> {\n  state = { menuIsOpen: false };\n\n  toggleMenu() {\n    this.setState({ menuIsOpen: !this.state.menuIsOpen });\n  }\n\n  render() {\n    return (\n      <NavContainer data-cy=\"navigation-splash\">\n        <Head\n          title={'Spectrum'}\n          description={'The community platform for the future.'}\n        >\n          <link\n            rel=\"shortcut icon\"\n            id=\"dynamic-favicon\"\n            // $FlowIssue\n            href={`${process.env.PUBLIC_URL}/img/favicon.ico`}\n          />\n        </Head>\n        <Tabs>\n          <LogoTab\n            dark={this.props.dark}\n            to=\"/about\"\n            data-cy=\"navigation-splash-about\"\n          >\n            <Logo />\n            <Icon glyph={'logo'} />\n          </LogoTab>\n          {this.props.currentUser ? (\n            <AuthTab dark={this.props.dark}>\n              <Link to={'/'}>\n                <UserAvatar\n                  user={this.props.currentUser}\n                  dataCy=\"navigation-splash-profile\"\n                  clickable={false}\n                  showHoverProfile={false}\n                />\n              </Link>\n            </AuthTab>\n          ) : (\n            <React.Fragment>\n              <LoginTab\n                dark={this.props.dark}\n                selected={this.props.location === 'login'}\n                to=\"/login\"\n                data-cy=\"navigation-splash-login\"\n              >\n                Log in\n              </LoginTab>\n            </React.Fragment>\n          )}\n          <MenuTab dark={this.props.dark} open={this.state.menuIsOpen}>\n            <Icon\n              glyph={this.state.menuIsOpen ? 'view-close' : 'menu'}\n              onClick={() => this.toggleMenu()}\n            />\n            <MenuContainer open={this.state.menuIsOpen}>\n              <LogoLink to=\"/\">\n                <Logo />\n              </LogoLink>\n              <ExploreLink\n                to=\"/explore\"\n                selected={this.props.location === 'explore'}\n              >\n                Explore\n              </ExploreLink>\n              {this.props.currentUser ? (\n                <AuthLink to={'/'}>\n                  <span>Return home</span>\n                </AuthLink>\n              ) : (\n                <LoginLink to={'/login'}>\n                  <span>Log in</span>\n                </LoginLink>\n              )}\n            </MenuContainer>\n            <MenuOverlay\n              onClick={() => this.toggleMenu()}\n              open={this.state.menuIsOpen}\n            />\n          </MenuTab>\n        </Tabs>\n      </NavContainer>\n    );\n  }\n}\n\nexport default compose(\n  withCurrentUser,\n  connect()\n)(Nav);\n"
  },
  {
    "path": "src/views/pages/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Nav from './components/nav';\nimport Terms from './terms';\nimport Privacy from './privacy';\nimport { StyledViewGrid } from './style';\n\ntype Props = {\n  match: Object,\n};\n\nclass Pages extends React.Component<Props> {\n  renderPage = () => {\n    switch (this.props.match.path) {\n      case '/terms':\n      case '/terms.html': {\n        return <Terms {...this.props} />;\n      }\n      case '/privacy':\n      case '/privacy.html': {\n        return <Privacy {...this.props} />;\n      }\n    }\n  };\n\n  render() {\n    const {\n      match: { path },\n    } = this.props;\n    const dark = path === '/' || path === '/about';\n\n    return (\n      <StyledViewGrid>\n        <div style={{ position: 'relative' }}>\n          <Nav\n            dark={dark ? 'true' : undefined}\n            location={this.props.match.path.substr(1)}\n          />\n          {this.renderPage()}\n        </div>\n      </StyledViewGrid>\n    );\n  }\n}\n\nexport default Pages;\n"
  },
  {
    "path": "src/views/pages/privacy/index.js",
    "content": "// @flow\nimport * as React from 'react';\n\nclass Privacy extends React.Component<{}> {\n  componentDidMount() {\n    return (window.location.href =\n      'https://help.github.com/en/github/site-policy/github-privacy-statement');\n  }\n  render() {\n    return null;\n  }\n}\nexport default Privacy;\n"
  },
  {
    "path": "src/views/pages/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { Button } from 'src/components/button';\nimport { ViewGrid } from 'src/components/layout';\nimport {\n  H2,\n  FlexCol,\n  FlexRow,\n  P,\n  Transition,\n  Shadow,\n  zIndex,\n  hexa,\n  Gradient,\n} from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Page = styled.main`\n  position: relative;\n  display: grid;\n  grid-template-rows: 1fr;\n  grid-template-columns: 1fr;\n  grid-template-areas: 'content';\n  background-color: ${theme.bg.default};\n`;\n\nexport const Wrapper = styled(FlexCol)`\n  grid-area: content;\n  height: 100%;\n  width: 100%;\n  max-width: 100vw;\n  background-color: ${theme.bg.default};\n  overflow: hidden;\n  z-index: ${zIndex.base};\n`;\n\nexport const Flexer = styled(FlexRow)`\n  flex-wrap: wrap;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n  }\n`;\n\nexport const Header = styled(FlexRow)`\n  padding: 32px;\n  justify-content: space-between;\n  z-index: ${zIndex.card};\n`;\n\nexport const Content = styled(FlexRow)`\n  flex: auto;\n  align-self: stretch;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n  }\n`;\n\nexport const Tagline = styled(H2)`\n  font-weight: 900;\n  font-size: 32px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  color: inherit;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin-bottom: 32px;\n  }\n`;\n\nexport const Copy = styled(P)`\n  max-width: 480px;\n  width: 100%;\n  font-size: 18px;\n  line-height: 1.5;\n  color: inherit;\n  font-weight: 500;\n\n  &:not(:first-of-type) {\n    margin-top: 16px;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    text-align: left;\n  }\n`;\n\nexport const Bullets = styled(FlexRow)`\n  align-self: stretch;\n  flex: auto;\n  justify-content: center;\n  align-items: flex-start;\n  margin: 32px 16px 16px;\n  flex-wrap: wrap;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n    margin-top: 0;\n  }\n`;\n\nexport const Bullet = styled(FlexCol)`\n  display: inline-block;\n  width: calc(33% - 64px);\n  min-width: 320px;\n  max-width: 480px;\n  margin: 32px;\n  margin-bottom: 0;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n    margin: 0;\n    margin-top: 48px;\n  }\n`;\n\nexport const BulletHeading = styled(FlexRow)`\n  align-items: center;\n  white-space: nowrap;\n  position: relative;\n`;\n\nexport const BulletTitle = styled.h2`\n  font-size: 20px;\n  font-weight: 700;\n`;\n\nexport const BulletCopy = styled.p`\n  margin-top: 8px;\n  font-weight: 500;\n`;\n\nexport const PrimaryCTA = styled(Button)`\n  padding: 8px 12px;\n  font-weight: 700;\n  font-size: 16px;\n  border-radius: 12px;\n  background-color: ${theme.bg.default};\n  background-image: none;\n  color: ${theme.brand.alt};\n  transition: ${Transition.hover.off};\n  z-index: ${zIndex.card};\n\n  &:hover {\n    background-color: ${theme.bg.default};\n    color: ${theme.brand.default};\n    box-shadow: ${Shadow.high} ${props => hexa(props.theme.bg.reverse, 0.5)};\n    transition: ${Transition.hover.on};\n  }\n`;\n\nexport const SecondaryCTA = styled(PrimaryCTA)`\n  color: ${theme.text.reverse};\n  background-color: transparent;\n  border: 2px solid transparent;\n\n  &:hover {\n    color: ${theme.text.reverse};\n    background-color: transparent;\n    border-color: ${theme.bg.default};\n    box-shadow: 0 0 8px 4px ${props => hexa(props.theme.bg.default, 0.5)};\n  }\n`;\n\nexport const SignInButton = styled.a`\n  display: flex;\n  flex-shrink: 1;\n  z-index: ${zIndex.base + 1};\n  flex-direction: flex-row;\n  align-self: flex-start;\n  align-items: center;\n  color: ${theme.text.reverse};\n  border-radius: 8px;\n  padding: 8px;\n  padding-right: 16px;\n  font-size: 14px;\n  font-weight: 700;\n  transition: ${Transition.hover.off};\n  position: relative;\n  margin: 16px 0;\n\n  ${props =>\n    props.after &&\n    `\n  \t\tmargin: 24px 0;\n\n\t\t\t&:after {\n\t\t\t\tcontent: 'Previously signed in with';\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: -23px;\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\topacity: 0.8;\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translateX(-50%);\n\t\t\t\twidth: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t\tcolor: #fff;\n\t\t\t}\n\t\t`} span {\n    display: inline-block;\n    flex: 0 0 auto;\n    margin-top: -1px;\n    margin-left: 8px;\n    line-height: 2.45;\n    word-break: keep-all;\n    white-space: nowrap;\n    color: currentColor;\n  }\n\n  svg {\n    fill: currentColor !important;\n  }\n\n  &:hover {\n    cursor: pointer;\n  }\n`;\n\nexport const LoginCard = styled.div`\n  border-radius: 12px;\n  padding: 16px 0;\n  margin-top: 16px;\n  align-self: flex-start;\n  align-items: flex-start;\n`;\n\nexport const ButtonTwitter = styled(Button)`\n  background: ${props =>\n    props.preferred ? props.theme.social.twitter.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.twitter.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.twitter.default : '#fff'};\n  }\n`;\n\nexport const ButtonFacebook = styled(Button)`\n  background: ${props =>\n    props.preferred ? props.theme.social.facebook.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.facebook.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.facebook.default : '#fff'};\n  }\n`;\n\nexport const ButtonGoogle = styled(Button)`\n  background: ${props =>\n    props.preferred ? props.theme.social.google.default : 'none'};\n  color: ${props =>\n    props.whitebg\n      ? props.theme.social.google.default\n      : props.preferred\n      ? '#fff'\n      : 'rgba(255,255,255,0.8)'};\n\n  &:hover {\n    color: ${props =>\n      props.whitebg ? props.theme.social.google.default : '#fff'};\n  }\n`;\n\nexport const Footer = styled.div`\n  display: flex;\n  justify-content: stretch;\n  align-content: stretch;\n  flex: none;\n  position: relative;\n  padding: 32px;\n  background-color: ${theme.bg.default};\n  color: ${theme.text.default};\n`;\n\nexport const FooterGrid = styled.div`\n  flex: auto;\n  display: grid;\n  grid-template-columns: auto 1fr repeat(2, minmax(160px, auto));\n  grid-template-rows: 1fr;\n  grid-column-gap: 32px;\n  grid-template-areas: 'masthead . support safety';\n  align-items: flex-start;\n  justify-items: flex-start;\n\n  @media (max-width: 800px) {\n    grid-template-columns: 1fr;\n    grid-template-rows: auto;\n    grid-column-gap: 0;\n    grid-row-gap: 32px;\n    grid-template-areas: 'masthead' 'support' 'safety';\n  }\n`;\n\nexport const FooterSection = styled.div`\n  display: flex;\n  flex-direction: column;\n\n  font-weight: 500;\n  font-size: 16px;\n\n  span {\n    color: ${theme.text.alt};\n    font-weight: 700;\n  }\n`;\n\nexport const Masthead = styled(FooterSection)`\n  grid-area: masthead;\n`;\n\nexport const LinkSection = styled(FooterSection)`\n  a {\n    position: relative;\n    padding-bottom: 2px;\n    display: inline-block;\n    align-self: flex-start;\n\n    &:after {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      content: '';\n      height: 2px;\n      width: 0%;\n      opacity: 0;\n      background-color: ${theme.text.reverse};\n      transition: opacity 0.2s ease-in-out, width 0.2s ease-in-out;\n    }\n\n    &:hover {\n      &:after {\n        width: 100%;\n        opacity: 1;\n        transition: opacity 0.2s ease-in-out, width 0.2s ease-in-out;\n      }\n    }\n  }\n\n  span + a,\n  a + a {\n    margin-top: 8px;\n  }\n`;\n\nexport const Safety = styled(LinkSection)`\n  grid-area: safety;\n  margin-top: 24px;\n\n  span + a,\n  a + a {\n    margin-top: 8px;\n  }\n`;\n\nexport const LinkBlock = styled(Link)`\n  display: inline-block;\n  margin: 0 24px;\n  flex: 0 0 auto;\n  position: relative;\n\n  &:hover {\n    text-decoration: none;\n  }\n\n  div {\n    font-size: 16px;\n    font-weight: 700;\n    padding: 12px 16px;\n    top: 4px;\n    position: relative;\n    text-align: center;\n    transition: ${Transition.hover.off};\n    border-radius: 12px;\n\n    &:hover {\n      background-color: ${theme.bg.default};\n      color: ${theme.text.default};\n      transition: ${Transition.hover.on};\n    }\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n    justify-content: flex-start;\n    padding-bottom: 16px;\n\n    div {\n      border-bottom: none;\n\n      &:hover {\n        border-bottom: none;\n      }\n    }\n  }\n`;\n\nexport const LinkBlockA = styled.a`\n  display: inline-block;\n  margin: 0 24px;\n  flex: 0 0 auto;\n  position: relative;\n\n  &:hover {\n    text-decoration: none;\n  }\n\n  div {\n    font-size: 16px;\n    font-weight: 700;\n    padding: 12px 16px;\n    top: 4px;\n    position: relative;\n    text-align: center;\n    transition: ${Transition.hover.off};\n    border-radius: 12px;\n\n    &:hover {\n      background-color: ${theme.bg.default};\n      color: ${theme.text.default};\n      transition: ${Transition.hover.on};\n    }\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    flex-direction: column;\n    justify-content: flex-start;\n    padding-bottom: 16px;\n\n    div {\n      border-bottom: none;\n\n      &:hover {\n        border-bottom: none;\n      }\n    }\n  }\n`;\n\nexport const NavContainer = styled.div`\n  display: grid;\n  grid-template-rows: 68px;\n  grid-template-columns: auto;\n  grid-template-areas: 'tabs';\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n`;\n\nexport const Tabs = styled.div`\n  display: grid;\n  padding: 0 16px;\n  grid-template-columns: auto 1fr repeat(2, auto);\n  grid-column-gap: 32px;\n  grid-template-rows: auto;\n  grid-template-areas: 'logo . login auth';\n  align-items: center;\n  justify-items: center;\n  color: ${props =>\n    props.dark ? props.theme.text.reverse : props.theme.brand.alt};\n  grid-area: tabs;\n  z-index: ${zIndex.chrome + 1};\n  line-height: 1;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    grid-template-columns: auto 1fr auto;\n    grid-template-areas: 'logo . menu';\n  }\n\n  ${props =>\n    props.dark &&\n    css`\n      button {\n        color: ${theme.brand.alt};\n        background-image: none;\n        background-color: ${theme.bg.default};\n\n        &:hover {\n          color: ${theme.brand.default};\n          background-color: ${theme.bg.default};\n          box-shadow: 0 0 16px ${theme.brand.border};\n        }\n      }\n    `};\n`;\n\nexport const Tab = styled(Link)`\n  padding: 4px 8px;\n  font-size: 16px;\n  font-weight: ${props => (props.selected ? '700' : '500')};\n  color: ${props =>\n    props.selected\n      ? props.dark\n        ? props.theme.text.reverse\n        : props.theme.text.default\n      : props.dark\n      ? props.theme.text.reverse\n      : props.theme.text.alt};\n\n  &:hover {\n    color: ${props =>\n      props.selected\n        ? props.dark\n          ? props.theme.text.reverse\n          : props.theme.text.default\n        : props.dark\n        ? props.theme.text.reverse\n        : props.theme.text.alt};\n    text-shadow: ${props =>\n      props.dark ? `0 0 32px ${hexa(props.theme.text.reverse, 0.75)}` : 'none'};\n  }\n`;\n\nexport const LogoTab = styled(Tab)`\n  grid-area: logo;\n  color: ${props =>\n    props.dark ? props.theme.text.reverse : props.theme.brand.alt};\n\n  > div:last-of-type {\n    display: none;\n\n    @media (max-width: ${MEDIA_BREAK}px) {\n      display: inline-block;\n    }\n  }\n\n  > div:first-of-type {\n    display: inline-block;\n\n    @media (max-width: ${MEDIA_BREAK}px) {\n      display: none;\n    }\n  }\n`;\n\nexport const DropdownLink = styled(Link)`\n  padding: 16px 0;\n  font-weight: ${props => (props.selected ? '600' : '500')};\n  display: flex;\n  width: 100%;\n  align-items: center;\n  transition: ${Transition.hover.off};\n  color: ${props =>\n    props.selected ? props.theme.brand.alt : props.theme.text.alt};\n  border-radius: 8px;\n\n  &:hover {\n    transition: ${Transition.hover.on};\n    color: ${props =>\n      props.selected ? props.theme.brand.default : props.theme.text.secondary};\n  }\n`;\n\nexport const LogoLink = styled(DropdownLink)`\n  color: ${theme.text.placeholder};\n  margin-bottom: 16px;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\nexport const ExploreLink = styled(DropdownLink)`\n  grid-area: explore;\n`;\n\nexport const AuthLink = styled(DropdownLink)`\n  margin: 0;\n  margin-top: 24px;\n  padding: 16px 0;\n  font-weight: 700;\n  border-top: none;\n  color: ${theme.text.reverse};\n  background-image: ${props =>\n    Gradient(props.theme.brand.alt, props.theme.brand.default)};\n  justify-content: center;\n\n  &:hover {\n    color: ${theme.text.reverse};\n    text-shadow: 0 0 32px ${props => hexa(props.theme.text.reverse, 0.5)};\n  }\n`;\n\nexport const LoginLink = styled(DropdownLink)`\n  grid-area: login;\n`;\n\nexport const MenuContainer = styled.div`\n  position: fixed;\n  display: grid;\n  grid-template-columns: auto;\n  grid-template-rows: auto 16px repeat(2, auto) 1fr auto;\n  grid-template-areas: 'logo' '.' 'explore' 'login' '.' 'auth';\n  align-content: start;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  height: 100vh;\n  width: 300px;\n  padding: 16px;\n  color: ${theme.brand.alt};\n  background-color: ${theme.bg.default};\n  background-image: ${props =>\n    Gradient(props.theme.bg.default, props.theme.bg.wash)};\n  box-shadow: ${Shadow.high} ${props => hexa(props.theme.bg.reverse, 0.25)};\n  padding-top: 32px;\n  z-index: 2;\n  flex-direction: column;\n`;\n\nexport const MenuOverlay = styled.div`\n  position: fixed;\n  left: 0;\n  top: 0;\n  bottom: 0;\n  right: 0;\n  width: 100vw;\n  min-width: 100vw;\n  height: 100vh;\n  min-height: 100vh;\n  background-color: ${props => hexa(props.theme.bg.reverse, 0.5)};\n  display: ${props => (props.open ? 'block' : 'none')};\n  z-index: 1;\n`;\n\nexport const MenuTab = styled.div`\n  grid-area: menu;\n  color: ${props =>\n    props.dark ? props.theme.brand.border : props.theme.brand.alt};\n\n  > button {\n    &:hover {\n      color: ${props =>\n        props.dark ? props.theme.text.reverse : props.theme.brand.default};\n      transform: none;\n    }\n  }\n\n  ${MenuContainer} {\n    display: ${props => (props.open ? 'flex' : 'none')};\n  }\n\n  @media (min-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const LoginTab = styled(Tab)`\n  grid-area: login;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const AuthTab = styled.div`\n  grid-area: auth;\n  color: ${props =>\n    props.dark ? props.theme.text.reverse : props.theme.brand.alt};\n\n  > a > button {\n    font-weight: 700;\n\n    ${props =>\n      props.dark &&\n      css`\n        color: ${theme.brand.alt};\n        background-image: none;\n        background-color: ${theme.bg.default};\n\n        &:hover {\n          color: ${theme.brand.default};\n          background-color: ${theme.bg.default};\n          box-shadow: 0 0 16px ${theme.brand.border};\n        }\n      `};\n  }\n\n  > a > div {\n    box-shadow: ${props =>\n      props.dark ? `0 0 0 2px ${props.theme.bg.default}` : 'none'};\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const StyledViewGrid = styled(ViewGrid)`\n  @media (max-width: ${MEDIA_BREAK}px) {\n    max-height: 100vh;\n  }\n`;\n"
  },
  {
    "path": "src/views/pages/terms/index.js",
    "content": "// @flow\nimport * as React from 'react';\n\nclass Terms extends React.Component<{}> {\n  componentDidMount() {\n    return (window.location.href =\n      'https://help.github.com/en/github/site-policy/github-terms-of-service');\n  }\n  render() {\n    return null;\n  }\n}\nexport default Terms;\n"
  },
  {
    "path": "src/views/pages/terms/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\n\nexport const PrivacyTermsList = styled.ul`\n  padding-top: 24px;\n  margin-left: 32px;\n  padding-bottom: 24px;\n\n  li {\n    font-size: 20px;\n    font-weight: 400;\n    color: ${theme.text.secondary};\n    line-height: 1.4;\n    margin-top: 12px;\n  }\n`;\n"
  },
  {
    "path": "src/views/queryParamToastDispatcher/index.js",
    "content": "// @flow\nimport React from 'react';\nimport compose from 'recompose/compose';\nimport { withRouter, type Location, type History } from 'react-router';\nimport querystring from 'querystring';\nimport { connect } from 'react-redux';\nimport type { Dispatch } from 'redux';\nimport { addToastWithTimeout } from 'src/actions/toasts';\n\ntype Props = {\n  location: Location,\n  history: History,\n  dispatch: Dispatch<Object>,\n};\n\nclass QueryParamToastDispatcher extends React.Component<Props> {\n  getParams = (props: Props) => {\n    return querystring.parse(props.location.search.replace('?', ''));\n  };\n\n  componentDidMount() {\n    const params = this.filterToastParams(this.getParams(this.props));\n    if (this.hasValidToastParams(params)) {\n      this.props.dispatch(\n        addToastWithTimeout(params.toastType, params.toastMessage)\n      );\n      return this.cleanLocation();\n    }\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    const currProps = this.props;\n    const prevParams = this.filterToastParams(this.getParams(prevProps));\n    const currParams = this.filterToastParams(this.getParams(currProps));\n\n    const currValid = this.hasValidToastParams(currParams);\n    if (!currValid) return;\n\n    if (prevParams.toastMessage !== currParams.toastMessage) {\n      currProps.dispatch(\n        addToastWithTimeout(currParams.toastType, currParams.toastMessage)\n      );\n      return this.cleanLocation();\n    }\n  }\n\n  hasValidToastParams = (params: Object) => {\n    const validToastTypes = ['success', 'error', 'neutral'];\n    return (\n      params.toastType &&\n      validToastTypes.indexOf(params.toastType) >= 0 &&\n      params.toastMessage\n    );\n  };\n\n  /*\n    There could be many parameters besides toastMessage and toastType.\n    This component only cares about changes to these two specific params though,\n    so we can filter down to an object with only what we need and use that to\n    determine whether we need to dispatch a new toast or not\n  */\n  filterToastParams = (params: Object) => ({\n    toastMessage: params['toastMessage'],\n    toastType: params['toastType'],\n  });\n\n  cleanLocation = () => {\n    const params = this.getParams(this.props);\n    const clean = {};\n    Object.keys(params).map(key => {\n      if (!key || key === 'toastMessage' || key === 'toastType') return null;\n      clean[key] = params[key];\n      return null;\n    });\n    const cleanParams = querystring.stringify(clean);\n    /*\n      We decode the cleanParams in order to preserver special characters in the url\n      For example, the url /spectrum/general/another-thread~thread-2?m=MTQ4MzIyNTIwMDAwMg== \n      has two equals signs at the end. If we don't decode the cleanParams it will become\n      spectrum/general/another-thread~thread-2?m=MTQ4MzIyNTIwMDAwMg%3D%3D\n    */\n    return this.props.history.push({ search: decodeURIComponent(cleanParams) });\n  };\n\n  render() {\n    return null;\n  }\n}\n\nexport default compose(\n  withRouter,\n  connect()\n)(QueryParamToastDispatcher);\n"
  },
  {
    "path": "src/views/status/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { Bar } from './style';\nimport { withRouter } from 'react-router';\nimport compose from 'recompose/compose';\nimport { isViewingMarketingPage } from 'src/helpers/is-viewing-marketing-page';\nimport type { Dispatch } from 'redux';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\n\ntype Props = {\n  websocketConnection: string,\n  dispatch: Dispatch<Object>,\n  history: Object,\n  currentUser: Object,\n};\n\ntype State = {|\n  color: ?string,\n  label: ?string,\n  wsConnected: boolean,\n  online: boolean,\n  hidden: boolean,\n|};\n\nclass Status extends React.Component<Props, State> {\n  initialState = {\n    color: null,\n    label: null,\n    online: true,\n    wsConnected: true,\n    hidden: true,\n  };\n\n  state = this.initialState;\n\n  componentDidMount() {\n    window.addEventListener('offline', this.handleOnlineChange);\n    window.addEventListener('online', this.handleOnlineChange);\n    document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n    // Only show the bar after a five second timeout\n    setTimeout(() => {\n      this.setState({\n        hidden: false,\n      });\n    }, 5000);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('offline', this.handleOnlineChange);\n    window.removeEventListener('online', this.handleOnlineChange);\n  }\n\n  handleVisibilityChange = () => {\n    if (document && document.visibilityState === 'hidden') {\n      return this.props.dispatch({ type: 'PAGE_VISIBILITY', value: 'hidden' });\n    } else if (document && document.visibilityState === 'visible') {\n      return this.props.dispatch({ type: 'PAGE_VISIBILITY', value: 'visible' });\n    } else {\n      return;\n    }\n  };\n\n  handleOnlineChange = () => {\n    const online = window.navigator.onLine;\n    this.setState({\n      online,\n      label: online ? null : 'Lost internet connection.',\n      color: online ? null : 'warn',\n    });\n\n    this.props.dispatch({ type: 'NETWORK_CONNECTION', value: online });\n  };\n\n  handleWsChange = () => {\n    const { websocketConnection } = this.props;\n\n    if (websocketConnection === 'connected') {\n      return setTimeout(() => this.setState(this.initialState), 1000);\n    }\n\n    if (websocketConnection === 'disconnected') {\n      return this.setState({\n        color: 'special',\n        label: 'Reconnecting to server...',\n        wsConnected: false,\n        hidden: false,\n      });\n    }\n\n    if (websocketConnection === 'reconnected') {\n      this.setState({\n        color: 'success',\n        label: 'Reconnected!',\n        hidden: false,\n      });\n\n      return setTimeout(() => this.setState(this.initialState), 1000);\n    }\n  };\n\n  componentDidUpdate(prevProps) {\n    const curr = this.props;\n\n    if (prevProps.websocketConnection !== curr.websocketConnection) {\n      this.setState({\n        hidden: true,\n      });\n\n      if (curr.websocketConnection === 'disconnected') {\n        return setTimeout(() => {\n          return this.handleWsChange();\n        }, 5000);\n      }\n\n      return this.handleWsChange();\n    }\n  }\n\n  render() {\n    const { history, currentUser } = this.props;\n    const { color, online, wsConnected, label, hidden } = this.state;\n\n    if (isViewingMarketingPage(history, currentUser)) {\n      return null;\n    }\n\n    if (hidden) return null;\n    // if online and connected to the websocket, we don't need anything\n    if (online && wsConnected) return null;\n    return <Bar color={color}>{label}</Bar>;\n  }\n}\n\nconst map = state => ({\n  websocketConnection: state.connectionStatus.websocketConnection,\n});\n\nexport default compose(\n  // $FlowIssue\n  connect(map),\n  withCurrentUser,\n  withRouter\n)(Status);\n"
  },
  {
    "path": "src/views/status/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\n\nexport const Bar = styled.div`\n  display: grid;\n  grid-template-columns: 1fr;\n  grid-template-rows: 32px;\n  justify-items: center;\n  align-items: center;\n  background: ${props =>\n    props.color ? props.theme[props.color].default : 'transparent'};\n  color: ${props => (props.color ? props.theme.text.reverse : 'rgba(0,0,0,0)')};\n  font-size: 14px;\n  font-weight: 600;\n  text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\n  letter-spacing: -0.5px;\n  line-height: 1;\n`;\n"
  },
  {
    "path": "src/views/thread/components/actionBar.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport type { Dispatch } from 'redux';\nimport { ActionBarContainer } from '../style';\nimport ActionsDropdown from './actionsDropdown';\n\ntype Props = {\n  thread: GetThreadType,\n  currentUser: Object,\n  dispatch: Dispatch<Object>,\n  title: string,\n};\n\nclass ActionBar extends React.Component<Props> {\n  render() {\n    const { thread } = this.props;\n\n    return (\n      <ActionBarContainer>\n        <div style={{ display: 'flex', alignItems: 'center' }}>\n          <ActionsDropdown thread={thread} />\n        </div>\n      </ActionBarContainer>\n    );\n  }\n}\n\nexport default compose(connect())(ActionBar);\n"
  },
  {
    "path": "src/views/thread/components/actionsDropdown.js",
    "content": "// @flow\nimport React, { useState } from 'react';\nimport { Manager, Reference, Popper } from 'react-popper';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { openModal } from 'src/actions/modals';\nimport Flyout from 'src/components/flyout';\nimport OutsideClickHandler from 'src/components/outsideClickHandler';\nimport Icon from 'src/components/icon';\nimport { TextButton } from 'src/components/button';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { FlyoutRow, DropWrap, Label } from '../style';\n\ntype Props = {\n  thread: Object,\n  // Injected\n  currentUser: Object,\n  dispatch: Function,\n};\n\nconst ActionsDropdown = (props: Props) => {\n  const { thread, dispatch, currentUser } = props;\n  if (!currentUser) return null;\n\n  const {\n    channel: { channelPermissions },\n    community: { communityPermissions },\n  } = thread;\n\n  const isThreadAuthor =\n    currentUser && currentUser.id === thread.author.user.id;\n  const isChannelModerator = currentUser && channelPermissions.isModerator;\n  const isCommunityModerator = currentUser && communityPermissions.isModerator;\n  const isChannelOwner = currentUser && channelPermissions.isOwner;\n  const isCommunityOwner = currentUser && communityPermissions.isOwner;\n\n  const shouldRenderDeleteThreadAction =\n    isThreadAuthor ||\n    isChannelModerator ||\n    isCommunityModerator ||\n    isChannelOwner ||\n    isCommunityOwner;\n\n  const triggerDelete = e => {\n    e.preventDefault();\n\n    let message;\n\n    if (isCommunityOwner && !thread.isAuthor) {\n      message = `You are about to delete another person's thread. As the owner of the ${\n        thread.community.name\n      } community, you have permission to do this. The thread author will be notified that this thread was deleted.`;\n    } else if (isChannelOwner && !thread.isAuthor) {\n      message = `You are about to delete another person's thread. As the owner of the ${\n        thread.channel.name\n      } channel, you have permission to do this. The thread author will be notified that this thread was deleted.`;\n    } else {\n      message = 'Are you sure you want to delete this thread?';\n    }\n\n    return dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: thread.id,\n        entity: 'thread',\n        message,\n        extraProps: {\n          thread,\n        },\n      })\n    );\n  };\n\n  const [flyoutOpen, setFlyoutOpen] = useState(false);\n\n  if (!shouldRenderDeleteThreadAction) {\n    return null;\n  }\n\n  return (\n    <DropWrap style={{ marginRight: '8px' }}>\n      <Manager>\n        <Reference>\n          {({ ref }) => {\n            return (\n              <span ref={ref}>\n                <Icon\n                  glyph=\"settings\"\n                  onClick={() => setFlyoutOpen(!flyoutOpen)}\n                  data-cy=\"thread-actions-dropdown-trigger\"\n                />\n              </span>\n            );\n          }}\n        </Reference>\n        {flyoutOpen && (\n          <OutsideClickHandler onOutsideClick={() => setFlyoutOpen(false)}>\n            <Popper\n              modifiers={{\n                flip: {\n                  boundariesElement: 'viewport',\n                  behavior: ['top', 'bottom', 'top'],\n                },\n                hide: { enable: false },\n              }}\n            >\n              {({ style, ref }) => {\n                return (\n                  <div\n                    ref={ref}\n                    style={{\n                      position: 'relative',\n                      right: '170px',\n                      top: '-40px',\n                    }}\n                  >\n                    <Flyout data-cy=\"thread-actions-dropdown\" style={style}>\n                      {shouldRenderDeleteThreadAction && (\n                        <FlyoutRow>\n                          <TextButton\n                            onClick={triggerDelete}\n                            data-cy={'thread-dropdown-delete'}\n                          >\n                            <Icon size={24} glyph={'delete'} />\n                            <Label>Delete</Label>\n                          </TextButton>\n                        </FlyoutRow>\n                      )}\n                    </Flyout>\n                  </div>\n                );\n              }}\n            </Popper>\n          </OutsideClickHandler>\n        )}\n      </Manager>\n    </DropWrap>\n  );\n};\n\nexport default compose(\n  withCurrentUser,\n  connect()\n)(ActionsDropdown);\n"
  },
  {
    "path": "src/views/thread/components/lockedMessages.js",
    "content": "// @flow\nimport React from 'react';\nimport { LockedWrapper } from '../style';\n\ntype Props = {\n  children: React$Node,\n};\n\nconst LockedMessages = ({ children }: Props) => (\n  <LockedWrapper>{children}</LockedWrapper>\n);\n\nexport default LockedMessages;\n"
  },
  {
    "path": "src/views/thread/components/messagesSubscriber.js",
    "content": "// @flow\nimport React from 'react';\nimport { withRouter } from 'react-router-dom';\nimport queryString from 'query-string';\nimport compose from 'recompose/compose';\nimport getThreadMessages, {\n  type GetThreadMessageConnectionType,\n} from 'shared/graphql/queries/thread/getThreadMessageConnection';\nimport { sortAndGroupMessages } from 'shared/clients/group-messages';\nimport NextPageButton from 'src/components/nextPageButton';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport ChatMessages from 'src/components/messageGroup';\nimport { Loading } from 'src/components/loading';\nimport NullMessages from './nullMessages';\nimport type { Location } from 'react-router';\nimport { NullMessagesWrapper } from '../style';\n\ntype Props = {\n  // Used by getThreadMessages query\n  isWatercooler: boolean,\n  data: {\n    loading: boolean,\n    thread: ?GetThreadMessageConnectionType,\n  },\n  loadPreviousPage: Function,\n  loadNextPage: Function,\n  onMessagesLoaded?: Function,\n  location: Location,\n  thread?: Object,\n  ...$Exact<ViewNetworkHandlerType>,\n};\n\nclass Messages extends React.Component<Props> {\n  componentDidMount() {\n    const thread = this.props.data.thread || this.props.thread;\n    // Scroll to bottom on mount if we got cached data as getSnapshotBeforeUpdate does not fire for mounts\n    if (thread && thread.watercooler) {\n      const elem = document.getElementById('main');\n      if (!elem) return;\n      elem.scrollTop = elem.scrollHeight;\n    }\n  }\n\n  getSnapshotBeforeUpdate(prev) {\n    const curr = this.props;\n    // First load\n    if (!prev.data.thread && curr.data.thread && curr.data.thread.watercooler) {\n      return {\n        type: 'bottom',\n      };\n    }\n    // New messages\n    if (\n      prev.data.thread &&\n      curr.data.thread &&\n      prev.data.thread.messageConnection.edges.length > 0 &&\n      curr.data.thread.messageConnection.edges.length > 0 &&\n      prev.data.thread.messageConnection.edges.length <\n        curr.data.thread.messageConnection.edges.length\n    ) {\n      const elem = document.getElementById('main');\n      if (!elem || !curr.data.thread) return null;\n\n      // If new messages were added at the top, persist the scroll position\n      if (\n        prev.data.thread.messageConnection.edges[0].node.id !==\n        curr.data.thread.messageConnection.edges[0].node.id\n      ) {\n        return {\n          type: 'persist',\n          values: {\n            top: elem.scrollTop,\n            height: elem.scrollHeight,\n          },\n        };\n      }\n\n      // If more than one new message was added at the bottom, stick to the current position\n      if (\n        prev.data.thread.messageConnection.edges.length + 1 <\n        curr.data.thread.messageConnection.edges.length\n      ) {\n        return null;\n      }\n\n      // If only one message came in and we are near the bottom when new messages come in, stick to the bottom\n      if (elem.scrollHeight < elem.scrollTop + elem.clientHeight + 400) {\n        return {\n          type: 'bottom',\n        };\n      }\n\n      // Otherwise stick to the current position\n      return null;\n    }\n    return null;\n  }\n\n  componentDidUpdate(prevProps, __, snapshot) {\n    const { onMessagesLoaded } = this.props;\n    // after the messages load, pass it back to the thread container so that\n    // it can populate @ mention suggestions\n    const prevData = prevProps.data;\n    const currData = this.props.data;\n    const wasLoading = prevData && prevData.loading;\n    const hasPrevThread = prevData && prevData.thread;\n    const hasCurrThread = currData && currData.thread;\n    const previousMessageConnection =\n      // $FlowIssue\n      hasPrevThread && prevData.thread.messageConnection;\n    const currMessageConnection =\n      // $FlowIssue\n      hasCurrThread && currData.thread.messageConnection;\n    // thread loaded for the first time\n    if (!hasPrevThread && hasCurrThread && currMessageConnection) {\n      if (currMessageConnection.edges.length > 0) {\n        onMessagesLoaded && onMessagesLoaded(currData.thread);\n      }\n    }\n    // new messages arrived\n    if (previousMessageConnection && hasCurrThread && currMessageConnection) {\n      if (\n        currMessageConnection.edges.length >\n        previousMessageConnection.edges.length\n      ) {\n        onMessagesLoaded && onMessagesLoaded(currData.thread);\n      }\n      // already loaded the thread, but was refetched\n      if (wasLoading && !currData.loading) {\n        onMessagesLoaded && onMessagesLoaded(currData.thread);\n      }\n    }\n\n    if (snapshot) {\n      const elem = document.getElementById('main');\n      if (!elem) return;\n      switch (snapshot.type) {\n        case 'bottom': {\n          elem.scrollTop = elem.scrollHeight;\n          return;\n        }\n        case 'persist': {\n          elem.scrollTop =\n            elem.scrollHeight - snapshot.values.height + snapshot.values.top;\n          return;\n        }\n        default: {\n          return;\n        }\n      }\n    }\n  }\n\n  render() {\n    const { data, isLoading, isFetchingMore, hasError } = this.props;\n\n    const { thread } = data;\n    if (thread && thread.messageConnection) {\n      const { messageConnection } = thread;\n      const { edges } = messageConnection;\n\n      if (edges.length === 0) return <NullMessages />;\n\n      const unsortedMessages = edges.map(message => message && message.node);\n      const sortedMessages = sortAndGroupMessages(unsortedMessages);\n\n      if (!sortedMessages || sortedMessages.length === 0)\n        return <NullMessages />;\n\n      return (\n        <React.Fragment>\n          {messageConnection.pageInfo.hasPreviousPage && (\n            <NextPageButton\n              isFetchingMore={isFetchingMore}\n              fetchMore={this.props.loadPreviousPage}\n              automatic={!!thread.watercooler}\n              href={{\n                pathname: this.props.location.pathname,\n                search: queryString.stringify({\n                  ...queryString.parse(this.props.location.search),\n                  msgsbefore: messageConnection.edges[0].cursor,\n                  msgsafter: undefined,\n                }),\n              }}\n            >\n              Show previous messages\n            </NextPageButton>\n          )}\n          <ChatMessages\n            thread={thread}\n            uniqueMessageCount={unsortedMessages.length}\n            messages={sortedMessages}\n            threadType={'story'}\n            isWatercooler={thread.watercooler}\n          />\n          {messageConnection.pageInfo.hasNextPage && (\n            <NextPageButton\n              isFetchingMore={isFetchingMore}\n              fetchMore={this.props.loadNextPage}\n              href={{\n                pathname: this.props.location.pathname,\n                search: queryString.stringify({\n                  ...queryString.parse(this.props.location.search),\n                  msgsafter:\n                    messageConnection.edges[messageConnection.edges.length - 1]\n                      .cursor,\n                  msgsbefore: undefined,\n                }),\n              }}\n            >\n              Show more messages\n            </NextPageButton>\n          )}\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading)\n      return (\n        <NullMessagesWrapper>\n          <Loading style={{ height: '80vh' }} />\n        </NullMessagesWrapper>\n      );\n\n    if (hasError) return null;\n\n    return null;\n  }\n}\n\nexport default compose(\n  withRouter,\n  getThreadMessages,\n  viewNetworkHandler\n)(Messages);\n"
  },
  {
    "path": "src/views/thread/components/nullMessages.js",
    "content": "// @flow\nimport React from 'react';\nimport { NullMessagesWrapper, NullCopy, Stretch } from '../style';\n\nconst NullMessages = () => (\n  <Stretch>\n    <NullMessagesWrapper>\n      <NullCopy>No messages yet</NullCopy>\n    </NullMessagesWrapper>\n  </Stretch>\n);\n\nexport default NullMessages;\n"
  },
  {
    "path": "src/views/thread/components/stickyHeader.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { Link } from 'react-router-dom';\nimport { truncate } from 'src/helpers/utils';\nimport { UserAvatar } from 'src/components/avatar';\nimport { convertTimestampToDate } from 'shared/time-formatting';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport { useAppScroller } from 'src/hooks/useAppScroller';\nimport ActionsDropdown from './actionsDropdown';\nimport {\n  StickyHeaderContent,\n  CommunityHeaderName,\n  CommunityHeaderMeta,\n  CommunityHeaderSubtitle,\n  CommunityHeaderMetaCol,\n  StickyHeaderContainer,\n  StickyHeaderActionsContainer,\n} from '../style';\n\ntype Props = {\n  thread: GetThreadType,\n};\n\nconst StickyHeader = (props: Props) => {\n  const { thread } = props;\n  const { scrollToTop } = useAppScroller();\n  const { channel } = thread;\n\n  const createdAt = new Date(thread.createdAt).getTime();\n  const timestamp = convertTimestampToDate(createdAt);\n\n  return (\n    <StickyHeaderContainer>\n      <StickyHeaderContent onClick={scrollToTop}>\n        <CommunityHeaderMeta>\n          <UserAvatar showHoverProfile username={thread.author.user.username} />\n          <CommunityHeaderMetaCol>\n            <CommunityHeaderName>\n              {truncate(thread.content.title, 80)}\n            </CommunityHeaderName>\n            <CommunityHeaderSubtitle>\n              <Link to={getThreadLink(thread)}>{timestamp}</Link>\n            </CommunityHeaderSubtitle>\n          </CommunityHeaderMetaCol>\n        </CommunityHeaderMeta>\n      </StickyHeaderContent>\n\n      {channel.channelPermissions.isMember && (\n        <StickyHeaderActionsContainer>\n          <ActionsDropdown thread={thread} />\n        </StickyHeaderActionsContainer>\n      )}\n    </StickyHeaderContainer>\n  );\n};\n\nexport default compose(connect())(StickyHeader);\n"
  },
  {
    "path": "src/views/thread/components/threadByline.js",
    "content": "// @flow\nimport * as React from 'react';\nimport Badge from 'src/components/badges';\nimport type { ThreadParticipantType } from 'shared/graphql/fragments/thread/threadParticipant';\nimport { UserAvatar } from 'src/components/avatar';\nimport {\n  Byline,\n  BylineMeta,\n  AuthorName,\n  AuthorNameLink,\n  AuthorNameNoLink,\n  AuthorUsername,\n} from '../style';\n\ntype Props = {\n  author: {\n    ...$Exact<ThreadParticipantType>,\n  },\n};\nclass ThreadByline extends React.Component<Props> {\n  render() {\n    const { author } = this.props;\n    const { user, roles } = author;\n\n    return (\n      <Byline>\n        <UserAvatar user={user} size={40} showHoverProfile={false} />\n        <BylineMeta>\n          {user.username ? (\n            <AuthorNameLink to={`/users/${user.username}`}>\n              <AuthorName>{user.name}</AuthorName>\n              <AuthorUsername>@{user.username}</AuthorUsername>\n              {roles.map((role, index) => (\n                <Badge type={role} key={index} />\n              ))}\n              {user.betaSupporter && (\n                <Badge type=\"beta-supporter\" label=\"Supporter\" />\n              )}\n            </AuthorNameLink>\n          ) : (\n            <AuthorNameNoLink>\n              <AuthorName>{user.name}</AuthorName>\n              {roles.map((role, index) => (\n                <Badge type={role} key={index} />\n              ))}\n            </AuthorNameNoLink>\n          )}\n        </BylineMeta>\n      </Byline>\n    );\n  }\n}\n\nexport default ThreadByline;\n"
  },
  {
    "path": "src/views/thread/components/threadDetail.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { Link } from 'react-router-dom';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport { timeDifference } from 'shared/time-difference';\nimport { convertTimestampToDate } from 'shared/time-formatting';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport ThreadRenderer from 'src/components/threadRenderer';\nimport ActionBar from './actionBar';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { UserListItem } from 'src/components/entities';\nimport {\n  ThreadWrapper,\n  ThreadContent,\n  ThreadHeading,\n  ThreadSubtitle,\n  BylineContainer,\n} from '../style';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport type { Dispatch } from 'redux';\nimport { ErrorBoundary } from 'src/components/error';\n\ntype State = {\n  body: ?string,\n  title: string,\n  flyoutOpen?: ?boolean,\n  error?: ?string,\n  parsedBody: ?Object,\n};\n\ntype Props = {\n  thread: GetThreadType,\n  dispatch: Dispatch<Object>,\n  currentUser: ?Object,\n  ref?: any,\n};\n\nclass ThreadDetailPure extends React.Component<Props, State> {\n  state = {\n    parsedBody: null,\n    body: '',\n    title: '',\n    flyoutOpen: false,\n    error: '',\n  };\n\n  bodyEditor: any;\n  titleTextarea: React$Node;\n\n  componentWillMount() {\n    this.setThreadState();\n  }\n\n  setThreadState() {\n    const { thread } = this.props;\n\n    const parsedBody = JSON.parse(thread.content.body);\n\n    return this.setState({\n      body: '',\n      title: thread.content.title,\n      // We store this in the state to avoid having to JSON.parse on every render\n      parsedBody,\n      flyoutOpen: false,\n    });\n  }\n\n  componentDidUpdate(prevProps) {\n    if (\n      prevProps.thread &&\n      this.props.thread &&\n      prevProps.thread.id !== this.props.thread.id\n    ) {\n      this.setThreadState();\n    }\n  }\n\n  changeTitle = e => {\n    const title = e.target.value;\n    if (/\\n$/g.test(title)) {\n      this.bodyEditor.focus && this.bodyEditor.focus();\n      return;\n    }\n    this.setState({\n      title,\n    });\n  };\n\n  changeBody = evt => {\n    this.setState({\n      body: evt.target.value,\n    });\n  };\n\n  render() {\n    const { currentUser, thread } = this.props;\n\n    const createdAt = new Date(thread.createdAt).getTime();\n    const timestamp = convertTimestampToDate(createdAt);\n    const { author } = thread;\n\n    const editedTimestamp = thread.modifiedAt\n      ? new Date(thread.modifiedAt).getTime()\n      : null;\n\n    return (\n      <ThreadWrapper ref={this.props.ref}>\n        <ThreadContent>\n          <BylineContainer>\n            <UserListItem\n              userObject={author.user}\n              name={author.user.name}\n              username={author.user.username}\n              profilePhoto={author.user.profilePhoto}\n              badges={author.roles}\n              isCurrentUser={currentUser && author.user.id === currentUser.id}\n              avatarSize={40}\n              showHoverProfile={false}\n              messageButton={currentUser && author.user.id !== currentUser.id}\n            />\n          </BylineContainer>\n\n          {thread.community.website && thread.community.redirect && (\n            <div\n              style={{\n                width: 'calc(100% + 32px)',\n                borderBottom: '1px solid #f6f7f8',\n                padding: '12px 16px',\n                background: '#FFE6BF',\n                marginLeft: '-16px',\n                marginRight: '-16px',\n                color: '#7D4A00',\n              }}\n            >\n              The {thread.community.name} community has a new home. This thread\n              is preserved for historical purposes. The content of this\n              conversation may be innaccurrate or out of date.{' '}\n              <a\n                style={{ color: '#D85537', fontWeight: '600' }}\n                href={thread.community.website}\n              >\n                Go to new community home &rarr;\n              </a>\n            </div>\n          )}\n\n          <div style={{ height: '16px' }} />\n\n          <ThreadHeading>{thread.content.title}</ThreadHeading>\n\n          <ThreadSubtitle>\n            <Link to={getThreadLink(thread)}>\n              {timestamp}\n              {thread.modifiedAt && (\n                <React.Fragment>\n                  {' '}\n                  (Edited{' '}\n                  {timeDifference(Date.now(), editedTimestamp).toLowerCase()}\n                  {thread.editedBy &&\n                    thread.editedBy.user.id !== thread.author.user.id &&\n                    ` by @${thread.editedBy.user.username}`}\n                  )\n                </React.Fragment>\n              )}\n            </Link>\n          </ThreadSubtitle>\n\n          <ThreadRenderer body={JSON.parse(thread.content.body)} />\n        </ThreadContent>\n\n        <ErrorBoundary>\n          <ActionBar\n            currentUser={currentUser}\n            thread={thread}\n            title={this.state.title}\n          />\n        </ErrorBoundary>\n      </ThreadWrapper>\n    );\n  }\n}\n\nconst ThreadDetail = compose(withRouter)(ThreadDetailPure);\n\nconst map = state => ({\n  flyoutOpen: state.flyoutOpen,\n});\n\nexport default compose(\n  withCurrentUser,\n  // $FlowIssue\n  connect(map)\n)(ThreadDetail);\n"
  },
  {
    "path": "src/views/thread/components/threadHead.js",
    "content": "// @flow\nimport React from 'react';\nimport Head from 'src/components/head';\nimport getThreadLink from 'src/helpers/get-thread-link';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport type { ThreadInfoType } from 'shared/graphql/fragments/thread/threadInfo';\n\ntype Props = {\n  thread: ThreadInfoType,\n};\n\nconst ThreadHead = (props: Props) => {\n  const { thread } = props;\n  const {\n    metaImage,\n    type,\n    community,\n    content,\n    createdAt,\n    modifiedAt,\n    author,\n  } = thread;\n  const { title, description } = generateMetaInfo({\n    type: 'thread',\n    data: {\n      title: content.title,\n      body: content.body,\n      type: type,\n      communityName: community.name,\n    },\n  });\n\n  return (\n    <Head\n      title={title}\n      description={description}\n      type=\"article\"\n      image={metaImage}\n      key={title}\n    >\n      <link\n        rel=\"canonical\"\n        href={`https://spectrum.chat${getThreadLink(thread)}`}\n      />\n      {metaImage && <meta name=\"twitter:card\" content=\"summary_large_image\" />}\n      <meta\n        property=\"article:published_time\"\n        content={new Date(createdAt).toISOString()}\n      />\n      <meta\n        property=\"article:modified_time\"\n        content={new Date(modifiedAt || createdAt).toISOString()}\n      />\n      <meta\n        property=\"article:author\"\n        content={`https://spectrum.chat/users/@${author.user.username}`}\n      />\n      <meta\n        property=\"article:section\"\n        content={`${community.name} community`}\n      />\n      {community.redirect && community.noindex && (\n        <meta name=\"robots\" content=\"noindex, nofollow\" />\n      )}\n    </Head>\n  );\n};\n\nexport default ThreadHead;\n"
  },
  {
    "path": "src/views/thread/container/index.js",
    "content": "// @flow\nimport React, { useEffect, useState } from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router-dom';\nimport { withApollo } from 'react-apollo';\nimport { getThreadByMatch } from 'shared/graphql/queries/thread/getThread';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport viewNetworkHandler, {\n  type ViewNetworkHandlerType,\n} from 'src/components/viewNetworkHandler';\nimport { LoadingView, ErrorView } from 'src/views/viewHelpers';\nimport {\n  ViewGrid,\n  SecondaryPrimaryColumnGrid,\n  PrimaryColumn,\n  SecondaryColumn,\n  SingleColumnGrid,\n} from 'src/components/layout';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport MessagesSubscriber from '../components/messagesSubscriber';\nimport StickyHeader from '../components/stickyHeader';\nimport ThreadDetail from '../components/threadDetail';\nimport ThreadHead from '../components/threadHead';\nimport { Stretch } from '../style';\nimport { deduplicateChildren } from 'src/components/infiniteScroll/deduplicateChildren';\nimport type { GetThreadType } from 'shared/graphql/queries/thread/getThread';\nimport CommunitySidebar from 'src/components/communitySidebar';\nimport { ErrorBoundary } from 'src/components/error';\n\ntype Props = {\n  ...$Exact<ViewNetworkHandlerType>,\n  data: {\n    thread: GetThreadType,\n  },\n  client: Object,\n  className?: string,\n  currentUser?: Object,\n  dispatch: Function,\n  isModal: boolean,\n  children: React$Node,\n};\n\nconst ThreadContainer = (props: Props) => {\n  const {\n    data,\n    isLoading,\n    children,\n    dispatch,\n    className,\n    isModal = false,\n  } = props;\n\n  if (isLoading) return <LoadingView />;\n\n  const { thread } = data;\n  if (!thread) return <ErrorView data-cy=\"null-thread-view\" />;\n\n  /*\n  update the last seen timestamp of the current thread whenever it first\n  loads, as well as when it unmounts as the user closes the thread. This\n  should provide the effect of locally marking the thread as \"seen\" while\n  athena handles storing the actual lastSeen timestamp update in the background\n  asynchronously.\n  */\n\n  const [, setMentionSuggestions] = useState([thread.author.user]);\n  const updateMentionSuggestions = (thread: GetThreadType) => {\n    const { messageConnection, author } = thread;\n\n    if (!messageConnection || messageConnection.edges.length === 0)\n      return setMentionSuggestions([author.user]);\n\n    const participants = messageConnection.edges\n      .map(edge => edge.node)\n      .map(node => node.author.user);\n\n    const participantsWithAuthor = [...participants, author.user];\n    const filtered = deduplicateChildren(participantsWithAuthor, 'id');\n    return setMentionSuggestions(filtered);\n  };\n\n  useEffect(() => {\n    dispatch(\n      setTitlebarProps({\n        title: 'Conversation',\n        leftAction: 'view-back',\n      })\n    );\n  }, []);\n\n  const renderPrimaryColumn = fullWidth => (\n    <PrimaryColumn fullWidth={fullWidth}>\n      {/*\n        This <Stretch> container makes sure that the thread detail and messages\n        component are always at least the height of the screen, minus the\n        height of the chat input. This is necessary because we always want\n        the chat input at the bottom of the view, so it must always be tricked\n        into thinking that its preceding sibling is full-height.\n      */}\n      <Stretch\n        isModal={isModal}\n        data-cy={isModal ? 'thread-is-modal' : undefined}\n      >\n        <ErrorBoundary>\n          <StickyHeader thread={thread} />\n        </ErrorBoundary>\n\n        <ThreadDetail thread={thread} />\n\n        <MessagesSubscriber\n          id={thread.id}\n          thread={thread}\n          isWatercooler={thread.watercooler} // used in the graphql query to always fetch the latest messages\n          onMessagesLoaded={updateMentionSuggestions}\n        />\n      </Stretch>\n    </PrimaryColumn>\n  );\n\n  return (\n    <React.Fragment>\n      <ThreadHead thread={thread} />\n      <ViewGrid className={className} data-cy=\"thread-view\">\n        {children}\n        {isModal ? (\n          <SingleColumnGrid>{renderPrimaryColumn(true)}</SingleColumnGrid>\n        ) : (\n          <SecondaryPrimaryColumnGrid>\n            <SecondaryColumn>\n              <CommunitySidebar community={thread.community} />\n            </SecondaryColumn>\n            {renderPrimaryColumn(false)}\n          </SecondaryPrimaryColumnGrid>\n        )}\n      </ViewGrid>\n    </React.Fragment>\n  );\n};\n\nexport default compose(\n  getThreadByMatch,\n  viewNetworkHandler,\n  withRouter,\n  withApollo,\n  withCurrentUser,\n  connect()\n)(ThreadContainer);\n"
  },
  {
    "path": "src/views/thread/index.js",
    "content": "// @flow\nimport React from 'react';\nimport Loadable from 'react-loadable';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\n\n/* prettier-ignore */\nconst loader = () => import('./container'/* webpackChunkName: \"Thread\" */);\n\nconst getLoading = () => ({ error, pastDelay }) => {\n  if (error) {\n    return <ErrorView />;\n  } else if (pastDelay) {\n    return <LoadingView />;\n  }\n\n  return null;\n};\n\nexport const ThreadView = Loadable({\n  loader,\n  loading: getLoading(),\n  modules: ['./container'],\n});\n"
  },
  {
    "path": "src/views/thread/redirect-old-route.js",
    "content": "// @flow\n// Redirect the old thread route (/thread/:threadId) to the new one (/:community/:channel/:threadId)\nimport React from 'react';\nimport { Redirect } from 'react-router';\nimport { getThreadByMatch } from 'shared/graphql/queries/thread/getThread';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport getThreadLink from 'src/helpers/get-thread-link';\n\nexport default getThreadByMatch(props => {\n  const { data, location } = props;\n  if (data) {\n    const { thread, loading, error } = data;\n\n    if (thread && thread.id) {\n      return (\n        <Redirect\n          to={{\n            ...location,\n            pathname: `${getThreadLink(thread)}`,\n          }}\n        />\n      );\n    }\n\n    if (loading) {\n      return <LoadingView />;\n    }\n\n    // If we don't have a thread, but also aren't loading anymore it's either a private or a non-existent thread\n    if (error) {\n      return <ErrorView />;\n    }\n\n    return <ErrorView data-cy=\"null-thread-view\" />;\n  }\n\n  return null;\n});\n"
  },
  {
    "path": "src/views/thread/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled, { css } from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { OutlineButton } from 'src/components/button';\nimport Column from 'src/components/column';\nimport { MEDIA_BREAK } from 'src/components/layout';\nimport {\n  FlexCol,\n  FlexRow,\n  H1,\n  H3,\n  Transition,\n  zIndex,\n  Truncate,\n} from 'src/components/globals';\n\nexport const ThreadViewContainer = styled.div`\n  display: flex;\n  width: 100%;\n  height: 100%;\n  max-width: 1024px;\n  background-color: ${theme.bg.wash};\n  margin: ${props =>\n    props.threadViewContext === 'fullscreen' ? '0 auto' : '0'};\n\n  @media (max-width: 1024px) {\n    max-height: 100%;\n    flex-direction: column;\n    overflow: hidden;\n  }\n`;\n\nexport const ThreadContentView = styled(FlexCol)`\n  background-color: ${theme.bg.default};\n  ${props =>\n    !props.slider &&\n    css`\n      box-shadow: -1px 0 0 ${theme.bg.border}, 1px 0 0 ${theme.bg.border};\n    `} overflow-y: auto;\n  overflow-x: visible;\n  max-width: 100%;\n  max-height: 100%;\n  flex: auto;\n  display: flex;\n  align-items: center;\n  align-self: stretch;\n  grid-template-rows: 48px 1fr 64px;\n  grid-template-columns: 100%;\n  grid-template-areas: 'header' 'body' 'footer';\n  position: relative;\n`;\n\nexport const ThreadSidebarView = styled(FlexCol)`\n  background-color: ${theme.bg.wash};\n  overflow: hidden;\n  min-width: 320px;\n  max-width: 320px;\n  max-height: 100%;\n  flex: auto;\n  display: flex;\n  align-items: center;\n  align-self: stretch;\n  position: relative;\n  right: 1px;\n  overflow-y: auto;\n\n  @media (max-width: 1032px) {\n    display: none;\n  }\n`;\n\nexport const Content = styled(FlexRow)`\n  justify-content: center;\n  align-items: flex-start;\n  flex: auto;\n  overflow-y: auto;\n  grid-area: body;\n  width: 100%;\n  max-width: 1024px;\n  margin: 0 auto;\n  background: ${theme.bg.default};\n`;\n\nexport const Input = styled(FlexRow)`\n  flex: none;\n  justify-content: center;\n  grid-area: footer;\n  max-width: 100%;\n  align-self: stretch;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    z-index: ${zIndex.mobileInput};\n  }\n`;\n\nexport const Detail = styled(Column)`\n  min-width: 100%;\n  margin: 0;\n`;\n\nexport const DetailViewWrapper = styled(FlexCol)`\n  background-image: ${({ theme }) =>\n    `linear-gradient(to right, ${theme.bg.wash}, ${theme.bg.default} 15%, ${\n      theme.bg.default\n    } 85%, ${theme.bg.wash})`};\n  flex: auto;\n  justify-content: flex-start;\n  align-items: center;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    background-color: ${theme.bg.default};\n    background-image: none;\n  }\n`;\n\nexport const Container = styled(FlexCol)`\n  padding-top: 32px;\n  width: 100%;\n  justify-content: flex-start;\n  align-items: stretch;\n  flex: auto;\n  overflow-y: scroll;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding-top: 16px;\n  }\n`;\n\nexport const ThreadWrapper = styled(FlexCol)`\n  font-size: 16px;\n  flex: none;\n  min-width: 320px;\n  position: relative;\n  background: ${theme.bg.default};\n  width: 100%;\n  max-width: 100%;\n  /* manually nudge up 60px to cover the sliding header in the thread view */\n  top: -68px;\n  margin-bottom: -68px;\n  z-index: 3;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    top: 0;\n    margin-bottom: 0;\n  }\n`;\n\nexport const ThreadContent = styled.div`\n  height: 100%;\n  padding: 16px;\n\n  @media (max-width: 1024px) {\n    padding: 16px;\n  }\n`;\n\nexport const ThreadHeading = styled(H1)`\n  font-size: 28px;\n  font-weight: 600;\n  word-break: break-word;\n  margin-bottom: 16px;\n`;\n\nexport const A = styled.a`\n  display: flex;\n`;\n\nexport const SocialShareWrapper = styled(FlexRow)`\n  justify-content: space-between;\n  margin-top: 20px;\n\n  ${A}:first-child {\n    margin-right: 20px;\n  }\n\n  @media (max-width: 500px) {\n    flex-direction: column;\n\n    ${A}:first-child {\n      margin-right: 0;\n      margin-bottom: 8px;\n    }\n  }\n`;\n\nexport const ContextRow = styled(FlexRow)`\n  justify-content: space-between;\n  align-items: flex-start;\n  align-content: flex-start;\n`;\n\nexport const EditDone = styled.div`\n  position: relative;\n`;\n\nexport const DropWrap = styled(FlexCol)`\n  width: 32px;\n  height: 32px;\n  position: relative;\n  color: ${theme.text.placeholder};\n  transition: ${Transition.hover.off};\n  margin: 0 8px;\n\n  &:hover {\n    color: ${theme.text.secondary};\n    cursor: pointer;\n    transition: ${Transition.hover.on};\n  }\n\n  .flyout {\n    position: absolute;\n    right: auto;\n    width: 200px;\n  }\n`;\n\nexport const FlyoutRow = styled(FlexRow)`\n  width: 100%;\n\n  button {\n    width: 100%;\n    justify-content: flex-start;\n    border-top: 1px solid ${theme.bg.divider};\n    border-radius: 0;\n    transition: none;\n    padding: 4px 12px;\n    font-size: 13px;\n    font-weight: 500;\n  }\n\n  button:hover {\n    background: ${theme.bg.wash};\n    border-top: 1px solid ${theme.bg.divider};\n    transition: none;\n  }\n\n  &:first-of-type {\n    button {\n      border-top: 0;\n      border-radius: 4px 4px 0 0;\n    }\n  }\n\n  &:last-of-type {\n    button {\n      border-radius: 0 0 4px 4px;\n    }\n  }\n\n  ${props =>\n    props.hideBelow &&\n    css`\n      @media (max-width: ${props.hideBelow}px) {\n        display: none;\n      }\n    `};\n\n  ${props =>\n    props.hideAbove &&\n    css`\n      @media (min-width: ${props.hideAbove}px) {\n        display: none;\n      }\n    `};\n`;\n\nexport const Byline = styled.div`\n  font-weight: 400;\n  color: ${theme.brand.alt};\n  display: flex;\n  align-items: center;\n  flex: auto;\n  font-size: 14px;\n`;\n\nexport const BylineMeta = styled(FlexCol)`\n  margin-left: 12px;\n`;\n\nexport const AuthorNameLink = styled(Link)`\n  display: flex;\n`;\nexport const AuthorNameNoLink = styled.div`\n  display: flex;\n`;\nexport const AuthorName = styled(H3)`\n  font-weight: 500;\n  max-width: 100%;\n  color: ${theme.text.default};\n  margin-right: 4px;\n  font-size: 14px;\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const AuthorUsername = styled.span`\n  color: ${theme.text.alt};\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  font-weight: 400;\n  margin-right: 4px;\n  align-self: flex-end;\n  word-break: break-all;\n`;\n\nexport const Location = styled(FlexRow)`\n  font-weight: 500;\n  color: ${theme.text.alt};\n  font-size: 14px;\n  margin-top: -16px;\n  margin-left: -16px;\n  margin-bottom: 16px;\n  align-self: flex-start;\n\n  &:hover > div {\n    color: ${theme.brand.alt};\n  }\n\n  > div {\n    color: ${theme.text.placeholder};\n  }\n\n  > span {\n    padding: 0 4px;\n    color: ${theme.text.placeholder};\n  }\n\n  > a:hover {\n    color: ${theme.brand.alt};\n    text-decoration: underline;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const Timestamp = styled.span`\n  font-weight: 400;\n  margin: 8px 0;\n  font-size: 16px;\n  color: ${theme.text.alt};\n  display: inline-block;\n`;\n\nexport const ChatWrapper = styled.div`\n  width: 100%;\n  max-width: 100%;\n  flex: none;\n  margin-top: 16px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    overflow-x: hidden;\n  }\n`;\n\nexport const NullMessagesWrapper = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 64px 32px;\n  flex: 1;\n  color: ${theme.text.alt};\n  flex-direction: column;\n  width: 100%;\n  background: ${theme.bg.default};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding-bottom: 128px;\n  }\n\n  > .icon {\n    opacity: 0.4;\n  }\n`;\n\nexport const NullCopy = styled.h5`\n  font-size: 18px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n  margin-top: 16px;\n  text-align: center;\n  max-width: 600px;\n`;\n\nexport const ThreadTitle = {\n  fontSize: '32px',\n  padding: '0',\n  outline: 'none',\n  border: '0',\n  lineHeight: '1.4',\n  fontWeight: '800',\n  boxShadow: 'none',\n  width: '100%',\n  color: '#171A21',\n  whiteSpace: 'pre-wrap',\n  wordBreak: 'break-word',\n  borderRadius: '12px 12px 0 0',\n};\n\nexport const ThreadDescription = {\n  fontSize: '16px', // has to be 16px to avoid zoom on iOS\n  fontWeight: '500',\n  width: '100%',\n  display: 'inline-block',\n  lineHeight: '1.4',\n  padding: '0',\n  outline: 'none',\n  border: '0',\n  boxShadow: 'none',\n  color: '#171A21',\n  whiteSpace: 'pre-wrap',\n  wordBreak: 'break-word',\n};\n\nexport const ShareButtons = styled.div`\n  display: flex;\n  align-items: center;\n  margin-left: 12px;\n`;\n\nexport const ShareButton = styled.span`\n  color: ${theme.text.alt};\n  display: flex;\n  background: none;\n\n  a {\n    display: flex;\n    flex: 1;\n    align-items: center;\n    justify-content: center;\n    padding: 0 6px;\n  }\n\n  &:hover {\n    color: ${props =>\n      props.facebook\n        ? props.theme.social.facebook.default\n        : props.twitter\n        ? props.theme.social.twitter.default\n        : props.theme.text.default};\n  }\n`;\n\nexport const StickyHeaderContent = styled.div`\n  display: flex;\n  padding: 12px 16px;\n  cursor: pointer;\n  max-width: 560px;\n\n  @media (max-width: 728px) {\n    padding: 16px;\n    display: flex;\n  }\n`;\n\nexport const StickyHeaderActionsContainer = styled.div`\n  padding: 12px 0;\n  display: flex;\n  align-items: center;\n  flex: 0 1 auto;\n`;\n\nexport const CommunityHeaderName = styled.h3`\n  font-size: 16px;\n  font-weight: 600;\n  margin-right: 8px;\n  color: ${theme.text.default};\n  line-height: 1.2;\n  max-width: 100%;\n  ${Truncate};\n`;\n\nexport const CommunityHeaderSubtitle = styled.span`\n  display: flex;\n  align-items: center;\n  font-size: 12px;\n  margin-top: 4px;\n  line-height: 12px;\n  color: ${theme.text.alt};\n  ${Truncate};\n\n  > a {\n    display: flex;\n    flex: 0 0 auto;\n  }\n\n  > a:hover {\n    color: ${theme.brand.default};\n  }\n`;\n\nexport const ThreadSubtitle = styled(CommunityHeaderSubtitle)`\n  font-size: 16px;\n  margin-top: 8px;\n  margin-bottom: 16px;\n  display: flex;\n  line-height: 1.5;\n  flex-wrap: wrap;\n\n  a:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const CommunityHeaderChannelTag = styled.div`\n  color: ${theme.text.reverse};\n  background: ${theme.warn.alt};\n  border-radius: 20px;\n  padding: 0 12px;\n  font-size: 11px;\n  text-transform: uppercase;\n  font-weight: 700;\n  display: flex;\n  align-items: center;\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n\n  @media (max-width: 728px) {\n    display: none;\n  }\n`;\n\nexport const CommunityHeaderMeta = styled.div`\n  display: flex;\n  align-items: center;\n  max-width: 100%;\n`;\n\nexport const CommunityHeaderMetaCol = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex-wrap: nowrap;\n  align-items: flex-start;\n  align-self: flex-start;\n  margin-left: 12px;\n  max-width: 100%;\n  padding-right: 64px;\n`;\n\nexport const PillLink = styled(Link)`\n  font-size: 12px;\n  box-shadow: 0 0 0 1px ${theme.bg.border};\n  background: ${theme.bg.wash};\n  font-weight: 400;\n  color: ${theme.text.alt};\n  display: flex;\n  flex: none;\n  height: 20px;\n  border-radius: 4px;\n  overflow: hidden;\n  padding: 4px 8px;\n  margin-top: 4px;\n  max-height: 24px;\n  line-height: 1;\n  pointer-events: auto;\n\n  &:hover {\n    color: ${theme.text.default};\n  }\n`;\n\nexport const PillLinkPinned = styled.div`\n  background: ${theme.special.wash};\n  border: 1px solid ${theme.special.border};\n  color: ${theme.special.dark};\n  display: flex;\n  height: 20px;\n  border-radius: 4px;\n  overflow: hidden;\n  padding: 4px 8px;\n  margin-right: 8px;\n  font-size: 12px;\n  max-height: 24px;\n  line-height: 1;\n\n  .icon {\n    top: -1px;\n  }\n`;\n\nexport const PillLabel = styled.span`\n  ${props =>\n    props.isPrivate &&\n    css`\n      position: relative;\n    `};\n`;\n\nexport const SidebarChannelPill = styled.div`\n  display: flex;\n  justify-content: center;\n  margin: 8px 16px 16px;\n`;\n\nexport const Lock = styled.span`\n  margin-right: 4px;\n`;\nexport const PinIcon = styled.span`\n  margin-right: 4px;\n  margin-left: -2px;\n`;\n\nexport const ActionBarContainer = styled.div`\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  background: ${theme.bg.wash};\n  border: 1px solid ${theme.bg.border};\n  border-left: 0;\n  border-right: 0;\n  padding: 6px 16px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    margin: 0;\n    margin-top: 0;\n    border-radius: 0;\n    border-left: 0;\n    border-right: 0;\n    padding-left: 16px;\n    padding-right: 8px;\n  }\n`;\n\nexport const FixedBottomActionBarContainer = styled(ActionBarContainer)`\n  z-index: 1;\n  width: 100%;\n  position: sticky;\n`;\n\nexport const FollowButton = styled(OutlineButton)`\n  background: ${theme.bg.default};\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: ${props => (props.currentUser ? 'none' : 'flex')};\n  }\n`;\n\nexport const SidebarSection = styled.div`\n  margin: 8px 16px;\n  background: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  border-radius: 4px;\n  display: flex;\n  flex-direction: column;\n  flex: none;\n  align-self: stretch;\n  position: relative;\n\n  &:first-of-type {\n    margin-top: 16px;\n  }\n`;\n\nexport const SidebarSectionTitle = styled.h3`\n  margin: 16px 16px 8px;\n  font-size: 15px;\n  font-weight: 500;\n  color: ${theme.text.default};\n`;\n\nexport const SidebarSectionBody = styled.p`\n  margin: 0 16px 16px;\n  font-size: 14px;\n  font-weight: 400;\n  color: ${theme.text.alt};\n  white-space: pre-wrap;\n\n  a {\n    color: ${theme.text.default};\n\n    &:hover {\n      text-decoration: underline;\n    }\n  }\n`;\n\nexport const SidebarSectionActions = styled.div`\n  display: flex;\n  flex-direction: column;\n  margin: 0 16px 8px;\n\n  button {\n    width: 100%;\n    margin: 4px 0;\n  }\n`;\n\nexport const SidebarSectionAuth = styled.div`\n  display: flex;\n  flex-direction: column;\n  margin: 8px 16px 16px;\n  button {\n    width: 100%;\n  }\n  a {\n    flex: auto;\n  }\n  a:first-child {\n    margin-bottom: 8px;\n  }\n`;\nexport const SidebarCommunityCover = styled.div`\n  border-radius: 4px 4px 0 0;\n  height: 72px;\n  background: url(\"${props => props.src}\") no-repeat;\n  background-size: cover;\n  display: block;\n`;\nexport const SidebarCommunityProfile = styled.img`\n  border-radius: 8px;\n  width: 48px;\n  height: 48px;\n  position: absolute;\n  left: 50%;\n  transform: translateX(-50%);\n  top: 48px;\n  background: ${theme.bg.default};\n  border: 2px solid ${theme.bg.default};\n`;\nexport const SidebarCommunityName = styled(SidebarSectionTitle)`\n  text-align: center;\n  align-self: center;\n  margin-top: 32px;\n  text-align: center;\n`;\nexport const SidebarCommunityDescription = styled(SidebarSectionBody)`\n  text-align: center;\n  align-self: center;\n`;\nexport const SidebarRelatedThreadList = styled.ul`\n  list-style-type: none;\n  padding: 0;\n  margin: 0;\n`;\n\nexport const SidebarRelatedThread = styled.li`\n  font-size: 14px;\n  border-top: 1px solid ${theme.bg.wash};\n\n  &:hover {\n    a {\n      background-color: ${theme.bg.wash};\n    }\n  }\n\n  a {\n    padding: 8px 16px;\n    display: block;\n  }\n\n  &:first-of-type {\n    border-top: 0;\n  }\n\n  &:last-of-type {\n    a {\n      padding-bottom: 12px;\n      border-radius: 0 0 4px 4px;\n    }\n  }\n`;\nexport const RelatedTitle = styled.p``;\nexport const RelatedCount = styled.p`\n  font-size: 13px;\n  color: ${theme.text.alt};\n`;\n\nexport const Label = styled.p`\n  margin-left: 8px;\n`;\n\nexport const StickyHeaderContainer = styled.div`\n  position: sticky;\n  top: 0;\n  width: 100%;\n  z-index: ${zIndex.card};\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border-bottom: 1px solid ${theme.bg.border};\n  flex: 0 0 64px;\n  align-self: stretch;\n  background: ${theme.bg.wash};\n  padding-right: 16px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const Stretch = styled.div`\n  flex: 1;\n  display: flex;\n  align-items: center;\n  flex-direction: column;\n  width: 100%;\n  min-width: 1px;\n  max-width: inherit;\n  position: relative;\n  ${props =>\n    props.isModal &&\n    css`\n      border-left: 1px solid ${theme.bg.border};\n      border-right: 1px solid ${theme.bg.border};\n    `}\n`;\n\nexport const LockedWrapper = styled.div`\n  display: flex;\n  width: 100%;\n  justify-content: center;\n  align-items: center;\n  padding: 16px;\n  color: ${theme.text.secondary};\n  background: ${theme.bg.wash};\n  border-top: 1px solid ${theme.bg.border};\n\n  button {\n    flex: 1;\n  }\n`;\n\nexport const LockedText = styled.div`\n  font-size: 15px;\n  font-weight: 500;\n  margin-left: 16px;\n`;\n\nexport const TopBottomButtonContainer = styled.div`\n  position: fixed;\n  bottom: 24px;\n  right: 24px;\n  opacity: ${props => (props.isVisible ? '1' : '0')};\n  transform: translateY(${props => (props.isVisible ? '0' : '8px')});\n  transition: transform opacity 0.2s ease-in-out;\n  display: flex;\n  flex-direction: column;\n  justify-items: center;\n  background: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  color: ${theme.text.alt};\n  border-radius: 24px;\n  cursor: pointer;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n  z-index: 3000;\n\n  &:hover {\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);\n  }\n\n  @media (max-width: ${MEDIA_BREAK + 72}px) {\n    bottom: 84px;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\nexport const TopButton = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 8px;\n\n  &:hover {\n    color: ${theme.text.secondary};\n  }\n`;\nexport const BottomButton = styled(TopButton)`\n  border-top: 1px solid ${theme.bg.border};\n`;\n\nexport const BylineContainer = styled.div`\n  width: calc(100% + 32px);\n  margin-left: -16px;\n  margin-right: -16px;\n  margin-top: -16px;\n  position: relative;\n  z-index: 1000;\n`;\n"
  },
  {
    "path": "src/views/threadSlider/index.js",
    "content": "// @flow\nimport React, { useEffect, useRef } from 'react';\nimport { connect } from 'react-redux';\nimport type { Location, History, Match } from 'react-router';\nimport Icon from 'src/components/icon';\nimport { ThreadView } from 'src/views/thread';\nimport { ErrorBoundary } from 'src/components/error';\nimport { ESC } from 'src/helpers/keycodes';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport type { TitlebarPayloadProps } from 'src/views/globalTitlebar';\nimport { Container, Overlay, ThreadContainer, CloseButton } from './style';\n\ntype Props = {\n  previousLocation: Location,\n  history: History,\n  match: Match,\n  titlebar: TitlebarPayloadProps,\n  dispatch: Dispatch<Object>,\n};\n\nconst ThreadSlider = (props: Props) => {\n  const { previousLocation, history, match, titlebar, dispatch } = props;\n  const prevTitlebarProps = useRef(titlebar);\n  const { params } = match;\n  const { threadId } = params;\n\n  const closeSlider = (e: any) => {\n    e && e.stopPropagation();\n    history.push({ ...previousLocation, state: { modal: false } });\n  };\n\n  useEffect(() => {\n    const handleKeyPress = (e: any) => {\n      if (e.keyCode === ESC) {\n        e.stopPropagation();\n        closeSlider();\n      }\n    };\n\n    document.addEventListener('keydown', handleKeyPress, false);\n    return () => {\n      const prev = prevTitlebarProps.current;\n      dispatch(setTitlebarProps({ ...prev }));\n      document.removeEventListener('keydown', handleKeyPress, false);\n    };\n  }, []);\n\n  return (\n    <ErrorBoundary>\n      <Container data-cy=\"modal-container\">\n        <ThreadContainer>\n          <ThreadView\n            isModal\n            css={{\n              width: '100%',\n              position: 'relative',\n              zIndex: '1',\n            }}\n            threadId={threadId}\n          >\n            <Overlay onClick={closeSlider} data-cy=\"overlay\" />\n          </ThreadView>\n        </ThreadContainer>\n\n        <CloseButton data-cy=\"thread-slider-close\" onClick={closeSlider}>\n          <Icon glyph=\"view-close\" size={32} />\n        </CloseButton>\n      </Container>\n    </ErrorBoundary>\n  );\n};\n\nconst map = state => ({ titlebar: state.titlebar });\n\n// $FlowIssue\nexport default connect(map)(ThreadSlider);\n"
  },
  {
    "path": "src/views/threadSlider/style.js",
    "content": "// @flow\nimport styled from 'styled-components';\nimport theme from 'shared/theme';\nimport { zIndex } from 'src/components/globals';\nimport {\n  MEDIA_BREAK,\n  TITLEBAR_HEIGHT,\n  NAVBAR_WIDTH,\n} from 'src/components/layout';\n\nexport const Container = styled.div`\n  display: flex;\n  justify-content: center;\n  z-index: ${zIndex.slider + 1};\n  position: absolute;\n  left: ${NAVBAR_WIDTH}px;\n  right: 0;\n  top: 0;\n  bottom: 0;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    top: ${TITLEBAR_HEIGHT}px;\n    left: 0;\n  }\n`;\n\nexport const Overlay = styled.div`\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  background: rgba(0, 0, 0, 0.24);\n  z-index: -1;\n`;\n\nexport const ThreadContainer = styled.div`\n  display: flex;\n  justify-content: center;\n  width: 100%;\n  z-index: ${zIndex.slider + 4};\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    max-width: 100%;\n    box-shadow: 0;\n  }\n`;\n\nexport const CloseButton = styled.span`\n  position: fixed;\n  top: 24px;\n  right: 24px;\n  width: 60px;\n  height: 60px;\n  border-radius: 30px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: ${theme.bg.reverse};\n  color: ${theme.text.reverse};\n  z-index: ${zIndex.slider + 4};\n  cursor: pointer;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n"
  },
  {
    "path": "src/views/user/components/communityList.js",
    "content": "//@flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport compose from 'recompose/compose';\nimport { CommunityListItem } from 'src/components/entities';\nimport { ErrorBoundary } from 'src/components/error';\nimport { Loading } from 'src/components/loading';\nimport { PrimaryOutlineButton } from 'src/components/button';\nimport { getUserCommunityConnection } from 'shared/graphql/queries/user/getUserCommunityConnection';\nimport type { GetUserCommunityConnectionType } from 'shared/graphql/queries/user/getUserCommunityConnection';\n\ntype Props = {\n  data: {\n    user: GetUserCommunityConnectionType,\n  },\n  currentUser: Object,\n  user: Object,\n};\n\nclass CommunityList extends React.Component<Props> {\n  render() {\n    const { data } = this.props;\n\n    if (data.loading) {\n      return <Loading style={{ padding: '32px' }} />;\n    }\n\n    if (\n      !data.user ||\n      !data.user.communityConnection ||\n      !data.user.communityConnection.edges ||\n      data.user.communityConnection.edges.length === 0\n    ) {\n      return (\n        <div style={{ padding: '16px' }}>\n          <PrimaryOutlineButton style={{ flex: '1' }} to={'/explore'}>\n            Explore communities\n          </PrimaryOutlineButton>\n        </div>\n      );\n    }\n\n    const communities = data.user.communityConnection.edges.map(\n      c => c && c.node\n    );\n\n    let sortedCommunities = communities;\n\n    if (sortedCommunities[0] && sortedCommunities[0].contextPermissions) {\n      sortedCommunities = communities.slice();\n    }\n\n    return (\n      <div>\n        {sortedCommunities.map(community => {\n          if (!community) return null;\n          return (\n            <ErrorBoundary key={community.id}>\n              <CommunityListItem\n                communityObject={community}\n                profilePhoto={community.profilePhoto}\n                name={community.name}\n              />\n            </ErrorBoundary>\n          );\n        })}\n      </div>\n    );\n  }\n}\n\nexport default compose(\n  withRouter,\n  getUserCommunityConnection,\n  connect()\n)(CommunityList);\n"
  },
  {
    "path": "src/views/user/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport querystring from 'query-string';\nimport {\n  withRouter,\n  type History,\n  type Location,\n  type Match,\n} from 'react-router';\nimport { connect } from 'react-redux';\nimport generateMetaInfo from 'shared/generate-meta-info';\nimport Head from 'src/components/head';\nimport ThreadFeed from 'src/components/threadFeed';\nimport { UserProfileCard } from 'src/components/entities';\nimport { setTitlebarProps } from 'src/actions/titlebar';\nimport CommunityList from './components/communityList';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport { UserAvatar } from 'src/components/avatar';\nimport {\n  getUserByMatch,\n  type GetUserType,\n} from 'shared/graphql/queries/user/getUser';\nimport getUserThreads from 'shared/graphql/queries/user/getUserThreadConnection';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport type { Dispatch } from 'redux';\nimport { SegmentedControl, Segment } from 'src/components/segmentedControl';\nimport {\n  ViewGrid,\n  SecondaryPrimaryColumnGrid,\n  PrimaryColumn,\n  SecondaryColumn,\n} from 'src/components/layout';\nimport {\n  SidebarSection,\n  SidebarSectionHeader,\n  SidebarSectionHeading,\n} from 'src/views/community/style';\nimport {\n  NullColumn,\n  NullColumnHeading,\n  NullColumnSubheading,\n} from 'src/components/threadFeed/style';\nimport { MobileUserAction } from 'src/components/titlebar/actions';\nimport { FeedsContainer } from './style';\nimport { InfoContainer } from 'src/views/community/style';\n\nconst ThreadFeedWithData = compose(\n  connect(),\n  getUserThreads\n)(ThreadFeed);\nconst ThreadParticipantFeedWithData = compose(\n  connect(),\n  getUserThreads\n)(ThreadFeed);\n\ntype Props = {\n  match: Match,\n  currentUser: Object,\n  data: {\n    user: GetUserType,\n  },\n  isLoading: boolean,\n  queryVarIsChanging: boolean,\n  dispatch: Dispatch<Object>,\n  history: History,\n  location: Location,\n};\n\ntype State = {\n  hasNoThreads: boolean,\n  hasThreads: boolean,\n};\n\nclass UserView extends React.Component<Props, State> {\n  state = {\n    hasNoThreads: false,\n    hasThreads: true,\n  };\n\n  componentDidMount() {\n    const { dispatch } = this.props;\n\n    if (this.props.data && this.props.data.user) {\n      this.setDefaultTab();\n\n      return dispatch(\n        setTitlebarProps({\n          title: this.props.data.user.name,\n          titleIcon: (\n            <UserAvatar\n              isClickable={false}\n              user={this.props.data.user}\n              size={24}\n            />\n          ),\n          rightAction: <MobileUserAction user={this.props.data.user} />,\n        })\n      );\n    }\n  }\n\n  setDefaultTab = () => {\n    const { location, history } = this.props;\n    const { search } = location;\n    const { tab } = querystring.parse(search);\n    if (!tab)\n      history.replace({\n        ...location,\n        search: querystring.stringify({ tab: 'posts' }),\n      });\n  };\n\n  componentDidUpdate(prevProps: Props) {\n    const { dispatch } = this.props;\n\n    if (!prevProps.data || !this.props.data) return;\n\n    if (!prevProps.data.user && this.props.data.user) {\n      this.setDefaultTab();\n\n      return dispatch(\n        setTitlebarProps({\n          title: this.props.data.user.name,\n          titleIcon: (\n            <UserAvatar\n              isClickable={false}\n              user={this.props.data.user}\n              size={24}\n            />\n          ),\n          rightAction: <MobileUserAction user={this.props.data.user} />,\n        })\n      );\n    }\n    // track when a new profile is viewed without the component having been remounted\n    if (\n      prevProps.data.user &&\n      this.props.data.user &&\n      prevProps.data.user.id !== this.props.data.user.id\n    ) {\n      this.setDefaultTab();\n      return dispatch(\n        setTitlebarProps({\n          title: this.props.data.user.name,\n          titleIcon: (\n            <UserAvatar\n              isClickable={false}\n              user={this.props.data.user}\n              size={24}\n            />\n          ),\n          rightAction: <MobileUserAction user={this.props.data.user} />,\n        })\n      );\n    }\n  }\n\n  hasNoThreads = () => this.setState({ hasThreads: false });\n  hasThreads = () => this.setState({ hasThreads: true });\n\n  handleSegmentClick = (tab: string) => {\n    const { history, location } = this.props;\n    return history.replace({\n      ...location,\n      search: querystring.stringify({ tab }),\n    });\n  };\n\n  render() {\n    const {\n      data: { user },\n      isLoading,\n      queryVarIsChanging,\n      match: {\n        params: { username },\n      },\n      location,\n      currentUser,\n    } = this.props;\n    const { hasThreads } = this.state;\n\n    const { search } = location;\n    const { tab } = querystring.parse(search);\n    const selectedView = tab;\n\n    if (queryVarIsChanging) {\n      return <LoadingView />;\n    }\n\n    if (user && user.id) {\n      const { title, description } = generateMetaInfo({\n        type: 'user',\n        data: {\n          name: user.name,\n          username: user.username,\n          description: user.description,\n        },\n      });\n\n      const Feed =\n        selectedView === 'posts'\n          ? ThreadFeedWithData\n          : ThreadParticipantFeedWithData;\n\n      return (\n        <React.Fragment>\n          <Head\n            title={title}\n            description={description}\n            image={user.profilePhoto}\n            type=\"profile\"\n          >\n            <meta property=\"profile:last_name\" content={user.name} />\n            <meta property=\"profile:username\" content={user.username} />\n          </Head>\n\n          <ViewGrid data-cy=\"user-view\">\n            <SecondaryPrimaryColumnGrid>\n              <SecondaryColumn>\n                <SidebarSection>\n                  <UserProfileCard user={user} />\n                </SidebarSection>\n\n                <SidebarSection>\n                  <SidebarSectionHeader>\n                    <SidebarSectionHeading>Communities</SidebarSectionHeading>\n                  </SidebarSectionHeader>\n\n                  <CommunityList\n                    currentUser={currentUser}\n                    user={user}\n                    id={user.id}\n                  />\n                </SidebarSection>\n              </SecondaryColumn>\n              <PrimaryColumn>\n                <FeedsContainer>\n                  <SegmentedControl>\n                    <Segment\n                      onClick={() => this.handleSegmentClick('posts')}\n                      isActive={selectedView === 'posts'}\n                      data-cy=\"user-posts-tab\"\n                    >\n                      Posts\n                    </Segment>\n\n                    <Segment\n                      onClick={() => this.handleSegmentClick('activity')}\n                      isActive={selectedView === 'activity'}\n                      data-cy=\"user-activity-tab\"\n                    >\n                      Activity\n                    </Segment>\n\n                    <Segment\n                      onClick={() => this.handleSegmentClick('info')}\n                      hideOnDesktop\n                      isActive={selectedView === 'info'}\n                      data-cy=\"user-info-tab\"\n                    >\n                      Info\n                    </Segment>\n                  </SegmentedControl>\n\n                  {hasThreads &&\n                    (selectedView === 'posts' ||\n                      selectedView === 'activity') && (\n                      <Feed\n                        userId={user.id}\n                        username={username}\n                        viewContext={\n                          selectedView === 'activity'\n                            ? 'userProfileReplies'\n                            : 'userProfile'\n                        }\n                        hasNoThreads={this.hasNoThreads}\n                        hasThreads={this.hasThreads}\n                        kind={\n                          selectedView === 'posts' ? 'creator' : 'participant'\n                        }\n                        id={user.id}\n                      />\n                    )}\n\n                  {selectedView === 'info' && (\n                    <InfoContainer>\n                      <SidebarSection>\n                        <UserProfileCard user={user} />\n                      </SidebarSection>\n\n                      <SidebarSection>\n                        <SidebarSectionHeader>\n                          <SidebarSectionHeading>\n                            Communities\n                          </SidebarSectionHeading>\n                        </SidebarSectionHeader>\n\n                        <CommunityList\n                          currentUser={currentUser}\n                          user={user}\n                          id={user.id}\n                        />\n                      </SidebarSection>\n                    </InfoContainer>\n                  )}\n\n                  {!hasThreads &&\n                    (selectedView === 'posts' ||\n                      selectedView === 'activity') && (\n                      <NullColumn>\n                        <span>\n                          <NullColumnHeading>No posts yet</NullColumnHeading>\n                          <NullColumnSubheading>\n                            Posts will show up here as they are published and\n                            when conversations are joined.\n                          </NullColumnSubheading>\n                        </span>\n                      </NullColumn>\n                    )}\n                </FeedsContainer>\n              </PrimaryColumn>\n            </SecondaryPrimaryColumnGrid>\n          </ViewGrid>\n        </React.Fragment>\n      );\n    }\n\n    if (isLoading) {\n      return <LoadingView />;\n    }\n\n    if (!user) {\n      return (\n        <ErrorView\n          heading={'We couldn’t find a user with this username'}\n          subheading={\n            'You may be trying to view a profile that is deleted, or Spectrum is just having a hiccup. If you think something has gone wrong, please contact us.'\n          }\n        />\n      );\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  getUserByMatch,\n  withCurrentUser,\n  viewNetworkHandler,\n  withRouter,\n  connect()\n)(UserView);\n"
  },
  {
    "path": "src/views/user/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { FlexRow, FlexCol } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Row = styled(FlexRow)`\n  padding: 8px 16px;\n  align-items: center;\n  width: 100%;\n  color: ${theme.text.alt};\n\n  div {\n    margin-top: 2px;\n    margin-right: 8px;\n    color: inherit;\n  }\n\n  span {\n    line-height: 1;\n    color: inherit;\n  }\n\n  &:hover {\n    background-color: ${theme.brand.alt};\n    color: ${theme.text.reverse};\n  }\n`;\n\nexport const Col = styled(FlexCol)`\n  width: 100%;\n\n  a + a > div {\n    border-top: 2px solid ${theme.bg.wash};\n  }\n`;\n\nexport const RowLabel = styled.span`\n  font-weight: 600;\n`;\n\nconst Column = styled.div`\n  display: flex;\n  flex-direction: column;\n`;\n\nexport const Meta = styled(Column)`\n  grid-area: meta;\n\n  > button,\n  > a > button {\n    margin-top: 16px;\n    margin-left: 32px;\n    width: calc(100% - 32px);\n\n    @media (max-width: ${MEDIA_BREAK}px) {\n      margin-left: 0;\n      width: 100%;\n    }\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    padding: 0 16px;\n\n    > div {\n      margin-left: 0;\n    }\n  }\n`;\n\nexport const MetaMemberships = styled.div`\n  margin-left: 32px;\n\n  @media (min-width: 1279px) {\n    display: none;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const ColumnHeading = styled.div`\n  display: flex;\n  align-items: center;\n  font-size: 18px;\n  line-height: 1;\n  font-weight: 500;\n  padding: 8px 16px 12px;\n  margin-top: 24px;\n  border-bottom: 2px solid ${theme.bg.border};\n`;\n\nexport const FeedsContainer = styled.section`\n  display: flex;\n  flex-direction: column;\n  background: ${theme.bg.default};\n`;\n"
  },
  {
    "path": "src/views/userSettings/components/deleteAccountForm.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { connect } from 'react-redux';\nimport compose from 'recompose/compose';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport {\n  SectionCard,\n  SectionTitle,\n  SectionSubtitle,\n  SectionCardFooter,\n} from 'src/components/settingsViews/style';\nimport { Notice } from 'src/components/listItems/style';\nimport {\n  getCurrentUserCommunityConnection,\n  type GetUserCommunityConnectionType,\n} from 'shared/graphql/queries/user/getUserCommunityConnection';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport {\n  HoverWarnOutlineButton,\n  WarnButton,\n  OutlineButton,\n} from 'src/components/button';\nimport deleteCurrentUserMutation from 'shared/graphql/mutations/user/deleteCurrentUser';\nimport { SERVER_URL } from 'src/api/constants';\nimport { Loading } from 'src/components/loading';\nimport type { Dispatch } from 'redux';\n\ntype State = {\n  isLoading: boolean,\n  deleteInited: boolean,\n  ownsCommunities: boolean,\n};\n\ntype Props = {\n  isLoading: boolean,\n  deleteCurrentUser: Function,\n  dispatch: Dispatch<Object>,\n  data: {\n    user: GetUserCommunityConnectionType,\n  },\n};\n\nclass DeleteAccountForm extends React.Component<Props, State> {\n  state = {\n    isLoading: false,\n    deleteInited: false,\n    ownsCommunities: false,\n  };\n\n  componentDidUpdate(prevProps) {\n    const curr = this.props;\n    if (!prevProps.data.user && curr.data.user && curr.data.user.id) {\n      if (curr.data.user && curr.data.user.communityConnection) {\n        return this.setState({\n          ownsCommunities: curr.data.user.communityConnection.edges.some(\n            c => c && c.node.communityPermissions.isOwner\n          ),\n        });\n      }\n    }\n  }\n\n  initDelete = () => {\n    this.setState({ deleteInited: true });\n  };\n\n  cancelDelete = () => this.setState({ deleteInited: false });\n\n  confirmDelete = () => {\n    this.setState({\n      isLoading: true,\n    });\n\n    this.props\n      .deleteCurrentUser()\n      .then(() =>\n        this.props.dispatch(addToastWithTimeout('success', 'Account deleted'))\n      )\n      .then(() => (window.location.href = `${SERVER_URL}/auth/logout`))\n      .catch(err =>\n        this.props.dispatch(addToastWithTimeout('error', err.message))\n      );\n  };\n\n  render() {\n    const { isLoading, ownsCommunities, deleteInited } = this.state;\n    const {\n      data: { user },\n    } = this.props;\n\n    if (user) {\n      return (\n        <SectionCard data-cy=\"delete-account-container\">\n          <SectionTitle>Delete my account</SectionTitle>\n          <SectionSubtitle>\n            You can delete your account at any time.{' '}\n          </SectionSubtitle>\n\n          {ownsCommunities && (\n            <Notice data-cy=\"owns-communities-notice\">\n              You currently own communities on Spectrum. When your account is\n              deleted these communities will not be deleted. Spectrum reserves\n              the right to manage your communities after your account is\n              deleted.\n            </Notice>\n          )}\n\n          <SectionCardFooter>\n            {deleteInited ? (\n              <div\n                style={{\n                  display: 'flex',\n                  flexDirection: 'column',\n                  alignItems: 'flex-end',\n                }}\n              >\n                {!isLoading && (\n                  <OutlineButton\n                    data-cy=\"delete-account-cancel-button\"\n                    onClick={this.cancelDelete}\n                    style={{ marginBottom: '16px', alignSelf: 'stretch' }}\n                  >\n                    Cancel\n                  </OutlineButton>\n                )}\n                <WarnButton\n                  data-cy=\"delete-account-confirm-button\"\n                  loading={isLoading}\n                  onClick={this.confirmDelete}\n                >\n                  {isLoading ? 'Deleting...' : 'Confirm and delete my account'}\n                </WarnButton>\n              </div>\n            ) : (\n              <HoverWarnOutlineButton\n                data-cy=\"delete-account-init-button\"\n                color={'warn.default'}\n                onClick={this.initDelete}\n              >\n                Delete my account\n              </HoverWarnOutlineButton>\n            )}\n          </SectionCardFooter>\n        </SectionCard>\n      );\n    }\n\n    if (this.props.isLoading) {\n      return (\n        <SectionCard>\n          <Loading />\n        </SectionCard>\n      );\n    }\n\n    return null;\n  }\n}\n\nexport default compose(\n  connect(),\n  deleteCurrentUserMutation,\n  getCurrentUserCommunityConnection,\n  viewNetworkHandler\n)(DeleteAccountForm);\n"
  },
  {
    "path": "src/views/userSettings/components/downloadDataForm.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport * as React from 'react';\nimport styled from 'styled-components';\nimport {\n  SectionCard,\n  SectionTitle,\n  SectionSubtitle,\n  SectionCardFooter,\n} from 'src/components/settingsViews/style';\n\nconst Link = styled.a`\n  font-size: 14px;\n  font-weight: 600;\n  cursor: pointer;\n  color: ${theme.brand.default};\n  padding: 12px 16px;\n\n  &:hover {\n    color: ${theme.brand.alt};\n  }\n`;\n\ntype Props = {\n  user: Object,\n};\n\nclass DownloadDataForm extends React.Component<Props> {\n  render() {\n    const { user } = this.props;\n\n    if (!user) return null;\n\n    return (\n      <SectionCard data-cy=\"download-data-container\">\n        <SectionTitle>Download my data</SectionTitle>\n        <SectionSubtitle>\n          You can download your personal data at any time.\n        </SectionSubtitle>\n\n        <SectionCardFooter>\n          <Link\n            href={\n              process.env.NODE_ENV === 'production'\n                ? '/api/user.json'\n                : 'http://localhost:3001/api/user.json'\n            }\n            download\n          >\n            Download my data\n          </Link>\n        </SectionCardFooter>\n      </SectionCard>\n    );\n  }\n}\n\nexport default DownloadDataForm;\n"
  },
  {
    "path": "src/views/userSettings/components/editForm.js",
    "content": "// @flow\nimport * as React from 'react';\nimport { withRouter } from 'react-router';\nimport { withApollo } from 'react-apollo';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { PrimaryOutlineButton } from 'src/components/button';\nimport Icon from 'src/components/icon';\nimport { SERVER_URL, CLIENT_URL } from 'src/api/constants';\nimport GithubProfile from 'src/components/githubProfile';\nimport { GithubSigninButton } from 'src/components/loginButtonSet/github';\nimport {\n  Input,\n  TextArea,\n  Error,\n  Success,\n  PhotoInput,\n  CoverInput,\n} from 'src/components/formElements';\nimport { StyledLabel } from 'src/components/formElements/style';\nimport {\n  Form,\n  Actions,\n  ImageInputWrapper,\n  Location,\n  GithubSignin,\n} from '../style';\nimport editUserMutation from 'shared/graphql/mutations/user/editUser';\nimport type { EditUserType } from 'shared/graphql/mutations/user/editUser';\nimport { addToastWithTimeout } from 'src/actions/toasts';\nimport {\n  PRO_USER_MAX_IMAGE_SIZE_STRING,\n  PRO_USER_MAX_IMAGE_SIZE_BYTES,\n} from 'src/helpers/images';\nimport { Notice } from 'src/components/listItems/style';\nimport { SectionCard, SectionTitle } from 'src/components/settingsViews/style';\nimport type { Dispatch } from 'redux';\nimport type { GetCurrentUserSettingsType } from 'shared/graphql/queries/user/getCurrentUserSettings';\nimport isEmail from 'validator/lib/isEmail';\n\ntype State = {\n  website: ?string,\n  name: string,\n  username: string,\n  description: ?string,\n  image: string,\n  coverPhoto: string,\n  file: ?Object,\n  coverFile: ?Object,\n  descriptionError: boolean,\n  nameError: boolean,\n  createError: boolean,\n  isLoading: boolean,\n  photoSizeError: string,\n  usernameError: string,\n  email: string,\n  emailError: string,\n  didChangeEmail: boolean,\n};\n\ntype Props = {\n  dispatch: Dispatch<Object>,\n  client: Object,\n  editUser: Function,\n  user: GetCurrentUserSettingsType,\n};\n\nclass UserWithData extends React.Component<Props, State> {\n  constructor(props) {\n    super(props);\n\n    const user = this.props.user;\n\n    this.state = {\n      website: user.website ? user.website : '',\n      name: user.name ? user.name : '',\n      username: user.username ? user.username : '',\n      description: user.description ? user.description : '',\n      image: user.profilePhoto,\n      coverPhoto: user.coverPhoto,\n      file: null,\n      coverFile: null,\n      descriptionError: false,\n      nameError: false,\n      createError: false,\n      isLoading: false,\n      photoSizeError: '',\n      usernameError: '',\n      email: user.email ? user.email : '',\n      emailError: '',\n      didChangeEmail: false,\n    };\n  }\n\n  changeName = e => {\n    const name = e.target.value;\n    if (name.length > 50) {\n      this.setState({\n        name,\n        nameError: true,\n      });\n\n      return;\n    }\n    this.setState({\n      name,\n      nameError: false,\n    });\n  };\n\n  changeEmail = e => {\n    const email = e.target.value;\n\n    if (!email || email.length === 0) {\n      return this.setState({\n        email,\n        emailError: 'Your email can’t be blank',\n        didChangeEmail: false,\n      });\n    }\n\n    this.setState({\n      email,\n      emailError: '',\n      didChangeEmail: false,\n    });\n  };\n\n  changeDescription = e => {\n    const description = e.target.value;\n    if (description.length >= 140) {\n      this.setState({\n        descriptionError: true,\n      });\n      return;\n    }\n\n    this.setState({\n      description,\n      descriptionError: false,\n    });\n  };\n\n  changeWebsite = e => {\n    const website = e.target.value;\n    this.setState({\n      website,\n    });\n  };\n\n  setProfilePhoto = e => {\n    let reader = new FileReader();\n    let file = e.target.files[0];\n\n    if (!file) return;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    if (file && file.size > PRO_USER_MAX_IMAGE_SIZE_BYTES) {\n      return this.setState({\n        photoSizeError: `Try uploading a file less than ${PRO_USER_MAX_IMAGE_SIZE_STRING}.`,\n        isLoading: false,\n      });\n    }\n\n    reader.onloadend = () => {\n      this.setState({\n        file: file,\n        // $FlowFixMe\n        image: reader.result,\n        photoSizeError: '',\n        isLoading: false,\n      });\n    };\n\n    if (file) {\n      reader.readAsDataURL(file);\n    }\n  };\n\n  setCoverPhoto = e => {\n    let reader = new FileReader();\n    let file = e.target.files[0];\n\n    if (!file) return;\n\n    this.setState({\n      isLoading: true,\n    });\n\n    if (file && file.size > PRO_USER_MAX_IMAGE_SIZE_BYTES) {\n      return this.setState({\n        photoSizeError: `Try uploading a file less than ${PRO_USER_MAX_IMAGE_SIZE_STRING}.`,\n        isLoading: false,\n      });\n    }\n\n    reader.onloadend = () => {\n      this.setState({\n        coverFile: file,\n        // $FlowFixMe\n        coverPhoto: reader.result,\n        photoSizeError: '',\n        isLoading: false,\n      });\n    };\n\n    if (file) {\n      reader.readAsDataURL(file);\n    }\n  };\n\n  save = e => {\n    e.preventDefault();\n\n    const {\n      name,\n      description,\n      website,\n      file,\n      coverFile,\n      photoSizeError,\n      username,\n      usernameError,\n      email,\n      emailError,\n    } = this.state;\n\n    const { user } = this.props;\n\n    const input = {\n      name,\n      description,\n      website,\n      file,\n      coverFile,\n      username,\n      email,\n    };\n\n    if (!isEmail(email)) {\n      return this.setState({\n        emailError: 'Please add a valid email address.',\n      });\n    }\n\n    if (email !== user.email) {\n      this.setState({\n        didChangeEmail: true,\n      });\n    }\n\n    if (photoSizeError || usernameError || emailError) {\n      return;\n    }\n\n    this.setState({\n      isLoading: true,\n    });\n\n    this.props\n      .editUser(input)\n      .then(({ data: { editUser } }: { data: { editUser: EditUserType } }) => {\n        const user = editUser;\n\n        this.setState({\n          isLoading: false,\n        });\n\n        // the mutation returns a user object. if it exists,\n        if (user !== undefined) {\n          this.props.dispatch(addToastWithTimeout('success', 'Changes saved!'));\n          this.setState({\n            file: null,\n          });\n        }\n\n        return;\n      })\n      .catch(err => {\n        this.setState({\n          isLoading: false,\n        });\n\n        this.props.dispatch(addToastWithTimeout('error', err.message));\n      });\n  };\n\n  handleUsernameValidation = ({ error, username }) => {\n    const { user } = this.props;\n    // we want to reset error if was typed same username which was set before\n    const usernameError = user.username === username ? '' : error;\n    this.setState({\n      usernameError,\n      username,\n    });\n  };\n\n  handleOnError = err => {\n    this.props.dispatch(addToastWithTimeout('error', err.message));\n  };\n\n  render() {\n    const { user } = this.props;\n    const {\n      name,\n      username,\n      description,\n      website,\n      image,\n      coverPhoto,\n      descriptionError,\n      createError,\n      nameError,\n      isLoading,\n      photoSizeError,\n      usernameError,\n      email,\n      emailError,\n      didChangeEmail,\n    } = this.state;\n\n    const postAuthRedirectPath = `${CLIENT_URL}/users/${username}/settings`;\n\n    return (\n      <SectionCard data-cy=\"user-edit-form\">\n        <Location>\n          <Icon glyph=\"view-back\" size={16} />\n          <Link to={`/users/${username}`}>Return to Profile</Link>\n        </Location>\n        <SectionTitle>Profile Settings</SectionTitle>\n        <Form onSubmit={this.save}>\n          <ImageInputWrapper>\n            <CoverInput\n              onChange={this.setCoverPhoto}\n              defaultValue={coverPhoto}\n              preview={true}\n            />\n            <PhotoInput\n              type={'user'}\n              onChange={this.setProfilePhoto}\n              defaultValue={image}\n            />\n          </ImageInputWrapper>\n\n          {photoSizeError && (\n            <Notice style={{ marginTop: '32px' }}>{photoSizeError}</Notice>\n          )}\n\n          <div style={{ height: '8px' }} />\n\n          <Input\n            type=\"text\"\n            defaultValue={name}\n            onChange={this.changeName}\n            placeholder={\"What's your name?\"}\n            dataCy=\"user-name-input\"\n          >\n            Name\n          </Input>\n\n          {nameError && <Error>Names can be up to 50 characters.</Error>}\n\n          {usernameError && (\n            <Notice style={{ marginTop: '16px' }}>{usernameError}</Notice>\n          )}\n\n          <TextArea\n            defaultValue={description}\n            onChange={this.changeDescription}\n            placeholder={'Introduce yourself to the class...'}\n            dataCy=\"user-description-input\"\n          >\n            Bio\n          </TextArea>\n\n          {descriptionError && <Error>Bios can be up to 140 characters.</Error>}\n\n          <Input\n            defaultValue={website}\n            onChange={this.changeWebsite}\n            dataCy=\"user-website-input\"\n          >\n            Optional: Add your website\n          </Input>\n\n          <Input\n            type=\"text\"\n            defaultValue={email}\n            onChange={this.changeEmail}\n            placeholder={'Email address'}\n            dataCy=\"user-email-input\"\n          >\n            Email\n          </Input>\n\n          {didChangeEmail && (\n            <Success>A confirmation email has been sent to {email}.</Success>\n          )}\n          {emailError && <Error>{emailError}</Error>}\n\n          <GithubProfile\n            id={user.id}\n            render={profile => {\n              if (!profile) {\n                return (\n                  <GithubSignin>\n                    <StyledLabel>Connect your GitHub Profile</StyledLabel>\n                    <GithubSigninButton\n                      href={`${SERVER_URL}/auth/github?r=${postAuthRedirectPath}`}\n                      preferred={true}\n                      showAfter={false}\n                      onClickHandler={null}\n                      verb={'Connect'}\n                    />\n                  </GithubSignin>\n                );\n              } else {\n                return (\n                  <Input\n                    disabled\n                    defaultValue={`github.com/${profile.username}`}\n                  >\n                    <div>\n                      Your GitHub Profile ·{' '}\n                      <span>\n                        <a\n                          href={`${SERVER_URL}/auth/github?r=${postAuthRedirectPath}`}\n                        >\n                          Refresh username\n                        </a>\n                      </span>\n                    </div>\n                  </Input>\n                );\n              }\n            }}\n          />\n\n          <Actions>\n            <PrimaryOutlineButton\n              disabled={\n                !name ||\n                nameError ||\n                !username ||\n                !!usernameError ||\n                isLoading ||\n                !!emailError\n              }\n              loading={isLoading}\n              onClick={this.save}\n              data-cy=\"save-button\"\n            >\n              {isLoading ? 'Saving...' : 'Save'}\n            </PrimaryOutlineButton>\n          </Actions>\n\n          {createError && (\n            <Error>Please fix any errors above to save your profile.</Error>\n          )}\n        </Form>\n      </SectionCard>\n    );\n  }\n}\n\nconst UserSettings = compose(\n  editUserMutation,\n  withRouter,\n  withApollo,\n  connect()\n)(UserWithData);\nexport default UserSettings;\n"
  },
  {
    "path": "src/views/userSettings/components/logout.js",
    "content": "// @flow\nimport React from 'react';\nimport { SERVER_URL } from 'src/api/constants';\nimport { OutlineButton } from 'src/components/button';\nimport { LogoutWrapper } from '../style';\nimport { SectionCard } from 'src/components/settingsViews/style';\n\nexport default () => (\n  <LogoutWrapper>\n    <SectionCard>\n      <OutlineButton href={`${SERVER_URL}/auth/logout`} target=\"_self\">\n        Log out\n      </OutlineButton>\n    </SectionCard>\n  </LogoutWrapper>\n);\n"
  },
  {
    "path": "src/views/userSettings/components/overview.js",
    "content": "// @flow\nimport * as React from 'react';\nimport type { GetCurrentUserSettingsType } from 'shared/graphql/queries/user/getCurrentUserSettings';\nimport UserEditForm from './editForm';\nimport DeleteAccountForm from './deleteAccountForm';\nimport DownloadDataForm from './downloadDataForm';\nimport Logout from './logout';\nimport { SectionsContainer, Column } from 'src/components/settingsViews/style';\nimport { ErrorBoundary, SettingsFallback } from 'src/components/error';\n\ntype Props = {\n  user: GetCurrentUserSettingsType,\n};\n\nclass Overview extends React.Component<Props> {\n  render() {\n    const { user } = this.props;\n\n    return (\n      <SectionsContainer>\n        <Column>\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <UserEditForm user={user} />\n          </ErrorBoundary>\n\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <DeleteAccountForm id={user.id} />\n          </ErrorBoundary>\n\n          <ErrorBoundary fallbackComponent={SettingsFallback}>\n            <DownloadDataForm user={user} />\n          </ErrorBoundary>\n\n          <Logout />\n        </Column>\n      </SectionsContainer>\n    );\n  }\n}\n\nexport default Overview;\n"
  },
  {
    "path": "src/views/userSettings/index.js",
    "content": "// @flow\nimport * as React from 'react';\nimport compose from 'recompose/compose';\nimport { connect } from 'react-redux';\nimport { Route } from 'react-router-dom';\nimport getCurrentUserSettings, {\n  type GetCurrentUserSettingsType,\n} from 'shared/graphql/queries/user/getCurrentUserSettings';\nimport viewNetworkHandler from 'src/components/viewNetworkHandler';\nimport { withCurrentUser } from 'src/components/withCurrentUser';\nimport Head from 'src/components/head';\nimport { View } from './style';\nimport Overview from './components/overview';\nimport Header from 'src/components/settingsViews/header';\nimport type { ContextRouter } from 'react-router';\nimport { ErrorView, LoadingView } from 'src/views/viewHelpers';\nimport { ViewGrid } from 'src/components/layout';\nimport { setTitlebarProps } from 'src/actions/titlebar';\n\ntype Props = {\n  data: {\n    user: GetCurrentUserSettingsType,\n  },\n  isLoading: boolean,\n  hasError: boolean,\n  ...$Exact<ContextRouter>,\n};\n\nclass UserSettings extends React.Component<Props> {\n  componentDidMount() {\n    const { dispatch } = this.props;\n    return dispatch(\n      setTitlebarProps({\n        title: 'Settings',\n      })\n    );\n  }\n\n  render() {\n    const {\n      data: { user },\n      match,\n      isLoading,\n      currentUser,\n    } = this.props;\n\n    if (isLoading) {\n      return <LoadingView />;\n    }\n\n    // the user is logged in but somehow a user wasnt fetched from the server prompt a refresh to reauth the user\n    if ((currentUser && !user) || (currentUser && user && !user.id)) {\n      return <ErrorView />;\n    }\n\n    // user is viewing their own settings, validated on the server\n    if (user && user.id && currentUser.id === user.id) {\n      const subheading = {\n        to: `/users/${user.username}`,\n        label: `Return to profile`,\n      };\n\n      const avatar = {\n        profilePhoto: user.profilePhoto,\n        user,\n      };\n\n      return (\n        <React.Fragment>\n          <Head title={'My settings'} />\n          <ViewGrid>\n            <View data-cy=\"user-settings\">\n              <Header\n                avatar={avatar}\n                subheading={subheading}\n                heading={'My Settings'}\n              />\n\n              <Route path={`${match.url}`}>\n                {() => <Overview user={user} />}\n              </Route>\n            </View>\n          </ViewGrid>\n        </React.Fragment>\n      );\n    }\n\n    return <ErrorView />;\n  }\n}\n\nexport default compose(\n  getCurrentUserSettings,\n  viewNetworkHandler,\n  withCurrentUser,\n  connect()\n)(UserSettings);\n"
  },
  {
    "path": "src/views/userSettings/style.js",
    "content": "// @flow\nimport theme from 'shared/theme';\nimport styled from 'styled-components';\nimport { FlexRow, FlexCol } from 'src/components/globals';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const EmailListItem = styled.div`\n  padding: 8px 0 16px;\n  border-bottom: 2px solid ${theme.bg.wash};\n\n  &:last-of-type {\n    border-bottom: none;\n  }\n\n  input {\n    margin-right: 8px;\n  }\n`;\n\nexport const CheckboxContent = styled.div`\n  display: flex;\n  flex-direction: column;\n`;\n\nexport const View = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  align-self: stretch;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    width: 100%;\n  }\n`;\n\nexport const Form = styled.form`\n  display: inline-block;\n  flex-direction: column;\n  align-self: stretch;\n  flex: none;\n  max-width: 100%;\n`;\n\nexport const Description = styled.p`\n  font-size: 14px;\n  color: ${theme.text.default};\n  padding: 8px 0 16px;\n  line-height: 1.4;\n\n  a {\n    color: ${theme.brand.default};\n  }\n`;\n\nexport const TertiaryActionContainer = styled(FlexRow)`\n  justify-content: flex-start;\n  flex-grow: 1;\n`;\n\nexport const Actions = styled(FlexRow)`\n  margin-top: 24px;\n  justify-content: flex-start;\n  flex-direction: row-reverse;\n  border-top: 1px solid ${theme.bg.border};\n  padding-top: 16px;\n\n  button + button {\n    margin-left: 8px;\n  }\n`;\n\nexport const PhotoPreview = styled.div`\n  position: relative;\n  width: 48px;\n  height: 48px;\n  object-fit: cover;\n  border-radius: 4px;\n  background-image: url('${props => props.src}')\n`;\n\nexport const GeneralNotice = styled.span`\n  padding: 8px 12px;\n  font-size: 12px;\n  font-weight: 500;\n  color: ${theme.text.alt};\n  background: ${theme.bg.wash};\n  border-radius: 4px;\n  margin-top: 24px;\n  line-height: 1.4;\n  display: inline-block;\n`;\n\nexport const ImageInputWrapper = styled(FlexCol)`\n  position: relative;\n  flex: 0 0 auto;\n  margin-top: 8px;\n  margin-bottom: 24px;\n\n  > label:nth-of-type(2) {\n    position: absolute;\n    bottom: -24px;\n    left: 16px;\n  }\n`;\n\nexport const Location = styled(FlexRow)`\n  font-weight: 500;\n  color: ${theme.text.alt};\n  font-size: 14px;\n  margin-bottom: 8px;\n\n  > div {\n    color: ${theme.text.placeholder};\n  }\n\n  > span {\n    padding: 0 4px;\n    color: ${theme.text.placeholder};\n  }\n\n  > a:hover {\n    color: ${theme.brand.alt};\n    text-decoration: underline;\n  }\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    display: none;\n  }\n`;\n\nexport const GithubSignin = styled.div`\n  display: flex;\n  flex-direction: column;\n  justify-content: flex-start;\n  align-items: flex-start;\n\n  a {\n    margin-top: 8px;\n  }\n`;\n\nexport const LogoutWrapper = styled.div`\n  display: block;\n\n  button {\n    width: 100%;\n  }\n`;\n"
  },
  {
    "path": "src/views/viewHelpers/errorView.js",
    "content": "// @flow\nimport React from 'react';\nimport { Emoji, Heading, Description, Card } from './style';\nimport { ViewGrid, CenteredGrid } from 'src/components/layout';\n\ntype Props = {\n  emoji?: string,\n  heading?: string,\n  subheading?: string,\n};\n\nexport const ErrorView = (props: Props) => {\n  const {\n    emoji = '😣',\n    heading = 'We ran into trouble loading this page',\n    subheading = 'You may be trying to view something that is deleted, or Spectrum is just having a hiccup. If you think something has gone wrong, please contact us.',\n    ...rest\n  } = props;\n\n  return (\n    <ViewGrid {...rest}>\n      <CenteredGrid>\n        <Card>\n          <Emoji role=\"img\" aria-label=\"Oops\">\n            {emoji}\n          </Emoji>\n          <Heading>{heading}</Heading>\n          <Description>{subheading}</Description>\n        </Card>\n      </CenteredGrid>\n    </ViewGrid>\n  );\n};\n"
  },
  {
    "path": "src/views/viewHelpers/fullScreenRedirect.js",
    "content": "// @flow\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport { PrimaryButton, OutlineButton } from 'src/components/button';\nimport { Heading, Description, Card } from './style';\nimport { CommunityAvatar } from 'src/components/avatar';\nimport { openModal } from 'src/actions/modals';\nimport { ViewGrid, CenteredGrid } from 'src/components/layout';\nimport type { CommunityInfoType } from 'shared/graphql/fragments/community/communityInfo';\nimport type { Dispatch } from 'redux';\n\ntype Props = {\n  community: CommunityInfoType,\n  dispatch: Dispatch<Object>,\n};\n\nconst RedirectView = (props: Props) => {\n  const { community, dispatch } = props;\n\n  const leaveCommunity = () =>\n    dispatch(\n      openModal('DELETE_DOUBLE_CHECK_MODAL', {\n        id: community.id,\n        entity: 'team-member-leaving-community',\n        message: 'Are you sure you want to leave this community?',\n        buttonLabel: 'Leave Community',\n      })\n    );\n\n  return (\n    <ViewGrid>\n      <CenteredGrid>\n        <Card\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            flexDirection: 'column',\n            textAlign: 'center',\n            padding: '48px 24px',\n          }}\n        >\n          <CommunityAvatar\n            community={community}\n            size={64}\n            showHoverProfile={false}\n            isClickable={false}\n            style={{ marginBottom: '32px' }}\n          />\n          <Heading>{community.name} has a new home</Heading>\n          <Description style={{ padding: 0, marginTop: 0 }}>\n            This community is no longer on Spectrum.\n          </Description>\n          <div style={{ padding: '16px' }} />\n          {community.website && (\n            <PrimaryButton href={community.website}>\n              Visit new community\n            </PrimaryButton>\n          )}\n          {community.communityPermissions &&\n            community.communityPermissions.isMember &&\n            !community.communityPermissions.isOwner && (\n              <React.Fragment>\n                <div style={{ padding: '8px' }} />\n                <OutlineButton onClick={leaveCommunity}>\n                  Leave community on Spectrum\n                </OutlineButton>\n              </React.Fragment>\n            )}\n        </Card>\n      </CenteredGrid>\n    </ViewGrid>\n  );\n};\n\nexport const FullScreenRedirectView = connect()(RedirectView);\n"
  },
  {
    "path": "src/views/viewHelpers/index.js",
    "content": "// @flow\nimport { ErrorView } from './errorView';\nimport { LoadingView } from './loadingView';\nimport { CardStyles } from './style';\n\nexport { ErrorView, LoadingView, CardStyles };\n"
  },
  {
    "path": "src/views/viewHelpers/loadingView.js",
    "content": "// @flow\nimport React from 'react';\nimport { Loading } from 'src/components/loading';\nimport { ViewGrid, CenteredGrid } from 'src/components/layout';\nimport { Stretch } from './style';\n\nexport const LoadingView = () => {\n  return (\n    <React.Fragment>\n      <ViewGrid>\n        <CenteredGrid>\n          <Stretch>\n            <Loading />\n          </Stretch>\n        </CenteredGrid>\n      </ViewGrid>\n    </React.Fragment>\n  );\n};\n"
  },
  {
    "path": "src/views/viewHelpers/style.js",
    "content": "// @flow\nimport styled, { css } from 'styled-components';\nimport theme from 'shared/theme';\nimport { MEDIA_BREAK } from 'src/components/layout';\n\nexport const Emoji = styled.span`\n  font-size: 40px;\n  margin-bottom: 16px;\n`;\n\nexport const Heading = styled.h3`\n  font-size: 24px;\n  font-weight: 700;\n  line-height: 1.3;\n  margin-bottom: 8px;\n  color: ${theme.text.default};\n`;\nexport const Description = styled.p`\n  margin-top: 8px;\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.4;\n  color: ${theme.text.secondary};\n  padding-right: 24px;\n`;\n\nexport const ActionsRow = styled.div`\n  display: grid;\n  grid-gap: 16px;\n  grid-template-columns: repeat(2, 1fr);\n  margin-top: 32px;\n\n  button {\n    display: flex;\n    flex: 1 0 auto;\n    width: 100%;\n  }\n`;\n\nexport const CardStyles = css`\n  background: ${theme.bg.default};\n  border: 1px solid ${theme.bg.border};\n  border-radius: 4px;\n`;\n\nexport const Card = styled.div`\n  ${CardStyles};\n  padding: 16px;\n\n  @media (max-width: ${MEDIA_BREAK}px) {\n    border-radius: 0;\n    border: none;\n    border-bottom: 1px solid ${theme.bg.border};\n  }\n`;\n\nexport const Stretch = styled.div`\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  justify-content: center;\n  align-items: center;\n`;\n"
  },
  {
    "path": "src/views/viewHelpers/textValidationHelper.js",
    "content": "// @flow\n/**\n * Collection of unicode code points that represent whitespaces and some other non visual characters.\n */\nexport const whiteSpaceRegex = /[\\u007F\\u0080-\\u00A0\\u0378\\u0379\\u0380-\\u0383\\u038B\\u038D\\u03A2\\u0557\\u0558\\u1680\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\\u180E\\u200B-\\u200D\\u2060\\uFEFF]/g;\n\n/**\n * Collection of unicode code points that represent hyphens, different from the traditional ocidental hyphen (\\u002D).\n */\nexport const oddHyphenRegex = /[\\u00AD\\u058A\\u1806\\u2010-\\u2015\\u2E3A\\u2E3B\\uFE58\\uFE63\\uFF0D]/g;\n"
  }
]