[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[{*.js, *.json, *.yml}]\nindent_size = 2\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[Makefile]\nindent_style = tab\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"parser\":  \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ecmaVersion\": 2018,\n    \"sourceType\":  \"module\"\n  },\n  \"rules\": {\n    \"indent\": [\"error\", 2],\n    \"typescript/no-explicit-any\": \"off\",\n    \"typescript/explicit-function-return-type\": \"off\"\n  }\n}"
  },
  {
    "path": ".gitignore",
    "content": "*~\n.directory\n.Trash-*\nlogs\n*.log\npids\n*.pid\n*.seed\nlib-cov\n.lock-wscript\nbuild/Release\nnode_modules\ndist/\nnpm-debug.log\nnpm-debug.log*\n.DS_Store\n.AppleDouble\n.LSOverride\nIcon\n._*\n.Spotlight-V100\n.Trashes\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n*.tmlanguage.cache\n*.tmPreferences.cache\n*.stTheme.cache\n*.sublime-workspace\nsftp-config.json\nlib\npackage-lock.json\ncoverage\n.vscode\n/.idea\n/examples/**/*.js\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - '8'\ncache: yarn\nscript:\n  - yarn\n  - yarn test:ci\nnotifications:\n  email: false"
  },
  {
    "path": "CHANGELOG.md",
    "content": "\nn.n.n / 2016-06-16\n==================\n\n  * Merge pull request #121 from devlucky/feature/disconnect\n  * v0.2.0\n\nv0.2.0 / 2016-06-13\n===================\n\n  * v0.2.0\n  * Implement disconnect feature\n  * Merge pull request #120 from devlucky/chore/record_factory_side_effects\n  * Ensure Interceptors response doesn't contain record-factory methods\n  * Merge pull request #118 from devlucky/bugfix/update_demo\n  * Adapt kakapo changes in demos\n  * Merge pull request #117 from devlucky/bugfix/not_require_index_module\n  * v0.1.4\n\nv0.1.4 / 2016-06-12\n===================\n\n  * v0.1.4\n  * Dont require index option\n  * Merge pull request #115 from devlucky/docs_update\n\ndocs_update / 2016-06-12\n========================\n\n  * Update docs\n  * Merge pull request #109 from devlucky/chore/integration_tests\n  * Adapt specs to new response type\n  * Remove shared state between tests\n  * Improve jQuery coverage\n  * Handling body for xhr request\n  * Merge remote-tracking branch 'origin/master' into chore/integration_tests\n  * Merge pull request #113 from devlucky/relase-0.1.3\n  * basic jquery and superagent support\n  * Integration specs structure\n\nrelase-0.1.3 / 2016-06-08\n=========================\n\n  * v0.1.3\n\nv0.1.3 / 2016-06-08\n===================\n\n  * v0.1.3\n  * Update Readme\n  * Merge pull request #112 from devlucky/chore/keywords\n  * Add keywords and fix table of contents\n  * Merge pull request #110 from devlucky/example/dummy\n  * Merge remote-tracking branch 'origin/master' into example/dummy\n  * Update dummy readme\n  * Ignore dist\n  * Update Readme\n  * Fix entry point for npm package\n  * Bower dummy integration\n  * Merge pull request #111 from devlucky/chore/bower\n  * Add bower support\n  * Dummy example draft\n  * Merge pull request #106 from devlucky/add_demo_links_to_readmes\n\nadd_demo_links_to_readmes / 2016-06-04\n======================================\n\n  * Update README\n  * Add Demos links to Readme\n\nadd / 2016-06-02\n================\n\n  * Merge pull request #105 from devlucky/chore/deploy_demo_apps\n  * Deploy demo apps to Firebase\n  * Merge pull request #91 from devlucky/feature/scenarios\n  * fix tests\n  * Check that scenarios works with xhr\n  * Use helpers instead of 'this'\n  * Introduce KakapoRequest\n  * Merge remote-tracking branch 'origin/master' into feature/scenarios\n  * Adapt specs to the new scenario api\n  * Intercept requests in the right moment\n  * Merge pull request #95 from devlucky/chore/readme-generation\n  * Readme autogeneration\n  * Merge pull request #94 from devlucky/baseInterceptor/separate-from-strategies\n  * Refactor interceptors, so they are not THAT tighly coupled with helpers\n  * Make xhrInterceptor a little cleaner, move utils to helpers\n  * Remove not needed functions and move from other files\n  * Add xhrInterceptor.spec to specs exports\n  * Create spec for xhrInterceptor\n  * Pass db to request handler\n  * Merge pull request #90 from devlucky/chore/add_npm_version_badge\n  * Remove disclaimer\n  * Relaser setup\n  * Merge pull request #88 from devlucky/chore/relaser_integration\n  * 0.1.2\n\nv0.1.2 / 2016-05-20\n===================\n\n  * 0.1.2\n  * Fix current version\n  * Merge remote-tracking branch 'origin/master' into chore/relaser_integration\n  * Fix build_command\n  * [Example] GitHub explorer (#83)\n  * Merge pull request #89 from devlucky/oskarcieslik-patch-1\n  * Update README.md\n  * Merge branch 'master' into chore/relaser_integration\n  * Merge pull request #87 from devlucky/patch-1\n  * Relaser setup\n  * Change entry point in package.json to lib/\n  * Merge pull request #84 from devlucky/bugfix/apply_xhr_instance_attributes\n  * Merge branch 'master' into bugfix/apply_xhr_instance_attributes\n  * Merge pull request #86 from devlucky/oskarcieslik-patch-1-1\n  * Update README.md\n  * Merge pull request #79 from devlucky/example/todo-app\n  * docs(Example/Todo-app): Example app\n  * chore(package.json): new build script\n  * chore(makefile): New build script\n  * chore(project): no dist/ in project\n  * feat(todo-app/kakapo-config): Add more generated data\n  * feat(todo-app/kakapo-config): Add some faker generated data :zap:\n  * Apply all xhr instance properties and methods\n  * Merge remote-tracking branch 'origin/master' into example/todo-app\n  * Render after destroy todos\n  * Merge pull request #82 from devlucky/feature/delete_record\n  * Implement record.delete()\n  * Delete todo\n  * Implement record.delete()\n  * Toggle all\n  * Update TODO's\n  * Merge pull request #80 from devlucky/bugfix/fetch_interceptor_request_url\n  * Handle record creation\n  * Decorate record on push\n  * Support Request url in fetch interceptor\n  * Todo app first draft\n  * Support Request url in fetch interceptor\n  * Merge pull request #76 from devlucky/documentation/util\n  * docs(helpers/util): Add documentation for helpers/util\n  * Merge pull request #75 from devlucky/documentation/recordFactory\n  * docs(database/recordFactory): Add documentation for recordFactory\n  * Merge pull request #74 from devlucky/documentation/database\n  * Merge branch 'master' into documentation/database\n  * docs(database): Fix documentation a bit in style\n  * Merge pull request #73 from devlucky/documentation/database\n  * docs(database): Create documentation for Database\n  * Merge pull request #72 from devlucky/database/refactor-stores\n  * test(database): remove unused tests\n  * refactor(database/uuidStore): create registration for uuidStore\n  * fix(database/find): Fix serialize function call to have collectionName on it\n  * style(styling):\n  * style(database + recordFactory): styling]\n  * test(database): Remove test for factoryFor\n  * fix(database/hasMany): hasMany should be in range [1, len(all)]\n  * refactor(database/factoryFor|serializerFor): Rename methods to better tell purpose\n  * style(database/order): Order methods alphabetically\n  * refactor(database/serializers): Separate concerns of serialize & other methods\n  * refactor(database/serializers): Separate concerns of serialize & other methods\n  * refactor(database/whole): More code removal, better practices implementation\n  * refactor(database/uuidStore + database/whole): Move uuid to it's own store. Remove unnecessary metho\n  * refactor(database/factoryStore|serializerStore): Move factories and serializers outside of Database\n  * refactor(database/store): Move records' store outside of database, replace with weakmaps + maps\n  * Merge pull request #71 from devlucky/test/runners--all-specs\n  * chore(test/runners): By default let's have runners call ALL specs\n\nv0.0.1 / 2016-05-10\n===================\n\n  * Merge pull request #70 from devlucky/project/style-fixes\n  * style(serializers/json-api): fixes according to airbnb-javascript guide\n  * style(serializers/index): fixes according to airbnb-javascript guide\n  * style(router): fixes according to airbnb-javascript guide\n  * style(interceptors/xhrInterceptor): fixes according to airbnb-javascript guide\n  * style(interceptors/index): fixes according to airbnb-javascript guide\n  * style(interceptors/fetchInterceptor): fixes according to airbnb-javascript guide\n  * style(interceptors/baseInterceptor): fixes according to airbnb-javascript guide\n  * style(helpers/util): fixes according to airbnb-javascript guide\n  * style(database/recordFactory): fixes according to airbnb-javascript guide\n  * fix(database): Fix missing return statement\n  * fix(test/database): fix name change from previous style changes\n  * style(database): fixes according to airbnb-javascript guide\n  * style(database): fixes according to airbnb-javascript guide\n  * Update README.md\n\nv0.0.0 / 2016-05-08\n===================\n\n  * Merge pull request #67 from devlucky/database/first-last\n  * test(Database/first+last): Add tests for Database.first and Database.last\n  * refactor(database/first+last): Add check for presence of factory\n  * fix(version): Update npm + github version of package\n  * fix(semantic-release): Fix semrel\n  * 0.0.0\n  * feat(Makefile & semantic-release): Move semantic-release to Makefile & remove npm publish for now\n  * feat(Database): Database now have (find + findOne) instead of (find + filter)\n  * chore(commitizen): Add run-config for commitizen\n  * fix(package.json): Add missing coma\n  * chore(semantic-release): Replaced relaser with semantic-release\n  * chore(codecov.io): Add codecov again, somehow disappeared?!\n  * Merge pull request #65 from devlucky/database/find\n  * fix(Fix tests typos):\n  * fix(specs/serializers): Fix new database methods\n  * refactor(database/find): Change filter method to find\n  * refactor(database/findOne): Change find method to findOne\n  * chore(package.json): Add script for karma-watch\n  * style(specs): Improve specs according to Airbnb's styleguide\n  * style(runners/travis): Stop using lodash just for iterating specs\n  * style(runners/karma): Improve karma runner\n  * style(test/index.html):\n  * style(runners/browser): Improve browser runner\n  * chore(Makefile): Extract some parts of commands to VARIABLEs\n  * chore(Makefile): Replace scripts with Makefile\n  * chore(scripts): Remove scripts dir\n  * chore(gitignore): Fix coverage dir again\n  * chore(test_bundle): Remove test_bundle.js from git\n  * chore(gitignore): Fix path to test dir\n  * chore(test-coverage): Update reports dir\n  * chore(eslint): Update deprecated config. Install config modules\n  * chore(editorconfig): Add editor config to project\n  * docs(LICENSE): Nicer LICENSE file\n  * chore(project): Remove playground\n  * chore(project/dist): Remove dist directory\n  * chore(webpack): Add loaders to webpack & actually install their npm packages\n  * fix(package.json): move some dependencies to dev deps\n  * refactor(test): mv tests => test\n  * fix(.gitignore): Fix path to test_bundle\n  * chore(Add test_bundle to .gitignore):\n  * chore(Add npm logs to .gitignore):\n  * Merge branch 'master' of github.com:devlucky/Kakapo.js\n  * chore(.gitignore): Extend gitignore\n  * Merge pull request #60 from devlucky/interceptor/nativeServices\n  * refactor(interceptors): Take use of those nativeServices helper.\n  * Merge branch 'master' of github.com:devlucky/Kakapo.js\n  * Project/refactor structure (#59)\n  * refactor(project): Improve project's structure to follow modern node apps\n  * refactor(project): Improve project's structure to follow modern node apps\n  * Merge branch 'master' of github.com:devlucky/Kakapo.js\n  * refactor(interceptors): Improve interceptors structure (#58)\n  * refactor(interceptors): Improve interceptors structure\n  * Merge pull request #57 from devlucky/database/refactor\n  * refactor(specs): Change request delay to 1s for quicker tests\n  * fix(package.json): Fix packages versions causing errors in travis-ci\n  * fix(database/hasMany): Quick fix for limit of hasMany, this was making our tests fail at random\n  * refactor(database/hasMany):\n  * style(database/all):\n  * refactor(database/hasMany):\n  * refactor(database/belongsTo):\n  * test(database/nested-find database/nested-filter): Test find / filter with nested conditions.\n  * Merge pull request #48 from devlucky/feature/db_relationships\n  * Merge remote-tracking branch 'origin/master' into feature/db_relationships\n  * Rename last by lastItem\n  * Merge pull request #55 from devlucky/database/nested-factories\n  * Add tests for nested properties\n  * ...\n  * Add recursive factory mapping\n  * Merge pull request #46 from devlucky/router/requestDelay\n  * Merge branch 'master' into router/requestDelay\n  * Fix mutability bug\n  * Implement Database relationships\n  * Merge pull request #41 from devlucky/feature/serializers\n  * Serializer improvements\n  * Separate router configs, add requestDelay option\n  * Return undefined in factoryFor\n  * Merge remote-tracking branch 'origin/master' into feature/serializers\n  * Fix serializer\n  * Update router.js\n  * Merge pull request #45 from devlucky/router/additional-options\n  * Change undefined to null. Tests using some valid url\n  * Add functionality to specify host\n  * Add functionality to specify host\n  * Don't mutate default config\n  * Update README.md\n  * New slack team\n  * Change ES6 Object's static methods to lodash alternatives\n  * Merge pull request #38 from devlucky/database/pass-records-as-copy\n  * Serializers draft\n  * Better order of parameters\n  * Records are now passed as copies\n  * Merge pull request #36 from devlucky/database/safer-tests\n  * Merge pull request #37 from devlucky/scripts/refactor\n  * Fix package.json\n  * Move scripts into separate files\n  * Run code coverage only on travis\n  * Add checks for factory presence to more functions, also tests\n  * Make database tests safer\n  * Implement record factory for database (#33)\n  * Add slack notifications\n  * Add codecov coverage\n  * Merge pull request #32 from devlucky/response/fix-coverage\n  * Tests for response.error and response.ok\n  * Refactor error()\n  * Merge pull request #31 from devlucky/tests/code-coverage\n  * Add code-coverage with automatic codecove.io report\n  * Separate tests into modules, also provide workflow just for travis\n  * Abstract fakeXMLHttpRequest & fakeFetch functionality (#28)\n  * Merge pull request #29 from devlucky/router/refactor-router\n  * Remove request, change with register\n  * Refactor router just a little\n  * Implement database's record population (#21)\n  * :tada:\n  * Align code with new structure\n  * Merge remote-tracking branch 'origin/master' into feature/rich_response_support\n  * Add slack to travis\n  * typo in scripts\n  * Change script names a little, add support for multiple runs karma\n  * Change package.json due to new structure\n  * Separate tape-dom with karma, remove index.js\n  * move index.html & fixtures to browser folder, better structure\n  * move index.html & fixtures to browser folder, better structure\n  * Make specs more modular, better structure\n  * this is my last typo in .travis.yml\n  * another typo in .travis.yml\n  * typo in .travis.yml\n  * Merge branch 'master' of github.com:devlucky/Kakapo.js\n  * EHH... Updating firefox on travis...\n  * Update README.md\n  * Change karma launcher to firefox, since travis doesnt have chrome\n  * Fix travis' yaml file\n  * Support for Travis-CI with karma test-runner\n  * Merge branch 'master' of github.com:devlucky/Kakapo.js\n  * Change tests for travis\n  * Add comments for tape-dom\n  * Add some docs...\n  * Add some docs...\n  * Clean up tests for further travis-ci integration\n  * Run npm scripts with npm-run-all to kill all scripts on ctrl-c\n  * Support Request headers\n  * Implement response headers support\n  * Merge remote-tracking branch 'origin/master' into feature/rich_response_support\n  * Merge pull request #17 from devlucky/feature/return_response_instances_in_fakeFetch\n  * Use const for fakeResponse function\n  * Response headers wip\n  * Introduce Response concept\n  * Make tests support Fetch Api\n  * Return Response instances for fakeFetch\n  * Clean fetch.js, Parse query\n  * Some more ES6 goodness, Support for query\n  * Support request query handling\n  * Return request params in request handler\n  * Return request body in handler\n  * Intercept XHMLHttpRequest\n  * Implement Interceptors concept\n  * Improving Router coverage\n  * Working on interceptor...\n  * Remove wip\n  * Change scripts to run concurrently since serve is watching\n  * Change python server to npm serve\n  * Script to run tests in one tab\n  * Add missing dev-dependency\n  * Update README.md\n  * Improve coverage for DB\n  * DB first draft\n  * remove ghooks\n  * Fix environment\n  * 0.1.1\n\nv0.1.1 / 2016-04-06\n===================\n\n  * 0.1.1\n  * Initial commit"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 @oskarcieslik - @zzarcon (https://github.com/devlucky)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "README.md",
    "content": "# Kakapo.js <img src=\"https://sdl-stickershop.line.naver.jp/products/0/0/1/1087538/LINEStorePC/main.png?__=20150924\" width=\"40\" height=\"40\" >\n[![Build Status](https://travis-ci.org/devlucky/Kakapo.js.svg?branch=master)](https://travis-ci.org/devlucky/Kakapo.js)\n[![codecov.io](https://codecov.io/github/devlucky/Kakapo.js/coverage.svg?branch=master)](https://codecov.io/github/devlucky/Kakapo.js?branch=master)\n[![npm version](https://badge.fury.io/js/kakapo.svg)](https://npmjs.com/package/kakapo)\n[![dependencies](https://david-dm.org/devlucky/Kakapo.js.svg)](https://david-dm.org/devlucky/Kakapo.js)\n[![npm license](https://img.shields.io/npm/l/awesome-badges.svg)](https://tldrlegal.com/license/mit-license)\n<img src=\"http://benschwarz.github.io/bower-badges/badge@2x.png\" width=\"130\" height=\"25\">\n\n> Next generation mocking framework in Javascript - [docs](http://devlucky.github.io/kakapo-js) \n\n## Contents\n- [Getting started](#getting-started)\n  - [Installation](#installation)\n- [Examples](#examples)\n  - [Basic](#basic)\n  - [Using the DB](#using-the-db)\n  - [Unchaining the Router](#unchaining-the-router)\n  - [Fetch & XMLHttpRequest support](#fetch--xmlhttprequest-support)\n  - [Database candyness](#database-candyness)\n  - [Passthrough](#passthrough)\n- [Demo Apps](#demo-apps)\n  - [TODO App](#todo-app)\n  - [Github explorer](#github-explorer)\n- [Components](#components)\n  - [Server](#server)\n  - [Router](#router)\n  - [Database](#database)\n  - [Response](#response)\n  - [Serializers](#serializers)\n  - [Interceptors](#interceptors)\n  - [Scenarios](#scenarios)\n  - [Fake data](#fake-data)\n- [Browser support](#browser-support)\n- [Roadmap](#roadmap)\n\nKakapo its a full featured http mocking library, he allows you to entirely replicate your backend logic in simple and declaritive way directly in the browser. This way you can easily prototype and develop the whole Application without backend and just deactivate Kakapo when you go production. In order to achieve that Kakapo gives you a set of utilities like Routing, Database, Response, Request and so on...\n\n## Installation\n\n`$ npm i kakapo -D`\n\n`$ bower i kakapo -D`\n\n\n# Examples\n\nBefore going deep into the Kakapo docs, we want to show you some examples of how to use Kakapo in your apps, in order to demonstrate how easy to integrate it is\n\n## Basic\n\nUse the kakapo router to declare two custom routes and returning custom data.\n\n```javascript\nimport {Router, Server} from 'Kakapo';\n  \nconst router = new Router();\n\nrouter.get('/users', _ => {\n  return [{\n    id: 1,\n    name: 'Hector'\n  }, {\n    id: 2,\n    name: 'Zarco'\n  }]\n});\n\nrouter.get('/users/:user_id', request => {\n  const userId = request.params.user_id;\n  return [{\n    id: userId,\n    name: 'Hector'\n  }];\n});\n\nconst server = new Server();\n\nserver.use(router);\n\nfetch('/users', users => {\n  console.log(users[0].id === 1);\n  console.log(users[1].id === 2);\n});\n\nfetch('/users/3', user => {\n  console.log(user.id === 3);\n  console.log(user.name === 'Hector');\n});\n```  \n\n### Using the DB\n  \nCombine the usage of the Router and the Database to have a more consistent way of managing the mock data. In the following example we are defining the user factory and later using some access methods provided by the db.\n\n```javascript\nimport {Database, Router, Server} from 'Kakapo';\n\nconst db = new Database();\n\ndb.register('user', () => ({\n  firstName: 'Hector',\n  lastName: 'Zarco'\n}));\ndb.create('user', 10);\n\nconst router = new Router();\n\nrouter.get('/users', (request, db) => {\n  return db.all('user');\n});\n\nrouter.get('/users/:user_id', (request, db) => {\n  const userId = request.params.user_id;\n  return db.findOne('user', userId);\n});\n\nconst server = new Server();\n\nserver.use(db);\nserver.use(router);\n\nfetch('/users', users => {\n  console.log(users[0].id === 1);\n  console.log(users[1].id === 2);\n  console.log(users[2].id === 3);\n});\n\nfetch('/users/7', user => {\n  console.log(user.id === 7);\n  console.log(user.name === 'Hector');\n});\n```  \n\nAs you can see, the database automatically handles the **id** generation, so you don't have to worry about assigning incremental id's of any kind.\n\n### Unchaining the Router\n\nNext you will see how to use other features of the router and figure out the things you can build with it. In this example we show you how easy is to create a fake pagination handling, which is based in the actual requested page. \n\n```javascript\nimport {Router, Server} from 'Kakapo';\n  \nconst router = new Router();\n\nrouter.get('/users', (request) => {\n  const currentPage = request.query.page;\n  let count = request.query.count;\n  let users = []\n\n  while (--count) {\n    users.push({name: 'hector', age: 24});\n  }\n\n  return {\n    data: users,\n    metadata: {\n      previous_page: currentPage - 1,\n      current_page: currentPage,\n      next_page: currentPage + 1\n    }\n  }\n});\n\nrouter.post('/users/:user_id/friends/:friend_id', (request) => {\n  const token = request.headers.get('X-auth-token');\n  const userId = request.params.friend_id;\n  const friendId = request.params.friend_id;\n  let message;\n\n  if (token === 'foo-bar') {\n    message = `successs friend: ${friendId} created for userId: ${userId}`;\n  } else {\n    message = 'Unauthorized';\n  }\n\n  return {\n    message\n  }\n});\nconst server = new Server();\n\nserver.use(router);\n\nfetch('/users?page=1&count=3', response => {\n  console.log(response.data.length === 3);\n  console.log(response.metadata.previous_page === 1);\n  console.log(response.metadata.next_page === 2);\n});\n\nconst headers = new Headers();\nheaders.append('X-auth-token', 'foo-bar');\nconst request = new Request('/users/10/friends/55');\n\nfetch(request, {method: 'POST', headers}).then(response => {\n  console.log(response.message);\n});\n```\n\n### Fetch & XMLHttpRequest support\n\nKakapo have Fetch and XMLHttpRequest support by default, but you can always change that if you want, see the [interceptors docs](#interceptors).\n\n```javascript\nimport {Router, Server} from 'Kakapo';\n  \nconst router = new Router();\n\nrouter.get('/users/', () => {\n  return 'meh';\n});\n\nconst server = new Server();\n\nserver.use(router);\n\nfetch('/users', users => {\n  console.log(users[0].id === 1);\n  console.log(users[1].id === 2);\n});\n\nconst xhr = new XMLHttpRequest();\n\nxhr.onreadystatechange = () => {\n  if (xhr.readyState !== 4) return;\n\n  const response = JSON.parse(xhr.responseText);\n  console.log(response[0].id === 1);\n  console.log(response[1].id === 2);\n};\nxhr.open('GET', '/users', true);\nxhr.send();\n\n```\n\n### Database candyness\n\nCheck how easy to build a consistent CRUD Api with the kakapo db.\n\n```javascript\nimport {Database, Router, Server, Response as KakapoResponse} from 'Kakapo';\n  \nconst sever = new Server();\nconst router = new Router();\nconst databse = new Database();\n\ndatabase.register('user', faker => {\n  return {\n    firstName: faker.name.firstName,\n    lastName: faker.name.lastName,\n    age: 24\n  };\n});\n\ndatabase.create('user', 5);\n\nrouter.get('/users', (request, db) => {\n  return db.all('user');\n});\nrouter.post('/users', (request, db) => {\n  const user = JSON.parse(request.body);\n\n  db.push('user', user);\n\n  return user;\n});\nrouter.put('/users/:user_id', (request, db) => {\n  const newLastName = JSON.parse(request.body).lastName;\n  const user = db.findOne('user', request.params.user_id);\n\n  user.lastName = newLastName;\n  user.save();\n\n  return user;\n});\nrouter.delete('/users/:user_id', (request, db) => {\n  const user = db.findOne('user', request.params.user_id);\n  const code = user ? 200 : 400;\n  const body = {code};\n  \n  user && user.delete();\n\n  return new KakapoResponse(code, body);\n});\n\nconst server = new Server();\n\nserver.use(database);\nserver.use(router);\n\nconst getUsers = () => {\n  return fetch('/users').then(r => r.json());\n}\n\nconst createUser = (user) => {\n  return $.post('/users', user);\n};\n\nconst updateLast = () => {\n  return $.ajax({\n    url: '/users/6',\n    method: 'PUT',\n    data: {lastName: 'Zarco'}\n  });\n};\n\nconst deleteFirst = () => {\n  return $.ajax({\n    url: '/users/1',\n    method: 'DELETE'\n  });\n};\n\ngetUsers() // users[0].id === 1, users.length === 5\n  .then(createUser.bind(null, {firstName: 'Hector'})) // response.id === 6, response.firstName === 'Hector'\n  .then(deleteFirst) // response.code === 200\n  .then(getUsers) // users[0].id == 2, users[4].id == 6, users.length == 5\n  .then(updateLast) // user.id == 6, user.lastName == 'Zarco'\n  .then(getUsers) // users.length == 5\n\n```\n\n### Passthrough\n\nYou don't need to do anything in order to keep your existing request working as they were before. Kakapo will just passthrough all the request that doesn't match any of the defined routes and fire the associated callback.\n\n```javascript\nimport {Router, Server} from 'Kakapo';\n  \nconst server = new Server();\nconst router = new Router();\n\nrouter.get('/users', (request) => {\n  return 'Kakapo';\n});\n\nconst server = new Server();\n\nserver.use(router);\n\nfetch('/users', users => {\n  users == 'Kakapo';\n});\n\nfetch('https://api.github.com/users', users => {\n  //Real Github users data\n});\n\n```\n\n\n# Demo Apps\n\n## TODO App\n\nEvery project needs a TODO App, so here is the Kakapo one. Straightforward vanilla js app, uses the **fetch api** for the networking part.\n\n[Check the demo](https://kakapo-todo-app.firebaseapp.com/) or [look at the code](https://github.com/devlucky/Kakapo.js/tree/master/examples/todo-app)\n\n![](http://cl.ly/1K1z1G102X1P/Screen%20Recording%202016-05-16%20at%2010.06%20PM.gif)\n\n## Github explorer\n\nBasic github users search example, based 100% on the (Github Api)[https://developer.github.com/v3]. It shows you how easy is to replicate the logic of a backend with Kakapo and iterate faster when building the UI. This example also uses jQuery just to demostrate the compatibility with Kakapo.\n\n[Check the demo](https://kakapo-github-explorer.firebaseapp.com) or [look at the code](https://github.com/devlucky/Kakapo.js/tree/master/examples/github-explorer)\n\n![](https://raw.github.com/devlucky/Kakapo.js/master/examples/github-explorer/demo.gif)\n\n# Components\n\n## Server\n  The Kakapo Server is the main component of the framework, he is charge of activate things and link components like the router or the database.\n\n  **Linking components**\n  \n  So, in order to make your router to start intercepting requests, you must connect him with your server using the *use* method. Also is a good practice to connect your *current database* with your server, that way you will receive her as a parameter in your request handlers. This practice is very useful when you have multiple databases and routers, since you can easily swicth them without rewriting anything, see [Scenarios](#scenarios) section\n\n```javascript\nconst myDB = new Database();\nconst router = new Router();\nconst server = new Server();\n\nrouter.get('/posts', (request, db) => {\n  console.log(db === myDB);\n});\n\nserver.use(myDB);\nserver.use(router);\n\nfetch('/posts');\n\n```\n\n## Router\nThe Router class gives you the functionality to \nit has a very intuitive interface, so if you ever had to build any kind of rest api in any server-side language, you are already familiar with the Kakapo router. that allows you to define complex routes (like in a real server)\n\n**Method handling**\n\nThose are the supported http methods\n\n```javascript\nimport {Router} from 'kakapo';\n\nconst router = new Router();\n\nrouter.get('/users/:user_id')\nrouter.post('/users/:user_id')\nrouter.put('/users/:user_id')\nrouter.delete('/users/:user_id')\n```\n\n**Request object**\n\nYou can access to all the request properties through the request object passed in the request handler\n\n```javascript\nrouter.get('/posts/:post_id/comments/:comment_id', request => {\n  console.log(request.params.post_id);\n  console.log(request.params.comment_id);\n  console.log(request.query.page);\n  console.log(request.query.count);\n  console.log(request.body);\n  console.log(request.headers);\n});\n\n$.ajax({\n  url: '/posts/1/comments/5?page=1&count=10',\n  data: {text: 'Foo comment'},\n  headers: {'X-Access-token': '12345'}\n})\n```\n\n**Options**\n\nOther useful router options are the **host** and the **requestDelay**, you just need to pass them at the initialization moment\n\n```javascript\nimport {Router} from 'kakapo';\n\nconst router = new Router({\n  host: 'https://api.github.com',\n  requestDelay: 2000\n});\n```\n  \n## Database\n\nDatabase along with the Router is also one of the most important components, if you learn how to use it properly you can reuse tons of code and become really productive, that's why Kakapo promotes the use of the Database but you can still don't use it and return whatever you want from the request handlers.\n\n**Factories**\n\nThey come with [Faker](https://github.com/Marak/faker.js) a cool library to generate fake data\nJust a brief example of what you can achieve with the db:\n\n```javascript\nimport {Server, Router, Database} from 'kakapo';\n\nconst router = new Router();\nconst database = new Database();\nconst server = new Server();\n\ndb.register('user', faker => {\n  const name = faker.internet.userName();\n\n  return {\n    name,\n    avatar_url: faker.internet.avatar,\n    url: `https://api.github.com/users/${name}`,\n    type: \"User\",\n    company: faker.company.companyName, \n    blog: faker.internet.url, \n    location: faker.address.city,\n    email: faker.internet.email,\n    bio: faker.hacker.phrase,\n    created_at: faker.date.past, \n    updated_at: faker.date.recent\n  }\n});\ndb.create('user', 10);\n\nrouter.get('/users', (request, db) => {\n  return db.all('user');\n});\n\nrouter.get('/users/:user_id', (request, db) => {\n  return db.findOne('user', request.params.user_id);\n});\n\nrouter.post('/users', (request, db) => {\n  return db.push('user', request.params.body);\n});\n\nserver.use(database);\nserver.use(router);\n```\n\n\n**Relationships**\n\nSometimes while mocking, you miss some sort of consistency in your responses. Let's say you have a blog and when you ask for comments of a post you return a **post_id** that doesn't match any of the post ids...\n\nYou can solve that using relationships, they are designed to help you create this consistent state across all your requests. The methods are **belongsTo** and **hasMany**\n\n```javascript\nimport {Server, Database, Router} from 'kakapo';\n\nconst server = new Server();\nconst db = new Database();\nconst router = new Router();\n\nconst blogFactory = () => ({\n  posts: db.hasMany('post'),\n  authors: db.hasMany('user', 2) //Notice how we expecify the author id, to force to return that record always\n});\nconst postFactory = () => ({\n  title: 'Js for the lulz',\n  body: 'html body',\n  blog: db.belongsTo('blog')\n});\nconst userFactory = () => ({\n  name: 'devlucky',\n  followers: 1000,\n});\n\ndb.register('blog', blogFactory);\ndb.register('post', postFactory);\ndb.register('user', userFactory);\n\ndb.create('post', 10);\ndb.create('user', 5);\ndb.create('blog', 1);\n```\n\n## Response\n\nThe Response object is a helper class mostly used inside the request handlers to provide rich responses to your real handlers\n  \n```javascript\nimport { Server, Response, Router } from 'kakapo';\n\nconst server = new Server();\nconst router = new Router();\n\nrouter.get('/user/:user_id', request => {\n  const code = request.params.user_id < 10 ? 200 : 400;\n  const headers = {'X-request-date': new Date().getTime()};\n\n  return new Response(code, {status: code}, headers);\n});\n\nserver.use(router);\n```\n\n## Serializers\n\nThis is another component very familiar in backend laguages, Serializers offers you a way to abstract the **render** part of your entities. \nIn this example we cover a common case in which you have different versions of your Api and you want to represent that in Kakapo in the same way\n\n```javascript\nconst ApiV2Serializer = (record, type) => {\n  const id = record.id;\n  const metadata = {created_at: new Date()};\n  const attributes = Object.assign({}, record, metadata);\n\n  return {\n    id,\n    type,\n    attributes\n  };\n};\n\nconst db = new Database();\n\ndb.register('user', () => ({\n  firstName: 'Hector',\n  lastName: 'Zarco',\n  age: 24,\n}), ApiV2Serializer);\n\ndb.register('comment', () => ({\n  text: 'msg'\n}), ApiV2Serializer);\n\n```\n\n## Interceptors\n\nThis component is the one that actually handles the original request, is a private one but you can configure it in the Router. Just pass **strategies** in the constructor, by default both **fetch** and **XMLHttpRequest** are used.\n\n```javascript\nimport {Server, Router} from 'kakapo';\n\nconst server = new Server();\nconst fetchRouter = new Router({\n  strategies: ['fetch']\n});\nconst xhrRouter = new Router({\n  strategies: ['XMLHttpRequest']\n});\n\nserver.use(fetchRouter);\n\n//LATER\n\nserver.use(xhrRouter);\n  \n```\n\n## Scenarios\n\nThe **scenario** concept is nothing else than the ability of having different presets of Kakapo, like router, database, etc... and later, allow the user to decide when he wants to use one of other.  \n\nLet's say you want to check how the spinners looks in your app, in that case you probably will put a higher value as a **requestDelay**, to make sure that the requests are intercepted late and you can check the UI... other good use case might be one in which you want to test the performance of a view when you have thousands of elements, in order to achieve that you will just need to pass a high number to the **create** method of the **Database**: \n\n```javascript\nimport {Server, Router, Database} from 'kakapo';\n\nconst userFactory = (faker) => {\n  return {\n    name: faker.name.findName,\n    age: 24,\n    city: 'Valencia'\n  }\n};\nconst usersHandler = (request, db) => db.all('user');\nconst wifiServer = new Server({requestDelay: 150});\nconst threeGServer = new Server({requestDelay: 1000});\nconst router = new Router();\nconst chillDB = new Database();\nconst stressfulDB = new Database();\n\nchillDB.register('user', userFactory);\nchillDB.create('user', 5);\n\nstressfulDB.register('user', userFactory);\nstressfulDB.create('user', 1000);\n\nwifiServer.get('/users', usersHandler);\nthreeGServer.get('/users', usersHandler);\n\n//Pick the server with more latency if you want to check how the spinner looks like\n//server.use(wifiServer);\nserver.use(threeGServer);\n\n//Here you just have to switch between different databases in order to test the UI with tons of users\n//server.use(chillDB);\nserver.use(stressfulDB);\n\n```  \n\n## Fake data\n\nAs mention above, you can use [Faker](https://github.com/Marak/faker.js) for generate fake data, take a look at the full demo [here](http://marak.com/faker.js/). Also note that you can define nested properties and use Faker on them:\n\n```javascript\ndb.register('user', faker => {\n  return {\n    user: {\n      name: faker.name.findName,\n      nick: 'nick'\n    },\n    company: faker.company.companyName, \n    location: 'Valencia, Spain'\n  }\n});\n```\n\n# ROADMAP\n\n**Full support for JSONApiSerializer**\n\n**Node.js compatibility**\n\n**Node.js interceptors**\n\n# Authors \n\n[@rpunkfu](https://github.com/rpunkfu) - [@zzarcon](https://github.com/zzarcon)\n"
  },
  {
    "path": "__tests__/data/users.ts",
    "content": "import * as Faker from 'faker';\n\nexport type UserId = string;\n\nexport type User = {\n  id: UserId,\n  firstName: string,\n  lastName: string,\n  age: number\n};\n\nexport const userFactory = ({\n  id = Faker.random.uuid(),\n  firstName = Faker.name.firstName(),\n  lastName = Faker.name.lastName(),\n  age = Faker.random.number()\n}: Partial<User> = {} as User) => ({\n  id,\n  firstName,\n  lastName,\n  age\n});\n\nexport const someUser = userFactory();\n"
  },
  {
    "path": "__tests__/database_spec.ts",
    "content": "import * as Faker from 'faker';\n\nimport { Database, DataFactory } from '../src/Database';\nimport { User, UserId, userFactory, someUser } from './data/users';\n\ndescribe('Database', () => {\n  type Book = {\n    userId: UserId;\n    name: string;\n  };\n\n  type Schema = {\n    user: User;\n    book: Book;\n  };\n\n  type SetupOptions = {\n    factory?: DataFactory<User>;\n  };\n\n  const firstName = Faker.name.firstName();\n  const lastName = Faker.name.lastName();\n\n  const setup = ({ factory = jest.fn(userFactory) }: SetupOptions = {}) => {\n    const database: Database<Schema> = new Database();\n\n    database.register('user', factory);\n\n    return {\n      database,\n      factory\n    };\n  };\n\n  describe('create', () => {\n    it('should create a record given no size specified', () => {\n      const { database } = setup({ factory: () => someUser });\n      const records = database.create('user');\n\n      expect(records).toHaveLength(1);\n\n      const [record] = records;\n      expect(record.id).toEqual(0);\n      expect(record.data).toEqual(someUser);\n    });\n\n    it('should create multiple records given size is over 1', () => {\n      const { database } = setup();\n      const records = database.create('user', 10);\n\n      expect(records).toHaveLength(10);\n    });\n\n    it('should throw error given collection has not been registered', () => {\n      const database: Database<{\n        user: User;\n      }> = new Database();\n\n      expect(() => database.create('user')).toThrow();\n    });\n  });\n\n  describe('all', () => {\n    it('should return all records given collection name', () => {\n      const { database } = setup();\n\n      database.create('user', 10);\n      expect(database.all('user')).toHaveLength(10);\n\n      database.create('user', 5);\n      expect(database.all('user')).toHaveLength(15);\n    });\n  });\n\n  describe('delete', () => {\n    it('should return a record given id of existing record', () => {\n      const { database } = setup();\n      const user = userFactory({ firstName, lastName });\n\n      database.create('user', 10);\n      const record = database.push('user', user);\n\n      expect(database.all('user')).toHaveLength(11);\n      expect(database.delete('user', record.id)).toEqual(record);\n      expect(database.all('user')).toHaveLength(10);\n    });\n\n    it('should return null given id of non-existing record', () => {\n      const { database } = setup();\n      const user = userFactory({ firstName, lastName });\n\n      database.create('user', 10);\n\n      expect(database.all('user')).toHaveLength(10);\n      expect(database.delete('user', 123)).toBeNull();\n      expect(database.all('user')).toHaveLength(10);\n    });\n  });\n\n  describe('find', () => {\n    it('should return matching records given predicate', () => {\n      const { database } = setup();\n\n      database.create('user', 10);\n      database.create('user', 5, () => userFactory({ firstName }));\n\n      expect(database.all('user')).toHaveLength(15);\n      expect(database.find('user', { firstName })).toHaveLength(5);\n    });\n  });\n\n  describe('findOne', () => {\n    it('should return first matching record given predicate', () => {\n      const { database } = setup();\n      const user = userFactory({ firstName, lastName });\n\n      database.create('user', 10);\n      database.push('user', user);\n      database.create('user', 5, () => userFactory({ firstName }));\n      database.create('user', 10);\n\n      expect(database.findOne('user', { firstName })!.data).toEqual(user);\n    });\n  });\n\n  describe('first', () => {\n    it('should return the first record given collection name', () => {\n      const { database } = setup();\n\n      database.push('user', someUser);\n      database.create('user', 10);\n\n      expect(database.first('user')!.data).toEqual(someUser);\n    });\n  });\n\n  describe('last', () => {\n    it('should return the last record given collection name', () => {\n      const { database } = setup();\n\n      database.create('user', 10);\n      database.push('user', someUser);\n\n      expect(database.last('user')!.data).toEqual(someUser);\n    });\n  });\n\n  describe('push', () => {\n    it('should return a record given some data', () => {\n      const { database } = setup();\n\n      const record = database.push('user', someUser);\n\n      expect(record.data).toEqual(someUser);\n    });\n  });\n\n  describe('register', () => {\n    it('should allow database to create records of given collection name', () => {\n      const { database } = setup();\n\n      database.register('book', () => ({\n        id: Faker.random.uuid(),\n        name: Faker.hacker.phrase(),\n        userId: someUser.id\n      }));\n\n      const records = database.create('book', 10);\n\n      expect(records).toHaveLength(10);\n    });\n\n    it('should now allow database to create records of given collection has not been registered', () => {\n      const { database } = setup();\n\n      expect(() => database.create('book')).toThrow();\n    });\n  });\n\n  describe('reset', () => {\n    it('should remove all collections', () => {\n      const { database } = setup();\n\n      expect(database.exists('user')).toBeTruthy();\n      expect(database.exists('book')).toBeFalsy();\n\n      database.register('book', () => ({\n        id: Faker.random.uuid(),\n        name: Faker.hacker.phrase(),\n        userId: someUser.id\n      }));\n\n      expect(database.exists('user')).toBeTruthy();\n      expect(database.exists('book')).toBeTruthy();\n\n      database.reset();\n\n      expect(database.exists('user')).toBeFalsy();\n      expect(database.exists('book')).toBeFalsy();\n    });\n  });\n\n  describe('update', () => {\n    it('should return an updated record given id of existing record', () => {\n      const { database } = setup();\n      const [record] = database.create('user');\n\n      const updatedRecord = database.update('user', record.id, {\n        firstName: 'Jimmy'\n      });\n\n      expect(updatedRecord.id).toEqual(record.id);\n      expect(updatedRecord.data).toEqual({\n        ...record.data,\n        firstName: 'Jimmy'\n      });\n    });\n\n    it('should throw an error given id of non-existing record', () => {\n      const { database } = setup();\n\n      database.create('user', 10);\n\n      expect(() =>\n        database.update('user', 123, { firstName: 'Jimmy' })\n      ).toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "__tests__/request_spec.ts",
    "content": "import { Server, Router } from '../src';\n\ntest.skip('Request # headers', () => {\n  expect.assertions(2);\n\n  const server = new Server();\n  const router = new Router();\n\n  router.post('/users', (request) => {\n    expect(request.headers.get('custom-request-header-1')).toEqual('one');\n    expect(request.headers.get('custom-request-header-2')).toEqual('two');\n  });\n\n  server.use(router);\n\n  // TODO: Headers is undefined in jsdom\n  const headers = new Headers({\n    'custom-request-header-1': 'one',\n    'custom-request-header-2': 'two',\n  });\n\n  const options = {\n    method: 'POST',\n    headers,\n  };\n\n  fetch('/users', options);\n});\n\n// @TODO: Test explicitly the contents of request.params\n// @TODO: Test explicitly the contents of request.query"
  },
  {
    "path": "__tests__/response_spec.ts",
    "content": "import { Server, KakapoResponse, Router } from '../src';\n\n// TODO: stub native Response\ndescribe.skip('Response', () => {\n  test('Response # body', () => {\n    expect.assertions(2);\n\n    const server = new Server();\n    const router = new Router();\n\n    router.get(\n      '/users/:id',\n      request =>\n        new KakapoResponse(200, { id: request.params.id, type: 'user' })\n    );\n\n    server.use(router);\n\n    fetch('/users/1')\n      .then(r => r.json())\n      .then(result => {\n        expect(result.id).toEqual('1');\n        expect(result.type).toEqual('user');\n      });\n  });\n\n  test('Response # headers', assert => {\n    expect.assertions(4);\n\n    const server = new Server();\n    const router = new Router();\n\n    router.get(\n      '/users/:id',\n      () =>\n        new KakapoResponse(\n          200,\n          {},\n          { 'x-header-1': 'one', 'x-header-2': 'two' }\n        )\n    );\n\n    server.use(router);\n\n    fetch('/users/1').then(result => {\n      expect(result.headers.get('x-header-1')).toEqual('one');\n      expect(result.headers.get('x-header-2')).toEqual('two');\n    });\n\n    const xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState === 4) {\n        expect(this.getResponseHeader('x-header-1')).toEqual('one');\n        expect(this.getResponseHeader('x-header-2')).toEqual('two');\n      }\n    };\n\n    xhr.open('GET', '/users/1', true);\n    xhr.send();\n  });\n\n  test('Response # error', assert => {\n    const response = new KakapoResponse(404, {}, { 'x-header-1': 'one' });\n\n    expect(response.error).toBeTruthy();\n  });\n\n  test('Response # ok', assert => {\n    const response = new KakapoResponse(204, {}, { 'x-header-1': 'one' });\n\n    expect(response.ok).toBeTruthy();\n  });\n\n  test('Response # code', assert => {\n    expect.assertions(2);\n\n    const server = new Server();\n    const router = new Router();\n    const responsePayload = { status: 'error' };\n\n    router.get('/users', request => new KakapoResponse(400, responsePayload));\n\n    server.use(router);\n\n    const xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState === 4) {\n        expect(xhr.status).toEqual(400);\n        expect(xhr.responseText).toEqual(JSON.stringify(responsePayload));\n      }\n    };\n    xhr.open('GET', '/users', true);\n    xhr.send();\n  });\n});\n"
  },
  {
    "path": "__tests__/router_spec.ts",
    "content": "import { Server, Router, KakapoResponse } from '../src';\nimport { isFakeFetch } from '../src/interceptors/fetchInterceptor';\n\ndescribe('Router', () => {\n\n  let server: Server<any>;\n  let router: Router<any>;\n\n  beforeEach(() => {\n    server = new Server();\n    router = new Router();\n  });\n\n  afterEach(() => {\n    router.reset();\n  });\n\n  it('should use fake fetch', () => {\n    router = new Router({\n      host: 'https://api.github.com'\n    });\n    router.get('/comments', request => {\n      expect(typeof request).toEqual('object');\n    });\n    server.use(router);\n\n    expect(isFakeFetch(fetch)).toBe(true);\n  });\n\n  test('Router # config # host', async () => {\n    // TODO: Create multiple servers at the same time with different\n    // 'host' and check that works properly\n    router = new Router({\n      host: 'https://api.github.com'\n    });\n\n    router.get('/comments', request => {\n      expect(typeof request).toEqual('object');\n    });\n\n    server.use(router);\n\n    const response = await fetch('https://api.github.com/comments');\n\n    expect(response).toBeInstanceOf(Response);\n    expect(response.ok).toBeTruthy();\n\n    const response2 = await fetch('/comments');\n    expect(response).toBeInstanceOf(Response);\n  });\n\n  test('Router # config # requestDelay', async () => {\n    router = new Router({\n      requestDelay: 1000\n    });\n\n    router.get('/comments', request => {\n      expect(typeof request).toEqual('object');\n    });\n\n    server.use(router);\n\n    const response = await fetch('/comments');\n\n    expect(response instanceof Response).toBeTruthy();\n    expect(response.ok).toBeTruthy();\n  });\n\n  test('Router # config # strategies', async () => {\n    const server = new Server();\n    const router = new Router({}, {strategies: ['fetch']});\n\n    server.use(router);\n\n    expect(router.routerConfig).toEqual({\n      strategies: ['fetch']\n    })\n  });\n\n  test('Router#get', async () => {\n    router.get('/comments', request => {\n      expect(typeof request).toEqual('object');\n    });\n\n    router.get('/users/:user_id', request => {\n      expect(typeof request).toEqual('object');\n      expect(typeof request.params).toEqual('object');\n\n      return {\n        users: [{ firstName: 'hector' }]\n      };\n    });\n\n    server.use(router);\n\n    expect(await fetch('/doesnt_exist')).toBeInstanceOf(Response);\n    expect(await fetch('/comments')).toBeInstanceOf(Response);\n\n    return fetch('/users/1')\n      .then(response => {\n        expect(response).toBeInstanceOf(Response);\n        return response.json();\n      })\n      .then(response => {\n        const firstName = response.users[0].firstName;\n        expect(firstName).toEqual('hector');\n      });\n  });\n\n  test('Router#post', async () => {\n    const body = JSON.stringify({ firstName: 'Joan', lastName: 'Romano' });\n\n    router.post('/users', request => {\n      const parsedBody = JSON.parse(request.body);\n      const firstName = parsedBody.firstName;\n\n      expect(request.body).toEqual(body);\n      expect(firstName).toEqual('Joan');\n\n      return {\n        status: 'success',\n        record: parsedBody\n      };\n    });\n\n    server.use(router);\n\n    const response = await (await fetch('/users', {\n      method: 'POST',\n      body\n    })).json();\n    const status = response.status;\n    const firstName = response.record.firstName;\n\n    expect(status).toEqual('success');\n    expect(firstName).toEqual('Joan');\n  });\n\n  test('Router # post # XMLHttpRequest', () => {\n    const body = JSON.stringify({ firstName: 'Joan', lastName: 'Romano' });\n\n    router.post('/hector', request => {\n      const body = JSON.parse(request.body);\n\n      expect(body.firstName).toEqual('Joan');\n    });\n\n    server.use(router);\n\n    const xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = () => {};\n    xhr.open('POST', '/hector', true);\n    xhr.send(body);\n  });\n\n  test('Router#put', async () => {\n    router.put('/users', request => {\n      const query = request.query;\n      const page = query.page;\n\n      expect(page).toEqual('1');\n\n      return {\n        status: 'success',\n        query\n      };\n    });\n\n    server.use(router);\n\n    const response = await (await fetch('/users?page=1', {\n      method: 'PUT'\n    })).json();\n    const status = response.status;\n    const page = response.query.page;\n\n    expect(status).toEqual('success');\n    expect(page).toEqual('1');\n  });\n\n  test('Router#delete', async () => {\n    router.delete('/users/:user_id/comments/:comment_id', request => {\n      const params = request.params;\n      const commentId = request.params.comment_id;\n\n      expect(commentId).toEqual('2');\n\n      return {\n        status: 'success',\n        params\n      };\n    });\n\n    server.use(router);\n\n    const response = await (await fetch('/users/1/comments/2', {\n      method: 'DELETE'\n    })).json();\n    const status = response.status;\n    const userId = response.params.user_id;\n\n    expect(status).toEqual('success');\n    expect(userId).toEqual('1');\n  });\n\n  test('Router#XMLHttpRequest # config # requestDelay', () => {\n    router = new Router({\n      requestDelay: 10\n    });\n\n    router.get('/comments', request => {\n      expect(typeof request).toEqual('object');\n    });\n\n    server.use(router);\n\n    const xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = () => {};\n    xhr.open('GET', '/comments', true);\n    xhr.send();\n  });\n\n  test.skip('Router#XMLHttpRequest', () => {\n    router.get('/comments', request => {\n      const params = request.params;\n\n      expect(typeof request).toEqual('object');\n      expect(typeof params).toEqual('object');\n\n      return [{ text: 'First comment' }, { text: 'Second comment' }];\n    });\n\n    server.use(router);\n\n    const xhr = new XMLHttpRequest();\n    const xhr2 = new XMLHttpRequest();\n\n    xhr.onreadystatechange = () => {\n      if (xhr.readyState !== 4) {\n        return;\n      }\n\n      const response = xhr.responseText;\n\n      expect(typeof response).toEqual('string');\n    };\n    xhr.open('GET', '/doesnt_exist', true);\n    xhr.send();\n\n    xhr2.onreadystatechange = function() {\n      if (xhr2.readyState !== 4 || xhr2.status !== 200) {\n        return;\n      }\n\n      const response = xhr2.responseText;\n      const texts = response;\n      const responseObject = JSON.parse(response);\n\n      expect(this.readyState).toEqual(xhr2.readyState);\n      expect(this.responseText).toEqual(xhr2.responseText);\n      expect(typeof response).toEqual('string');\n      expect(typeof responseObject).toEqual('object');\n      expect(responseObject.length).toEqual(2);\n    };\n    xhr2.open('GET', '/comments', true);\n    xhr2.send();\n    expect.assertions(8);\n  });\n\n  test('Router # Async support', async () => {\n    router.get('/async_endpoint', request => {\n      return new Promise(resolve => {\n        setTimeout(() => {\n          resolve({\n            body: 'async response'\n          });\n        }, 1000);\n      });\n    });\n\n    server.use(router);\n\n    const response = await (await fetch('/async_endpoint')).json();\n\n    expect(response.body).toEqual('async response');\n  });\n\n  test('Router # Fetch # Content-Type image/svg+xml', async () => {\n    const svgData = 'svgData';\n\n    router.get('/svg_content', request => {\n      return new KakapoResponse(200, svgData, {\n        'content-type': 'image/svg+xml'\n      });\n    });\n\n    server.use(router);\n\n    const response = await fetch('/svg_content');\n\n    expect(response.body).toEqual(svgData);\n  });\n\n  test('Router # Fetch # No Content Type', async () => {\n    const expectedResponse = { foo: 'bar' };\n\n    router.get('/json_content', request => {\n      return new KakapoResponse(200, expectedResponse);\n    });\n\n    server.use(router);\n\n    const response = await fetch('/json_content');\n\n    expect(response.json()).resolves.toEqual(expectedResponse);\n  });\n\n  test('Router # Fetch # Content Type application/json', async () => {\n    const expectedResponse = { foo: 'bar' };\n\n    router.get('/json_content', request => {\n      return new KakapoResponse(200, expectedResponse, {\n        'content-type': 'application/json'\n      });\n    });\n\n    server.use(router);\n\n    const response = await fetch('/json_content');\n\n    expect(response.body).toEqual(JSON.stringify(expectedResponse));\n  });\n  // @TODO Test strategies in router.\n});\n"
  },
  {
    "path": "__tests__/server_spec.ts",
    "content": "// @TODO Test Server's config\nimport { Database, Router, Server } from '../src';\n\nconst xhrRequest = (url: string) => {\n    const xhr = new XMLHttpRequest();\n\n    xhr.onreadystatechange = () => {};\n    xhr.open('GET', url, true);\n    xhr.send();\n};\n\ndescribe.skip('Server', () => {\n    test('Server # use database', () => {\n        expect.assertions(2);\n\n        const myDB = new Database();\n        const router = new Router();\n        const server = new Server();\n\n        router.get('/fetch', (request, db) => {\n            expect(db == myDB).toBeTruthy();\n        });\n        router.get('/xhr', (request, db) => {\n            expect(db == myDB).toBeTruthy();\n        });\n\n        server.use(myDB);\n        server.use(router);\n\n        fetch('/fetch');\n        xhrRequest('/xhr');\n    });\n\n    test('Server # use router', () => {\n        const router = new Router();\n        const server = new Server();\n\n        router.get('/comments', _ => {\n            //Should not reach this handler since the request is fired before \"server.use\"\n        });\n\n        router.get('/users', _ => {\n            //It must only enter in this handler since the request has been triggered after the registration\n            expect(true).toBeTruthy();\n        });\n\n        fetch('/comments');\n        server.use(router);\n        fetch('/users');\n    });\n\n    test('Server # remove database', () => {\n        expect.assertions(2);\n\n        const myDB = new Database();\n        const router = new Router();\n        const server = new Server();\n\n        router.get('/fetch_db', (_request, db) => {\n            expect(db == myDB).toBeTruthy();\n        });\n        router.get('/fetch_nodb', (_request, db) => {\n            expect(db == null).toBeTruthy();\n        });\n\n        server.use(myDB);\n        server.use(router);\n        fetch('/fetch_db');\n\n        server.remove(myDB);\n        fetch('/fetch_nodb');\n    });\n\n    test('Server # remove router', () => {\n        expect.assertions(2);\n\n        const router = new Router();\n        const server = new Server();\n\n        router.get('/fetch', _ => {\n            //Server is active before being removed\n            expect(true).toBeTruthy();\n        });\n        router.get('/fetch_fail', _ => {\n            //Request is being intercepted when router is removed\n        });\n\n        server.use(router);\n        fetch('/fetch');\n\n        server.remove(router);\n        fetch('/fetch_fail').then(response => {\n            //Server is inactive after removal\n            expect(response.status).toEqual(404);\n        });\n    });\n});\n"
  },
  {
    "path": "create-readme.js",
    "content": "'use strict';\nconst fs = require('fs');\nconst request = require('superagent');\nconst readmeUrl = 'https://cdn.rawgit.com/devlucky/devlucky.github.io/master/kakapo-js.md';\n\nrequest\n  .get(readmeUrl)\n  .end(function(err, res) {\n    if (err) {\n      return console.log(err);\n    }\n\n    const text = res.text;\n    const content = text.split('# Getting started')[1].replace(/\\<\\/div>/g, '');\n    const start = getFile('start');\n    const end = getFile('end');\n    const readme = [start, content, end].join('');\n    \n    fs.writeFileSync('./README.md', readme);\n  });\n\nconst getFile = uri => fs.readFileSync(`./md/${uri}.md`).toString();"
  },
  {
    "path": "examples/dummy/.gitignore",
    "content": "bower_components\ndist"
  },
  {
    "path": "examples/dummy/README.md",
    "content": "#Kakapo Dummy App example\n> Just shows how to integrate Kakapo.js in you app in multiple flavours\n\nThis Example shows different ways of requiring Kakapo.js in your app:\n\n##ES6 Module\n\n`$ npm i kakapo -D`\n\n`$ npm run browserify` \n\n```javascript\nimport {Server, Router} from 'kakapo';\n\nconst server = new Server();\nconst router = new Router();\n```\n\n##AMD\n\n`$ npm i kakapo -D`\n\n`$ npm run browserify_require`\n\n```javascript\nconst kakapo = require('kakapo');\n\nconst server = new kakapo.Server();\nconst router = new kakapo.Router();\n```\n\n##Bower\n\n`$ bower i kakapo -D`\n\nInclude **bower_components/kakapo/lib/kakapo.js** \n\n```javascript\nconst server = new Kakapo.Server();\nconst router = new Kakapo.Router();\n```\n"
  },
  {
    "path": "examples/dummy/bower.json",
    "content": "{\n  \"name\": \"kakapo-dummy-app\",\n  \"description\": \"Dummy app that shows how to integrate Kakapo.js\",\n  \"main\": \"index.js\",\n  \"authors\": [\n    \"kakapo-team\"\n  ],\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/devlucky/Kakapo.js\",\n  \"private\": true,\n  \"dependencies\": {\n    \"kakapo\": \"https://github.com/devlucky/Kakapo.js.git#master\"\n  }\n}\n"
  },
  {
    "path": "examples/dummy/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Kakapo dummy app</title>\n  <!---->\n  <!-- Uncomment the option you wanna try -->\n  <!---->\n  <!-- <script src=\"dist/browserify_bundle.js\"></script> -->\n  <!-- <script src=\"dist/browserify_require_bundle.js\"></script> -->\n  <!-- <script src=\"../../lib/kakapo.js\"></script>\n  <script src=\"bower_test.js\"></script> -->\n  <script src=\"https://rawgit.com/devlucky/Kakapo.js/master/lib/kakapo.js\"></script>\n  <!-- <script src=\"bower_components/kakapo/lib/kakapo.js\"></script> -->\n  <!-- <script src=\"bower_test.js\"></script> -->\n</head>\n<body>\n  \n</body>\n</html>"
  },
  {
    "path": "examples/dummy/package.json",
    "content": "{\n  \"name\": \"kakapo-dummy-app\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Dummy app that shows how to integrate Kakapo.js\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"browserify\": \"browserify browserify_test.js -o dist/browserify_bundle.js -t [ babelify --presets [ es2015 ] ]\",\n    \"browserify_require\": \"browserify browserify_require_test.js -o dist/browserify_require_bundle.js -t [ babelify --presets [ es2015 ] ]\"\n  },\n  \"author\": \"kakapo-team\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"kakapo\": \"0.1.3\"\n  },\n  \"devDependencies\": {\n    \"babel-cli\": \"^6.10.1\",\n    \"babel-preset-es2015\": \"^6.9.0\",\n    \"babelify\": \"^7.3.0\",\n    \"browserify\": \"^13.0.1\"\n  }\n}\n"
  },
  {
    "path": "examples/github-explorer/.firebaserc",
    "content": "{\n  \"projects\": {\n    \"default\": \"kakapo-github-explorer\"\n  }\n}\n"
  },
  {
    "path": "examples/github-explorer/README.md",
    "content": "# Example - Github explorer\n> Example of a github user explorer powered by Kakapo.js - [DEMO](https://kakapo-github-explorer.firebaseapp.com/)\n\n![](https://raw.github.com/devlucky/Kakapo.js/master/examples/github-explorer/demo.gif)\n\n# Installation\n\n`$ npm i`\n\n`$ python -m SimpleHTTPServer 8000`"
  },
  {
    "path": "examples/github-explorer/database.rules.json",
    "content": "{\n  \".read\": true,\n  \".write\": true\n}\n"
  },
  {
    "path": "examples/github-explorer/firebase.json",
    "content": "{\n  \"database\": {\n    \"rules\": \"database.rules.json\"\n  },\n  \"hosting\": {\n    \"public\": \".\",\n    \"rewrites\": [\n      {\n        \"source\": \"**\",\n        \"destination\": \"/index.html\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/github-explorer/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <link href=\"https://fonts.googleapis.com/icon?family=Material+Icons\" rel=\"stylesheet\">\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"node_modules/materialize-css/bin/materialize.css\"  media=\"screen,projection\"/>\n    <link type=\"text/css\" rel=\"stylesheet\" href=\"styles.css\"/>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>\n    <title>Kakapo - Github explorer</title>\n  </head>\n  <body>\n    <nav>\n      <div class=\"nav-wrapper\">\n        <a href=\"#\" class=\"brand-logo\">Github explorer</a>\n        <ul id=\"nav-mobile\" class=\"right hide-on-med-and-down\">\n          <div class=\"row\">\n            <div class=\"input-field col s6\">\n              <i class=\"material-icons prefix\">search</i>\n              <input id=\"search\" type=\"text\" class=\"validate\">\n              <label for=\"search\">Search...</label>\n            </div>\n          </div>\n        </ul>\n      </div>\n    </nav>\n    \n    <div id=\"userModal\" class=\"modal\">\n      <div class=\"modal-content\">\n        \n      </div>\n    </div>\n    <div id=\"users-loader\" class=\"progress\">\n      <div class=\"indeterminate\"></div>\n    </div>\n    <ul id=\"user-list\" class=\"collection\">\n      \n    </ul>\n    <!-- For development -->\n    <!-- <script src=\"../../lib/kakapo.js\"></script> -->\n    <script src=\"https://rawgit.com/devlucky/Kakapo.js/master/lib/kakapo.js\"></script>\n    <script src=\"node_modules/jquery/dist/jquery.js\"></script>\n    <script src=\"kakapo-config.js\"></script>\n    <script src=\"app.js\"></script>\n    <script src=\"node_modules/materialize-css/bin/materialize.js\"></script>\n  </body>\n</html>"
  },
  {
    "path": "examples/github-explorer/package.json",
    "content": "{\n  \"name\": \"kakapo-github-explorer\",\n  \"version\": \"0.1.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"styles\": \"node-sass styles.scss styles.css -w\"\n  },\n  \"author\": \"kakapo-team\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"jquery\": \"^2.2.3\",\n    \"materialize-css\": \"^0.97.6\"\n  },\n  \"devDependencies\": {\n    \"node-sass\": \"^3.7.0\"\n  }\n}\n"
  },
  {
    "path": "examples/github-explorer/styles.css",
    "content": "nav {\n  padding: 0 10px;\n  margin-bottom: 20px; }\n  nav #nav-mobile label {\n    color: #ccc; }\n    nav #nav-mobile label.active {\n      display: none; }\n\n#search {\n  padding: 0;\n  margin-left: 35px; }\n\n.collection-item {\n  transition: background-color 0.2s ease;\n  cursor: pointer; }\n  .collection-item:hover {\n    background-color: #2bbbad; }\n\n#users-loader {\n  height: 0;\n  transition: height .3s; }\n  #users-loader.active {\n    height: 4px; }\n\n.media {\n  display: flex;\n  align-items: flex-start;\n  margin-bottom: 10px; }\n  .media .media-img {\n    margin-right: 10px;\n    width: 70px; }\n  .media .media-body {\n    flex: 1; }\n  .media .media-title {\n    margin-bottom: 5px; }\n  .media ul li {\n    display: flex;\n    align-items: center;\n    margin-bottom: 10px; }\n    .media ul li i {\n      margin-right: 10px; }\n  .media p {\n    border-top: 1px solid #eee;\n    margin-top: 10px;\n    padding-top: 10px; }\n"
  },
  {
    "path": "examples/github-explorer/styles.scss",
    "content": "nav {\n  padding: 0 10px;\n  margin-bottom: 20px;\n\n  #nav-mobile label {\n    color: #ccc;\n\n    &.active {\n      display: none;\n    }\n  }\n}\n#search {\n  padding: 0;\n  margin-left: 35px;\n}\n.collection-item {\n  transition: background-color 0.2s ease;\n  cursor: pointer;\n\n  &:hover {\n    background-color: #2bbbad;\n  }\n}\n#users-loader {\n  height: 0;\n  transition: height .3s;\n\n  &.active {\n    height: 4px;\n  }\n}\n.media{\n  display: flex;\n  align-items: flex-start;\n  margin-bottom: 10px;\n\n  .media-img{\n    margin-right: 10px;\n    width: 70px;\n  }\n  .media-body{\n    flex: 1;\n  }\n  .media-title{\n    margin-bottom: 5px;\n  }\n  ul{\n    li{\n      display: flex;\n      align-items: center;\n      margin-bottom: 10px;\n\n      i{\n        margin-right: 10px;\n      }\n    }\n  }\n  p{\n    border-top: 1px solid #eee;\n    margin-top: 10px;\n    padding-top: 10px;\n  }\n}"
  },
  {
    "path": "examples/react/.nvmrc",
    "content": "8.5.0"
  },
  {
    "path": "examples/react/example/app.tsx",
    "content": "import * as React from 'react';\nimport {Component} from 'react';\nimport {Server, Router} from '../../../dist';\nimport {AppWrapper} from './styled';\n\nconst server = new Server();\nconst router = new Router();\n\nrouter.get('/files', () => {\n  return {\n    files: [1,2]\n  };\n});\n\nrouter.get('/promise/files', () => {\n  return Promise.resolve({\n    files: [1,2]\n  });\n});\n\nrouter.post('/promise/file', async () => {\n  await new Promise(resolve => setTimeout(resolve, 100));\n\n  return new Promise(resolve => {\n    resolve({\n      status: 'success'\n    });\n  });\n});\n\nserver.use(router);\n\nexport interface AppState {\n  \n}\n\nexport default class App extends Component <{}, AppState> {\n  state: AppState = {\n    \n  }\n  \n  componentDidMount() {\n    this.getFilesXHR();\n    this.getFilesPromiseXHR();\n    this.postFilePromiseXHR();\n  }\n\n  async getFilesFetch() {\n    const files = await (await fetch('/files')).json();\n\n    console.log(files)\n  }\n\n  async getFilesXHR() {\n    const xhr = new XMLHttpRequest();\n\n    xhr.open('GET', '/files');\n    xhr.onload = () => {\n      console.log('response', xhr.response);\n    };\n    xhr.send();\n  }\n\n  getFilesPromiseXHR() {\n    const xhr = new XMLHttpRequest();\n\n    xhr.open('GET', '/promise/files');\n    xhr.onload = () => {\n      console.log('promise response', xhr.response);\n    };\n    xhr.send();\n  }\n\n  postFilePromiseXHR() {\n    const xhr = new XMLHttpRequest();\n\n    xhr.open('POST', '/promise/file');\n    xhr.onload = () => {\n      console.log('promise post response', xhr.response);\n    };\n    xhr.send();\n  }\n\n  render() {\n    return (\n      <AppWrapper>\n        Example!\n      </AppWrapper>\n    )\n  }\n}"
  },
  {
    "path": "examples/react/example/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <title>Example</title>\n</head>\n<body>\n  <div id=\"app\"></div>\n  <script src=\"../example-bundle.js\"></script>\n</body>\n</html>"
  },
  {
    "path": "examples/react/example/index.tsx",
    "content": "import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport App from './app';\n\nReactDOM.render(<App />, document.getElementById('app'));\n"
  },
  {
    "path": "examples/react/example/styled.ts",
    "content": "import styled from 'styled-components';\n\nexport const AppWrapper = styled.div`\n\n`;"
  },
  {
    "path": "examples/react/package.json",
    "content": "{\n  \"name\": \"kakapo-react-example\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"license\": \"MIT\",\n  \"devDependencies\": {\n    \"ts-react-toolbox\": \"^0.1.1\"\n  },\n  \"engines\": {\n    \"node\": \">=8.5.0\"\n  },\n  \"scripts\": {\n    \"bootstrap\": \"ts-react-toolbox init\",\n    \"dev\": \"ts-react-toolbox dev\",\n    \"build\": \"ts-react-toolbox build\",\n    \"lint\": \"ts-react-toolbox lint\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.2.0\"\n  }\n}"
  },
  {
    "path": "examples/react/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"strictNullChecks\": true,\n    \"strictFunctionTypes\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noUnusedLocals\": true,\n    \"noUnusedParameters\": true,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"noImplicitAny\": false,\n    \"removeComments\": true,\n    \"target\": \"es5\",\n    \"lib\": [\n      \"dom\",\n      \"es5\",\n      \"scripthost\",\n      \"es2015.collection\",\n      \"es2015.symbol\",\n      \"es2015.iterable\",\n      \"es2015.promise\"\n    ],\n    \"jsx\": \"react\"\n  }\n}"
  },
  {
    "path": "examples/todo-app/.firebaserc",
    "content": "{\n  \"projects\": {\n    \"default\": \"kakapo-todo-app\"\n  }\n}\n"
  },
  {
    "path": "examples/todo-app/README.md",
    "content": "# Example - TODO App\n> Example of a todo app powered by Kakapo.js - [DEMO](https://kakapo-todo-app.firebaseapp.com/)\n\n![](http://cl.ly/1K1z1G102X1P/Screen%20Recording%202016-05-16%20at%2010.06%20PM.gif)\n\n# Installation\n\n`$ npm i`\n\n`$ python -m SimpleHTTPServer 8000`\n"
  },
  {
    "path": "examples/todo-app/database.rules.json",
    "content": "{\n  \".read\": true,\n  \".write\": true\n}\n"
  },
  {
    "path": "examples/todo-app/firebase.json",
    "content": "{\n  \"database\": {\n    \"rules\": \"database.rules.json\"\n  },\n  \"hosting\": {\n    \"public\": \".\",\n    \"rewrites\": [\n      {\n        \"source\": \"**\",\n        \"destination\": \"/index.html\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "examples/todo-app/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>Kakapo.js - TODO App</title>\n    <link rel=\"stylesheet\" href=\"node_modules/todomvc-app-css/index.css\">\n  </head>\n  <body>\n    <body>\n      <section class=\"todoapp\">\n        <header class=\"header\">\n          <h1>todos</h1>\n          <input class=\"new-todo\" placeholder=\"What needs to be done?\" autofocus>\n        </header>\n        <section class=\"main\">\n          <input class=\"toggle-all\" type=\"checkbox\">\n          <label for=\"toggle-all\">Mark all as complete</label>\n          <ul class=\"todo-list\"></ul>\n        </section>\n        <footer class=\"footer\" hidden>\n          <span class=\"todo-count\"><strong>0</strong> item left</span>\n          <button class=\"clear-completed\">Clear completed</button>\n        </footer>\n      </section>\n      <footer class=\"info\">\n        <p>Double-click to edit a todo</p>\n      </footer>\n      \n      <!-- For development -->\n      <!-- <script src=\"../../lib/kakapo.js\"></script> -->\n      <script src=\"https://rawgit.com/devlucky/Kakapo.js/master/lib/kakapo.js\"></script>\n      <script src=\"kakapo-config.js\"></script>\n      <script src=\"app.js\"></script>\n    </body>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/todo-app/package.json",
    "content": "{\n  \"name\": \"kakapo-todo-app\",\n  \"version\": \"0.1.0\",\n  \"description\": \"Todo app built with Kakapo.js\",\n  \"main\": \"index.js\",\n  \"scripts\": {},\n  \"author\": \"devlucky\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"kakapo\": \"0.0.1\",\n    \"todomvc-app-css\": \"^2.0.5\"\n  }\n}\n"
  },
  {
    "path": "flow-typed/npm/jest_v22.x.x.js",
    "content": "// flow-typed signature: 069387a9f0aaed26ad0eb69da26f3e03\n// flow-typed version: 2c21d4538f/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   * Accepts a string to use in test result output in place of \"jest.fn()\" to\n   * indicate which mock function is being referenced.\n   */\n  mockName(name: string): 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 * Jest allows functions and classes to be used as test names in test() and\n * describe()\n */\ntype JestTestName = string | Function;\n\n/**\n *  Plugin: jest-enzyme\n */\ntype EnzymeMatchersType = {\n  toBeChecked(): void,\n  toBeDisabled(): void,\n  toBeEmpty(): void,\n  toBeEmptyRender(): void,\n  toBePresent(): void,\n  toContainReact(element: React$Element<any>): void,\n  toExist(): void,\n  toHaveClassName(className: string): void,\n  toHaveHTML(html: string): void,\n  toHaveProp: ((propKey: string, propValue?: any) => void) & ((props: Object) => void),\n  toHaveRef(refName: string): void,\n  toHaveState: ((stateKey: string, stateValue?: any) => void) & ((state: Object) => void),\n  toHaveStyle: ((styleKey: string, styleValue?: any) => void) & ((style: Object) => 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\n// DOM testing library extensions https://github.com/kentcdodds/dom-testing-library#custom-jest-matchers\ntype DomTestingLibraryType = {\n  toBeInTheDOM(): void,\n  toHaveTextContent(content: string): void,\n  toHaveAttribute(name: string, expectedValue?: string): void\n};\n\ntype JestExpectType = {\n  not: JestExpectType & EnzymeMatchersType & DomTestingLibraryType,\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  advanceTimersByTime(msToRun: number): void,\n  /**\n   * Executes only the macro task queue (i.e. all tasks queued by setTimeout()\n   * or setInterval() and setImmediate()).\n   *\n   * Renamed to `advanceTimersByTime`.\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, accessType?: \"get\" | \"set\"): 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: JestTestName, fn: () => void): void,\n\n  /**\n   * Only run this describe block\n   */\n  only(name: JestTestName, fn: () => void): void,\n\n  /**\n   * Skip running this describe block\n   */\n  skip(name: JestTestName, fn: () => void): void\n};\n\n/** An individual test unit */\ndeclare var it: {\n  /**\n   * An individual test unit\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  (\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Only run this test\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  only(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Skip running this test\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  skip(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void,\n  /**\n   * Run the test concurrently\n   *\n   * @param {JestTestName} Name of Test\n   * @param {Function} Test\n   * @param {number} Timeout for the test, in milliseconds.\n   */\n  concurrent(\n    name: JestTestName,\n    fn?: (done: () => void) => ?Promise<mixed>,\n    timeout?: number\n  ): void\n};\ndeclare function fit(\n  name: JestTestName,\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\ntype JestPrettyFormatColors = {\n  comment: { close: string, open: string },\n  content: { close: string, open: string },\n  prop: { close: string, open: string },\n  tag: { close: string, open: string },\n  value: { close: string, open: string },\n};\n\ntype JestPrettyFormatIndent = string => string;\ntype JestPrettyFormatRefs = Array<any>;\ntype JestPrettyFormatPrint = any => string;\ntype JestPrettyFormatStringOrNull = string | null;\n\ntype JestPrettyFormatOptions = {|\n  callToJSON: boolean,\n  edgeSpacing: string,\n  escapeRegex: boolean,\n  highlight: boolean,\n  indent: number,\n  maxDepth: number,\n  min: boolean,\n  plugins: JestPrettyFormatPlugins,\n  printFunctionName: boolean,\n  spacing: string,\n  theme: {|\n    comment: string,\n    content: string,\n    prop: string,\n    tag: string,\n    value: string,\n  |},\n|};\n\ntype JestPrettyFormatPlugin = {\n  print: (\n    val: any,\n    serialize: JestPrettyFormatPrint,\n    indent: JestPrettyFormatIndent,\n    opts: JestPrettyFormatOptions,\n    colors: JestPrettyFormatColors,\n  ) => string,\n  test: any => boolean,\n};\n\ntype JestPrettyFormatPlugins = Array<JestPrettyFormatPlugin>;\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 & DomTestingLibraryType,\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(pluginModule: JestPrettyFormatPlugin): void,\n  assertions(expectedAssertions: number): void,\n  hasAssertions(): void,\n  any(value: mixed): JestAsymmetricEqualityType,\n  anything(): any,\n  arrayContaining(value: Array<mixed>): Array<mixed>,\n  objectContaining(value: Object): Object,\n  /** Matches any received string that contains the exact expected string. */\n  stringContaining(value: string): string,\n  stringMatching(value: string | RegExp): string\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(): any,\n  arrayContaining(value: Array<mixed>): Array<mixed>,\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): Object,\n  stringMatching(value: string): string\n};\n"
  },
  {
    "path": "flow-typed/npm/lodash_v4.x.x.js",
    "content": "// flow-typed signature: 213ae107c05372e2489e50a054136496\n// flow-typed version: 08e518e6e8/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?: ?$ReadOnlyArray<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) => Object;\n    unset(path: Array<string> | string, object: Object): Object;\n    dissoc(path: Array<string> | string): (object: Object) => Object;\n    dissoc(path: Array<string> | string, object: Object): Object;\n    dissocPath(path: Array<string> | string): (object: Object) => Object;\n    dissocPath(path: Array<string> | string, object: Object): Object;\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": "jest.config.js",
    "content": "module.exports = {\n  transform: {\n    \"^.+\\\\.tsx?$\": \"ts-jest\"\n  },\n  testMatch: [\"**/__tests__/**/*_spec.ts?(x)\", \"**/?(*.)(spec|test).ts?(x)\"],\n  setupFilesAfterEnv: [`${__dirname}/jestFrameworkSetup.js`]\n};\n"
  },
  {
    "path": "jestFrameworkSetup.js",
    "content": "class Request {\n\n}\n\nclass Response {\n\n  constructor(body) {\n    this.body = body;\n    this.ok = true;\n  }\n\n  json() {\n    return Promise.resolve(JSON.parse(this.body));\n  }\n}\n\nconst fetch = () => {\n  return Promise.resolve(new Response());\n};\n\nglobal.Request = Request;\nglobal.Response = Response;\nglobal.fetch = fetch;"
  },
  {
    "path": "md/end.md",
    "content": "# Authors \n\n[@rpunkfu](https://github.com/rpunkfu) - [@zzarcon](https://github.com/zzarcon)"
  },
  {
    "path": "md/start.md",
    "content": "# Kakapo.js <img src=\"https://sdl-stickershop.line.naver.jp/products/0/0/1/1087538/LINEStorePC/main.png?__=20150924\" width=\"40\" height=\"40\" >\n[![Build Status](https://travis-ci.org/devlucky/Kakapo.js.svg?branch=master)](https://travis-ci.org/devlucky/Kakapo.js)\n[![codecov.io](https://codecov.io/github/devlucky/Kakapo.js/coverage.svg?branch=master)](https://codecov.io/github/devlucky/Kakapo.js?branch=master)\n[![npm version](https://badge.fury.io/js/kakapo.svg)](https://npmjs.com/package/kakapo)\n[![dependencies](https://david-dm.org/devlucky/Kakapo.js.svg)](https://david-dm.org/devlucky/Kakapo.js)\n[![npm license](https://img.shields.io/npm/l/awesome-badges.svg)](https://tldrlegal.com/license/mit-license)\n<img src=\"http://benschwarz.github.io/bower-badges/badge@2x.png\" width=\"130\" height=\"25\">\n\n> Next generation mocking framework in Javascript - [docs](http://devlucky.github.io/kakapo-js)\n\n## Contents\n- [Getting started](#getting-started)\n  - [Installation](#installation)\n- [Examples](#examples)\n  - [Basic](#basic)\n  - [Using the DB](#using-the-db)\n  - [Unchaining the Router](#unchaining-the-router)\n  - [Fetch & XMLHttpRequest support](#fetch--xmlhttprequest-support)\n  - [Database candyness](#database-candyness)\n  - [Passthrough](#passthrough)\n- [Demo Apps](#demo-apps)\n  - [TODO App](#todo-app)\n  - [Github explorer](#github-explorer)\n- [Components](#components)\n  - [Server](#server)\n  - [Router](#router)\n  - [Database](#database)\n  - [Response](#response)\n  - [Serializers](#serializers)\n  - [Interceptors](#interceptors)\n  - [Scenarios](#scenarios)\n  - [Fake data](#fake-data)\n- [Browser support](#browser-support)\n- [Roadmap](#roadmap)"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"kakapo\",\n  \"version\": \"4.0.6\",\n  \"description\": \"Next generation mocking framework in Javascript\",\n  \"main\": \"dist/index.js\",\n  \"atlaskit:src\": \"dist/index.js\",\n  \"types\": \"dist/index.d.ts\",\n  \"scripts\": {\n    \"build\": \"tsc -p tsconfig.dist.json\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"readme\": \"node create-readme.js\",\n    \"test\": \"jest\",\n    \"test:ci\": \"jest --runInBand --coverage\",\n    \"test:watch\": \"jest --watch\",\n    \"amend\": \"git add . && git commit --amend --reuse-message=HEAD\",\n    \"push\": \"git push --tags && git push\",\n    \"prepublishOnly\": \"yarn build\",\n    \"release\": \"yarn publish --silent --new-version patch && yarn push\",\n    \"perf:build\": \"yarn build && webpack-cli --config webpack.perf.config.js\",\n    \"perf:stats\": \"webpack-cli --config webpack.perf.config.js --json > perf/dist/stats.json\",\n    \"perf:analyze\": \"webpack-bundle-analyzer perf/dist/stats.json\",\n    \"perf\": \"mkdir -p ./perf/dist && yarn perf:build && yarn perf:stats && yarn perf:analyze\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/devlucky/Kakapo.js.git\"\n  },\n  \"author\": \"devlucky\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/devlucky/Kakapo.js/issues\"\n  },\n  \"homepage\": \"https://github.com/devlucky/Kakapo.js#readme\",\n  \"devDependencies\": {\n    \"@types/faker\": \"^4.1.5\",\n    \"@types/jest\": \"^24.0.12\",\n    \"@types/lodash.filter\": \"^4.6.0\",\n    \"@types/lodash.first\": \"^3.0.0\",\n    \"@types/lodash.foreach\": \"^4.5.0\",\n    \"@types/lodash.includes\": \"^4.3.0\",\n    \"@types/lodash.keys\": \"^4.2.0\",\n    \"@types/lodash.last\": \"^3.0.0\",\n    \"@types/lodash.merge\": \"^4.6.1\",\n    \"@types/lodash.pickby\": \"^4.6.0\",\n    \"@types/lodash.sample\": \"^4.2.1\",\n    \"@typescript-eslint/eslint-plugin\": \"^1.8.0\",\n    \"@typescript-eslint/parser\": \"^1.8.0\",\n    \"eslint\": \"^5.16.0\",\n    \"faker\": \"^3.1.0\",\n    \"jest\": \"^24.8.0\",\n    \"jquery\": \"^2.2.4\",\n    \"superagent\": \"^2.0.0\",\n    \"ts-jest\": \"^24.0.2\",\n    \"ts-loader\": \"^6.0.0\",\n    \"typescript\": \"^3.4.5\",\n    \"webpack\": \"^4.8.1\",\n    \"webpack-bundle-analyzer\": \"^2.11.1\",\n    \"webpack-cli\": \"^2.1.3\"\n  },\n  \"dependencies\": {\n    \"lodash.filter\": \"^4.6.0\",\n    \"lodash.first\": \"^3.0.0\",\n    \"lodash.foreach\": \"^4.5.0\",\n    \"lodash.includes\": \"^4.3.0\",\n    \"lodash.keys\": \"^4.2.0\",\n    \"lodash.last\": \"^3.0.0\",\n    \"lodash.merge\": \"^4.6.1\",\n    \"lodash.pickby\": \"^4.6.0\",\n    \"lodash.sample\": \"^4.2.1\",\n    \"parse-url\": \"^1.3.0\",\n    \"path-match\": \"^1.2.4\",\n    \"query-string\": \"^4.1.0\"\n  },\n  \"keywords\": [\n    \"mocking\",\n    \"framework\",\n    \"kakapo\",\n    \"fetch\",\n    \"XMLHttpRequest\",\n    \"fake\",\n    \"stub\",\n    \"request\"\n  ],\n  \"files\": [\n    \"dist\"\n  ]\n}\n"
  },
  {
    "path": "perf/index.js",
    "content": "const Kakapo=require('../dist');\n\nconsole.log(Kakapo);\n"
  },
  {
    "path": "src/Database/index.ts",
    "content": "import sample from 'lodash.sample';\nimport first from 'lodash.first';\nimport last from 'lodash.last';\nimport filter from 'lodash.filter';\n\ntype DataType = any;\n\nexport interface DatabaseSchema {\n  [collectionName: string]: DataType; // <- DataType in Collection\n}\n\ntype CollectionStore<M extends DatabaseSchema> = {\n  [P in keyof M]?: Collection<M[P]>\n};\n\nexport interface Collection<D extends DataType> {\n  uuid: number;\n  factory: DataFactory<D>;\n  records: DataRecord<D>[];\n}\n\nexport type DataFactory<D extends DataType> = () => D;\n\nexport type RecordId = number;\n\nexport interface DataRecord<D extends DataType> {\n  id: RecordId;\n  data: D;\n}\n\nexport class Database<M extends DatabaseSchema> {\n  private collectionStore: CollectionStore<M>;\n\n  constructor() {\n    this.collectionStore = {};\n  }\n\n  all<K extends keyof M>(collectionName: K): DataRecord<M[K]>[] {\n    const { records } = this.getCollection(collectionName);\n    return records;\n  }\n\n  belongsTo<K extends keyof M>(\n    collectionName: K,\n    conditions: Partial<M[K]>\n  ): () => DataRecord<M[K]> | undefined {\n    return () => {\n      if (conditions) {\n        return this.findOne(collectionName, conditions);\n      } else {\n        return sample(this.all(collectionName));\n      }\n    };\n  }\n\n  create<K extends keyof M>(\n    collectionName: K,\n    size: number = 1,\n    factory?: DataFactory<M[K]>\n  ): DataRecord<M[K]>[] {\n    const dataFactory = factory || this.getCollection(collectionName).factory;\n    const records = [];\n\n    for (let index = 0; index < size; index++) {\n      const data = dataFactory();\n      const record = this.push(collectionName, data);\n      records.push(record);\n    }\n\n    return records;\n  }\n\n  delete<K extends keyof M>(\n    collectionName: K,\n    id: RecordId\n  ): DataRecord<M[K]> | null {\n    const collection = this.getCollection(collectionName);\n    const { records } = collection;\n    const record = records.reduce((result: DataRecord<M[K]> | undefined, record) => record.id === id ? record : result, undefined);\n\n    if (record) {\n      const index = records.indexOf(record);\n      records.splice(index, 1);\n      return record;\n    } else {\n      return null;\n    }\n  }\n\n  exists<K extends keyof M>(collectionName: K): boolean {\n    return !!this.collectionStore[collectionName];\n  }\n\n  find<K extends keyof M>(\n    collectionName: K,\n    conditions: Partial<M[K]>\n  ): DataRecord<M[K]>[] {\n    const { records } = this.getCollection(collectionName);\n    return filter(records, { data: conditions }) as DataRecord<M[K]>[];\n  }\n\n  findOne<K extends keyof M>(\n    collectionName: K,\n    conditions: Partial<M[K]>\n  ): DataRecord<M[K]> | undefined {\n    return first(this.find(collectionName, conditions));\n  }\n\n  first<K extends keyof M>(collectionName: K): DataRecord<M[K]> | undefined {\n    const { records } = this.getCollection(collectionName);\n    return first(records);\n  }\n\n  last<K extends keyof M>(collectionName: K): DataRecord<M[K]> | undefined {\n    const { records } = this.getCollection(collectionName);\n    return last(records);\n  }\n\n  push<K extends keyof M>(\n    collectionName: K,\n    data: M[K]\n  ): DataRecord<M[K]> {\n    const collection = this.getCollection(collectionName);\n    const { uuid, records } = collection;\n    const record = {\n      id: uuid,\n      data\n    };\n\n    records.push(record);\n    collection.uuid++;\n\n    return record;\n  }\n\n  register<K extends keyof M>(\n    collectionName: K,\n    factory: DataFactory<M[K]>\n  ) {\n    this.collectionStore[collectionName] = {\n      uuid: 0,\n      records: [],\n      factory\n    };\n  }\n\n  reset() {\n    this.collectionStore = {};\n  }\n\n  update<K extends keyof M>(\n    collectionName: K,\n    id: RecordId,\n    data: Partial<M[K]>\n  ): DataRecord<M[K]> {\n    const collection = this.getCollection(collectionName);\n    const { records } = collection;\n    const oldRecord = this.delete(collectionName, id);\n\n    if (oldRecord) {\n      const record = {\n        ...oldRecord,\n        data: {\n          ...oldRecord.data,\n          ...data\n        }\n      };\n      records.push(record);\n      return record;\n    } else {\n      throw new RecordNotFoundError(collectionName as string, id);\n    }\n  }\n\n  getCollection<K extends keyof M>(\n    collectionName: K\n  ): Collection<M[K]> {\n    const collection = this.collectionStore[collectionName] as Collection<M[K]> | undefined;\n    if (collection) {\n      return collection;\n    } else {\n      throw new CollectionNotFoundError(collectionName as string);\n    }\n  }\n}\n\nexport class CollectionNotFoundError extends Error {\n  constructor(collectionName: string) {\n    super(`Collection ${collectionName} not found`);\n  }\n}\n\nexport class RecordNotFoundError extends Error {\n  constructor(collectionName: string, id: RecordId) {\n    super(`Record ${id} not found in collection ${collectionName}`);\n  }\n}\n"
  },
  {
    "path": "src/Request/index.ts",
    "content": "export interface KakapoRequestOptions {\n    params: any;\n    query: any;\n    body?: any;\n    headers: any;\n}\n\nexport class KakapoRequest {\n    params: any;\n    query: any;\n    body: any | null;\n    headers: any;\n\n    constructor(options: KakapoRequestOptions) {\n      this.params = options.params || {};\n      this.query = options.query || {};\n      this.body = options.body || null;\n      this.headers = options.headers || {};\n    }\n}\n"
  },
  {
    "path": "src/Response/index.ts",
    "content": "export class KakapoResponse {\n  code: number;\n  body: any;\n  headers: { [header: string]: string };\n\n  constructor(\n    code: number = 200,\n    body: any = {},\n    headers: { [header: string]: string } = {}\n  ) {\n    this.code = code;\n    this.body = body;\n    this.headers = headers;\n  }\n\n  get error() {\n    return this.code >= 400;\n  }\n\n  get ok() {\n    return this.code >= 200 && this.code <= 299;\n  }\n\n  static wrap(response: any): KakapoResponse {\n    if (response instanceof KakapoResponse) {\n      return response;\n    } else {\n      return new KakapoResponse(200, response, {\n        \"content-type\": \"application/json; charset=utf-8\"\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "src/Router/index.ts",
    "content": "import merge from 'lodash.merge';\nimport forEach from 'lodash.foreach';\nimport { interceptors, Interceptors } from '../interceptors';\nimport environment from '../config/environment';\nimport {\n  InterceptorConfig,\n  RouterHandler\n} from '../interceptors/interceptorHelper';\nimport { DatabaseSchema } from '../Database';\n\nconst browserStrategies: (keyof Interceptors)[] = ['fetch', 'XMLHttpRequest'];\n//TODO: find proper name for Node.js strategies\nconst nodeStrategies: (keyof Interceptors)[]  = ['http', 'https'];\nconst routerDefaultConfig: RouterConfig = {\n  strategies: environment.browserEnv ? browserStrategies : nodeStrategies\n};\n\nconst interceptorDefaultConfig: InterceptorConfig<any> = {\n  db: null,\n  host: '',\n  requestDelay: 0,\n  routes: { GET: {}, POST: {}, PUT: {}, DELETE: {}, HEAD: {} }\n};\n\nexport interface RouterConfig {\n    strategies: (keyof Interceptors)[];\n}\n\nexport class Router<M extends DatabaseSchema> {\n    interceptorConfig: InterceptorConfig<M>;\n\n    constructor(\n      interceptorConfig: Partial<InterceptorConfig<M>> = interceptorDefaultConfig,\n      public routerConfig: RouterConfig = routerDefaultConfig\n    ) {\n      this.interceptorConfig = merge(\n        {},\n        interceptorDefaultConfig,\n        interceptorConfig\n      );\n    }\n\n    get(path: string, handler: RouterHandler<M>) {\n      this.register('GET', path, handler);\n    }\n\n    post(path: string, handler: RouterHandler<M>) {\n      this.register('POST', path, handler);\n    }\n\n    put(path: string, handler: RouterHandler<M>) {\n      this.register('PUT', path, handler);\n    }\n\n    delete(path: string, handler: RouterHandler<M>) {\n      this.register('DELETE', path, handler);\n    }\n\n    head(path: string, handler: RouterHandler<M>) {\n      this.register('HEAD', path, handler);\n    }\n\n    register(method: string, path: string, handler: RouterHandler<M>) {\n      this.interceptorConfig.routes[method][path] = handler;\n    }\n\n    intercept() {\n      const strategies = this.routerConfig.strategies;\n\n      forEach(strategies, (name: keyof Interceptors) =>\n        interceptors[name].enable(this.interceptorConfig)\n      );\n    }\n\n    reset() {\n    //TODO: Don't reset all 'interceptors'\n      forEach(interceptors, (interceptor: Interceptors[keyof Interceptors]) => interceptor.disable());\n    }\n}\n"
  },
  {
    "path": "src/Server/index.ts",
    "content": "import { Router } from '../Router';\nimport { Database, DatabaseSchema } from '../Database';\n\nconst isRouter = <M extends DatabaseSchema>(entity: any): entity is Router<M> => entity instanceof Router;\nconst isDb = <M extends DatabaseSchema>(entity: any): entity is Database<M> => entity instanceof Database;\n\nexport class Server<M extends DatabaseSchema> {\n    db: Database<M> | null = null;\n    router: Router<M> | null = null;\n\n    constructor(readonly config: any = {}) {}\n\n    use(entity: Database<M> | Router<M>) {\n      if (isDb(entity)) {\n        this.db = entity;\n      } else if (isRouter(entity)) {\n        this.router = entity;\n        this.router.intercept();\n      } else {\n        console.warn(\n          `KAKAPO: Server doesn't know how to use the entity ${entity}`\n        );\n      }\n\n      this.linkEntities();\n    }\n\n    remove(entity: Database<M> | Router<M>) {\n      if ( isDb(entity) &&\n          this.router &&\n          this.router.interceptorConfig.db === entity\n      ) {\n        this.router.interceptorConfig.db = null;\n      } else if (isRouter(entity) && this.router == entity) {\n        this.router.reset();\n      } else {\n        console.warn(\"KAKAPO: Entity doesn't belongs to server\", entity);\n      }\n    }\n\n    linkEntities() {\n      const router = this.router;\n      const db = this.db;\n\n      if (router && db && router.interceptorConfig.db !== db) {\n        router.interceptorConfig.db = db;\n      }\n    }\n}\n"
  },
  {
    "path": "src/config/environment.ts",
    "content": "declare var global: any;\n\nconst browserEnv = typeof window === 'object';\nconst nodeEnv = typeof global === 'object';\nconst name = browserEnv ? 'browser' : nodeEnv ? 'node' : 'unknown';\n\nexport default {\n  name,\n  browserEnv,\n  nodeEnv\n};\n"
  },
  {
    "path": "src/index.ts",
    "content": "export { Database, DataRecord } from './Database';\nexport { Router, RouterConfig } from './Router';\nexport { Server } from './Server';\nexport { KakapoResponse } from './Response';\nexport { KakapoRequest } from './Request';\nexport { InterceptorConfig, RouterHandler } from './interceptors/interceptorHelper';\n"
  },
  {
    "path": "src/interceptors/fetchInterceptor.ts",
    "content": "import { KakapoResponse } from '../Response';\nimport { KakapoRequest } from '../Request';\nimport {\n  interceptorHelper,\n  Interceptor,\n  InterceptorConfig\n} from './interceptorHelper';\nimport { mapRequestInfoToUrlString, canUseWindow } from '../utils';\nimport { Database, DatabaseSchema } from '../Database';\n\nconst fakeResponse = (\n  response: string | any = {},\n  headers: { [k: string]: string } = {}\n) => {\n  // If content type exist and is different to application/json no parse the response\n  if (\n    headers['content-type'] &&\n        headers['content-type'].indexOf('application/json') == -1\n  ) {\n    return new Response(response, { headers });\n  }\n\n  // Default handler, If no content type response as json.\n  return new Response(JSON.stringify(response), { headers });\n};\n\nexport class FakeFetchFactory<M extends DatabaseSchema> {\n    interceptors: Interceptor<M>[];\n\n    constructor() {\n      this.interceptors = [];\n    }\n\n    use(config: InterceptorConfig<M>) {\n      this.interceptors.push(interceptorHelper(config));\n    }\n\n    getFetch(): typeof fetch {\n      return (\n        requestInfo: RequestInfo,\n        options: RequestInit = {}\n      ): Promise<Response> => {\n        const url = mapRequestInfoToUrlString(requestInfo);\n        const method = options.method || 'GET';\n\n        const interceptor = this.interceptors.reduce(\n          (result: Interceptor<M> | undefined, interceptor) =>\n            interceptor.getHandler(url, method) !== null ? interceptor : result,\n          undefined\n        );\n\n        if (interceptor) {\n          const handler = interceptor.getHandler(url, method);\n\n          if (handler) {\n            const request = new KakapoRequest({\n              params: interceptor.getParams(url, method),\n              query: interceptor.getQuery(url),\n              body: options.body || '',\n              headers: options.headers || {}\n            });\n            const db = interceptor.getDB() || new Database<M>();\n            const response = handler(request, db);\n\n            if (response instanceof Promise) {\n              //TODO: Should we handle 'requestDelay' also for async responses?\n              return response.then(data => {\n                if (data instanceof KakapoResponse) {\n                  return fakeResponse(data.body, data.headers);\n                }\n                return fakeResponse(data)\n              });\n            }\n\n            if (!(response instanceof KakapoResponse)) {\n              return new Promise(resolve =>\n                setTimeout(\n                  () => resolve(fakeResponse(response)),\n                  interceptor.getDelay()\n                )\n              );\n            }\n\n            const result = fakeResponse(response.body, response.headers);\n            return new Promise((resolve, reject) =>\n              setTimeout(() => {\n                if (response.error) {\n                  return reject(result);\n                }\n                return resolve(result);\n              }, interceptor.getDelay())\n            );\n          } else {\n            return nativeFetch(url, options);\n          }\n        } else {\n          return nativeFetch(url, options);\n        }\n      };\n    }\n}\n\nlet nativeFetch: typeof fetch;\n\nexport function isFakeFetch<M extends DatabaseSchema>(fetch: any): fetch is FakeFetchFactory<M> {\n  return window.fetch !== nativeFetch;\n}\n\nconst fakeFetchFactory = new FakeFetchFactory();\n\nexport const enable = <M extends DatabaseSchema>(config: InterceptorConfig<M>) => {\n  if (!canUseWindow) {\n    throw new Error(`You're trying to use fetch interceptor in non-browser environment`);\n  }\n  if (!nativeFetch) {\n    nativeFetch = window.fetch\n  }\n\n  if (!isFakeFetch<M>(window.fetch)) {\n    window.fetch = fakeFetchFactory.getFetch();\n  }\n  fakeFetchFactory.use(config);\n};\n\nexport const disable = () => {\n  window.fetch = nativeFetch;\n};\n"
  },
  {
    "path": "src/interceptors/index.ts",
    "content": "import * as xhrInterceptor from './xhrInterceptor';\nimport * as fetchInterceptor from './fetchInterceptor';\n\nexport interface Interceptors {\n  XMLHttpRequest: typeof xhrInterceptor;\n  fetch: typeof fetchInterceptor;\n  http?: any;\n  https?: any;\n}\n\nexport const interceptors: Interceptors = {\n  XMLHttpRequest: xhrInterceptor,\n  fetch: fetchInterceptor\n};\n"
  },
  {
    "path": "src/interceptors/interceptorHelper.ts",
    "content": "import keys from 'lodash.keys';\nimport includes from 'lodash.includes';\nimport pathMatch from 'path-match';\nimport parseUrl from 'parse-url';\nimport queryString from 'query-string';\nimport { KakapoRequest } from '../Request';\nimport { KakapoResponse } from '../Response';\nimport { Database, DatabaseSchema } from '../Database';\n\nexport type RouterHandler<M extends DatabaseSchema> = (\n    request: KakapoRequest,\n    db: Database<M>\n) => KakapoResponse | any | Promise<KakapoResponse | any>;\n\nexport interface InterceptorConfig<M extends DatabaseSchema> {\n    host: string;\n    routes: { [method: string]: { [path: string]: RouterHandler<M> } };\n    db: Database<M> | null;\n    requestDelay: number;\n}\n\nexport interface UrlDetails {\n    handlers: any;\n    pathname: string;\n    fullpath: string;\n}\n\nconst getRoute = <M extends DatabaseSchema>(\n  { host }: InterceptorConfig<M>,\n  { handlers, pathname, fullpath }: UrlDetails\n) => {\n  const matchesPathname = (path: string) => pathMatch()(path)(pathname);\n  const route = keys(handlers).reduce((result: string | undefined, key: string) => matchesPathname(key) ? key : result, undefined);\n  const hasHost = includes(fullpath, host);\n\n  return route && hasHost ? route : null;\n};\n\nconst extractUrl = <M extends DatabaseSchema>(\n  { routes }: InterceptorConfig<M>,\n  url: string,\n  method: string\n) => ({\n  handlers: routes[method],\n  pathname: parseUrl(url).pathname,\n  fullpath: parseUrl(url).href\n});\n\nexport interface Interceptor<M extends DatabaseSchema> {\n    getDB(): Database<M> | null;\n    getDelay(): number;\n    getHandler(url: string, method: string): RouterHandler<M> | null;\n    getParams(url: string, method: string): any;\n    getQuery(url: string): any;\n}\n\nexport const interceptorHelper = <M extends DatabaseSchema>(config: InterceptorConfig<M>): Interceptor<M> => ({\n  getDB() {\n    return config.db;\n  },\n  getDelay() {\n    return config.requestDelay;\n  },\n  getHandler(url, method) {\n    const extractedUrl = extractUrl(config, url, method);\n    const route = getRoute(config, extractedUrl);\n\n    return route ? extractedUrl.handlers[route] : null;\n  },\n  getParams(url, method) {\n    const extractedUrl = extractUrl(config, url, method);\n    const matchesPathname = (path: string) => pathMatch()(path)(extractedUrl.pathname);\n    const route = getRoute(config, extractedUrl);\n\n    return route ? matchesPathname(route) : null;\n  },\n  getQuery(url) {\n    return queryString.parse(parseUrl(url).search);\n  }\n});\n"
  },
  {
    "path": "src/interceptors/xhrInterceptor.ts",
    "content": "import { KakapoResponse } from '../Response';\nimport { KakapoRequest } from '../Request';\nimport {\n  Interceptor,\n  InterceptorConfig,\n  interceptorHelper\n} from './interceptorHelper';\nimport { canUseWindow } from '../utils';\nimport { DatabaseSchema } from '../Database';\n\ntype ProgressEventType = keyof XMLHttpRequestEventTargetEventMap;\ntype ProgressEventHandler<K extends ProgressEventType> = (\n    event: XMLHttpRequestEventTargetEventMap[K]\n) => any;\ntype ProgressEventListener<K extends ProgressEventType> =\n  | { handleEvent: ProgressEventHandler<K> }\n  | ProgressEventHandler<K>;\n\nconst hasHandleEvent = <K extends ProgressEventType>(\n  listener: ProgressEventListener<K>\n): listener is { handleEvent: ProgressEventHandler<K> } =>\n    'handleEvent' in listener;\n\nclass FakeXMLHttpRequest<M extends DatabaseSchema> {\n\n    interceptors: Interceptor<M>[];\n\n    constructor() {\n      this.interceptors = [];\n    }\n\n    use(config: InterceptorConfig<M>) {\n      this.interceptors.push(interceptorHelper(config));\n    }\n\n    shouldIntercept(method: string, url: string): boolean {\n      return this.interceptors.some(\n        interceptor => !!interceptor.getHandler(url, method)\n      );\n    }\n\n    static UNSENT = 0;\n    static OPENED = 1;\n    static HEADERS_RECEIVED = 2;\n    static LOADING = 3;\n    static DONE = 4;\n\n    timeout: number | undefined;\n    // withCredentials: boolean;\n    // msCaching: string;\n\n    _method: string | undefined;\n    _url: string | undefined;\n\n    open(\n      method: string,\n      url: string,\n      async?: boolean,\n      user?: string,\n      password?: string\n    ): void {\n      this._method = method;\n      this._url = url;\n      this._readyState = FakeXMLHttpRequest.OPENED;\n    }\n\n    // responseBody: any;\n\n    _status: number = 0;\n    get status(): number {\n      return this._status;\n    }\n\n    _readyState: number = FakeXMLHttpRequest.UNSENT;\n    get readyState(): number {\n      return this._readyState;\n    }\n    // responseXML: any;\n    // responseURL: string;\n    // statusText: string;\n\n    _setReadyState(readyState: number): void {\n      this._readyState = readyState;\n      if (this.onreadystatechange) {\n        this.onreadystatechange(new Event('readystatechange'));\n      }\n    }\n\n    _response: any;\n    get response(): any {\n      return this._response;\n    }\n\n    get responseText(): string {\n      return this.response;\n    }\n\n    responseType:\n    | undefined\n    | void\n    | ''\n    | 'arraybuffer'\n    | 'blob'\n    | 'document'\n    | 'json'\n    | 'text';\n\n    _requestHeaders: { [header: string]: string } = {};\n    setRequestHeader(header: string, value: string): void {\n      this._requestHeaders[header] = value;\n    }\n\n    _responseHeaders: { [header: string]: string } = {};\n    // getAllResponseHeaders(): string;\n    getResponseHeader(header: string): string {\n      return this._responseHeaders[header];\n    }\n\n    send(data?: any): void {\n      const { _method: method, _url: url } = this;\n      const interceptors = this.interceptors.filter(\n        interceptor => url && method && !!interceptor.getHandler(url, method)\n      );\n\n      if (interceptors.length > 0) {\n        interceptors.forEach(interceptor => {\n          if (url && method) {\n            const handler = interceptor.getHandler(url, method);\n            const db = interceptor.getDB();\n\n            if (handler && db) {\n              const delay = interceptor.getDelay();\n\n              const request = new KakapoRequest({\n                params: interceptor.getParams(url, method),\n                query: interceptor.getQuery(url),\n                body: data,\n                headers: this._requestHeaders\n              });\n              // Wrapping handler into a promise to add promise support for free\n              const responsePromise = Promise.resolve(handler(request, db));\n\n              responsePromise.then(result => {\n                const response = KakapoResponse.wrap(result);\n                if (delay) {\n                  setTimeout(() => this._handleResponse(response), delay);\n                } else {\n                  this._handleResponse(response);\n                }\n              });\n            }\n          }\n        });\n      } else {\n        this.nativeSend(data);\n      }\n    }\n\n    _handleResponse({ code, headers, body }: KakapoResponse): void {\n      const { 'content-type': contentType } = headers;\n\n      this._status = code;\n      this._responseHeaders = headers;\n\n      if (this.responseType === 'blob') {\n        if (body instanceof Blob) {\n          this._response = body;\n        } else {\n          this._response = new Blob([body]);\n        }\n      } else {\n        this._response = JSON.stringify(body);\n      }\n\n      this._setReadyState(FakeXMLHttpRequest.DONE);\n\n      const loadEvent = new ProgressEvent('load');\n      if (this.onload) {\n        this.onload(loadEvent);\n      }\n      this._listeners['load'].forEach(listener => {\n        if (hasHandleEvent(listener)) {\n          listener.handleEvent(loadEvent);\n        } else {\n          listener(loadEvent);\n        }\n      });\n    }\n\n    // abort(): void;\n\n    // msCachingEnabled(): boolean;\n    // overrideMimeType(mime: string): void;\n\n    _listeners: { [type in ProgressEventType]: ProgressEventListener<type>[] } = {\n      abort: [],\n      error: [],\n      load: [],\n      loadend: [],\n      loadstart: [],\n      progress: [],\n      timeout: []\n    };\n\n    addEventListener<K extends ProgressEventType>(\n      type: ProgressEventType,\n      listener: ProgressEventListener<K>\n    ): void {\n      this._listeners[type].push(listener);\n    }\n\n    removeEventListener<K extends ProgressEventType>(\n      type: ProgressEventType,\n      listener: ProgressEventListener<K>\n    ): void {\n      const index = this._listeners[type].indexOf(listener);\n      if (index >= 0) {\n        this._listeners[type].splice(index, 1);\n      }\n    }\n\n    upload: XMLHttpRequestEventTarget = new (window as any).XMLHttpRequestEventTarget();\n\n    onabort: ProgressEventHandler<'abort'> | undefined;\n    onerror: ProgressEventHandler<'error'> | undefined;\n    onload: ProgressEventHandler<'load'> | undefined;\n    onloadend: ProgressEventHandler<'loadend'> | undefined;\n    onloadstart: ProgressEventHandler<'loadstart'> | undefined;\n    onprogress: ProgressEventHandler<'progress'> | undefined;\n    ontimeout: ProgressEventHandler<'timeout'> | undefined;\n\n    onreadystatechange: ((ev: Event) => any) | undefined;\n\n    nativeSend(data?: any): void {\n      const request = new NativeXMLHttpRequest();\n\n      if (this.timeout) {\n        request.timeout = this.timeout;\n      }\n      request.onload = () => {\n        const headers = request\n          .getAllResponseHeaders()\n          .split('\\r\\n')\n          .reduce((previous, current) => {\n            const [header, value] = current.split(': ');\n            return {\n              ...previous,\n              [header]: value\n            };\n          }, {});\n        const response = new KakapoResponse(\n          request.status,\n          request.response,\n          headers\n        );\n        this._handleResponse(response);\n      };\n\n      if (this._method && this._url) {\n        request.open(this._method, this._url);\n        request.send(data);\n      }\n    }\n}\n\ninterface AddEventListenerOptions {\n    capture?: boolean;\n    once?: boolean;\n    passive?: boolean;\n}\n\nclass FakeXMLHttpRequestEventTarget {\n  addEventListener(\n    type: string,\n    listener: Function,\n    useCaptureOrOptions: boolean | AddEventListenerOptions = false\n  ) {\n    // do nothing for now\n  }\n}\n\nlet NativeXMLHttpRequest: typeof XMLHttpRequest;\nlet NativeXMLHttpRequestEventTarget: typeof XMLHttpRequestEventTarget;\n\nexport const enable = <M extends DatabaseSchema>(config: InterceptorConfig<M>) => {\n  if (!canUseWindow) {\n    throw new Error(\n      `You're trying to use XHR interceptor in non-browser environment`\n    );\n  }\n  if (!NativeXMLHttpRequest || !NativeXMLHttpRequestEventTarget) {\n    NativeXMLHttpRequest = XMLHttpRequest;\n    NativeXMLHttpRequestEventTarget = XMLHttpRequestEventTarget;\n  }\n\n  (window as any).XMLHttpRequest = function () {\n    const fakeXMLHttpRequest = new FakeXMLHttpRequest();\n    fakeXMLHttpRequest.use(config);\n    return fakeXMLHttpRequest;\n  };\n  (window as any).XMLHttpRequestEventTarget = FakeXMLHttpRequestEventTarget;\n};\n\nexport const disable = () => {\n  (window as any).XMLHttpRequest = NativeXMLHttpRequest;\n  (window as any).XMLHttpRequestEventTarget = NativeXMLHttpRequestEventTarget;\n};\n"
  },
  {
    "path": "src/serializers/index.ts",
    "content": "export * from './json-api';\n"
  },
  {
    "path": "src/serializers/json-api.ts",
    "content": "import pickBy from 'lodash.pickby';\n\n// @TODO (zzarcon): Implement 'included' support after relationships\nexport const JSONApiSerializer = (record: any, type: any = null) => {\n  const id = record.id;\n  const included: any[] = [];\n  const relationships = {};\n  const serializedRecord = pickBy(\n    record,\n    (_value: any, key: string) => key !== 'id'\n  );\n\n  return {\n    data: {\n      id,\n      attributes: serializedRecord,\n      relationships,\n      type\n    },\n    included\n  };\n};\n"
  },
  {
    "path": "src/utils.ts",
    "content": "export function mapRequestInfoToUrlString(requestInfo: RequestInfo): string {\n  if (requestInfo instanceof Request) {\n    return requestInfo.url;\n  } else {\n    return requestInfo;\n  }\n}\n\nexport const canUseWindow = typeof window !== 'undefined';"
  },
  {
    "path": "tsconfig.dist.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"compilerOptions\": {\n    \"baseUrl\": \"./src\"\n  },\n  \"include\": [\n    \"src/**/*\",\n    \"typings\"\n  ]\n}\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"strict\": true,\n    \"noImplicitAny\": true,\n    \"removeComments\": true,\n    \"target\": \"es5\",\n    \"lib\": [\n      \"dom\",\n      \"es5\",\n      \"scripthost\",\n      \"es2015.collection\",\n      \"es2015.symbol\",\n      \"es2015.iterable\",\n      \"es2015.promise\"\n    ],\n    \"esModuleInterop\": true,\n    \"allowJs\": false,\n    \"declaration\": true,\n    \"outDir\": \"dist\",\n    \"noEmitOnError\": true\n  },\n  \"include\": [\n    \"src/**/*\",\n    \"typings/**/*\",\n    \"__tests__/**/*\"\n  ]\n}\n"
  },
  {
    "path": "typings/parse-url/index.d.ts",
    "content": "declare module 'parse-url';"
  },
  {
    "path": "typings/path-match/index.d.ts",
    "content": "declare module 'path-match'"
  },
  {
    "path": "typings/query-string/index.d.ts",
    "content": "declare module 'query-string';"
  },
  {
    "path": "webpack.config.js",
    "content": "module.exports = {\n  entry: './src',\n  output: {\n    path: './lib',\n    filename: 'kakapo.js',\n    publicPath: '/'\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.tsx?$/,\n        loader: 'ts-loader',\n        include: __dirname,\n        exclude: /node_modules/\n      },\n      {\n        test: /\\.json$/,\n        loader: 'json-loader'\n      }\n    ]\n  }\n};\n"
  },
  {
    "path": "webpack.perf.config.js",
    "content": "const path = require('path');\n\nmodule.exports = {\n  mode: 'development',\n  entry: path.resolve(__dirname, './perf/index.js'),\n  output: {\n    filename: './perf/dist/bundle.js',\n  },\n  resolve: {\n    extensions: [\".js\", \".jsx\", \".ts\", \".tsx\"]\n  },\n  module: {\n    rules: [\n      {\n        test: /\\.tsx?$/,\n        loader: 'ts-loader',\n        include: __dirname,\n        exclude: [/node_modules/]\n      },\n    ]\n  }\n};\n"
  }
]