From 11019465a18e9863dc7a9dafee16f17f00ae9f18 Mon Sep 17 00:00:00 2001 From: "UIRP.Hetzner" Date: Sat, 5 Apr 2025 21:15:53 +0000 Subject: [PATCH] Init server --- .replxx_history | 0 icon.png | Bin 0 -> 3789 bytes readme.md | 19 + .../[maps]/fivem-map-hipster/fxmanifest.lua | 14 + .../[maps]/fivem-map-hipster/map.lua | 63 + .../[maps]/fivem-map-skater/fxmanifest.lua | 14 + .../[maps]/fivem-map-skater/map.lua | 62 + .../[maps]/redm-map-one/fxmanifest.lua | 16 + .../[gamemodes]/[maps]/redm-map-one/map.lua | 2 + .../basic-gamemode/basic_client.lua | 4 + .../[gamemodes]/basic-gamemode/fxmanifest.lua | 14 + .../money-fountain-example-map/fxmanifest.lua | 14 + .../money-fountain-example-map/map.lua | 4 + .../[examples]/money-fountain/client.lua | 101 + .../[examples]/money-fountain/fxmanifest.lua | 22 + .../[examples]/money-fountain/mapdata.lua | 28 + .../[examples]/money-fountain/server.lua | 107 + .../[gameplay]/[examples]/money/client.lua | 30 + .../[examples]/money/fxmanifest.lua | 16 + .../[gameplay]/[examples]/money/server.lua | 119 + .../[examples]/ped-money-drops/client.lua | 41 + .../[examples]/ped-money-drops/fxmanifest.lua | 15 + .../[examples]/ped-money-drops/server.lua | 42 + .../[gameplay]/chat-theme-gtao/fxmanifest.lua | 21 + .../[gameplay]/chat-theme-gtao/shadow.js | 74 + .../[gameplay]/chat-theme-gtao/style.css | 141 + resources/[gameplay]/chat/.gitignore | 4 + resources/[gameplay]/chat/README.md | 1 + resources/[gameplay]/chat/cl_chat.lua | 308 + resources/[gameplay]/chat/fxmanifest.lua | 30 + resources/[gameplay]/chat/html/App.ts | 467 + resources/[gameplay]/chat/html/App.vue | 44 + resources/[gameplay]/chat/html/Message.ts | 102 + resources/[gameplay]/chat/html/Message.vue | 7 + resources/[gameplay]/chat/html/Suggestions.ts | 63 + .../[gameplay]/chat/html/Suggestions.vue | 29 + resources/[gameplay]/chat/html/config.ts | 17 + resources/[gameplay]/chat/html/index.css | 160 + resources/[gameplay]/chat/html/index.d.ts | 4 + resources/[gameplay]/chat/html/index.html | 14 + resources/[gameplay]/chat/html/main.ts | 7 + resources/[gameplay]/chat/html/tsconfig.json | 18 + resources/[gameplay]/chat/html/utils.ts | 31 + .../chat/html/vendor/animate.3.5.2.min.css | 11 + .../html/vendor/flexboxgrid.6.3.1.min.css | 1 + .../chat/html/vendor/fonts/LatoBold.woff2 | Bin 0 -> 5084 bytes .../chat/html/vendor/fonts/LatoBold2.woff2 | Bin 0 -> 22656 bytes .../chat/html/vendor/fonts/LatoLight.woff2 | Bin 0 -> 5364 bytes .../chat/html/vendor/fonts/LatoLight2.woff2 | Bin 0 -> 23012 bytes .../chat/html/vendor/fonts/LatoRegular.woff2 | Bin 0 -> 5148 bytes .../chat/html/vendor/fonts/LatoRegular2.woff2 | Bin 0 -> 23216 bytes .../[gameplay]/chat/html/vendor/latofonts.css | 48 + resources/[gameplay]/chat/package.json | 24 + resources/[gameplay]/chat/sv_chat.lua | 293 + resources/[gameplay]/chat/webpack.config.js | 45 + resources/[gameplay]/chat/yarn.lock | 4549 + .../[gameplay]/player-data/fxmanifest.lua | 16 + resources/[gameplay]/player-data/server.lua | 222 + .../[gameplay]/playernames/fxmanifest.lua | 36 + .../playernames/playernames_api.lua | 80 + .../[gameplay]/playernames/playernames_cl.lua | 191 + .../[gameplay]/playernames/playernames_sv.lua | 46 + .../[gameplay]/playernames/template/LICENSE | 27 + .../playernames/template/template.lua | 478 + resources/[local]/.gitkeep | 0 .../[managers]/mapmanager/fxmanifest.lua | 30 + .../mapmanager/mapmanager_client.lua | 108 + .../mapmanager/mapmanager_server.lua | 331 + .../mapmanager/mapmanager_shared.lua | 87 + .../[managers]/spawnmanager/fxmanifest.lua | 14 + .../[managers]/spawnmanager/spawnmanager.lua | 386 + .../[system]/[builders]/webpack/.gitignore | 2 + .../[builders]/webpack/fxmanifest.lua | 13 + .../[system]/[builders]/webpack/package.json | 16 + .../[builders]/webpack/webpack_builder.js | 173 + .../[builders]/webpack/webpack_runner.js | 75 + .../[system]/[builders]/webpack/yarn.lock | 2325 + .../[system]/[builders]/yarn/fxmanifest.lua | 12 + .../[system]/[builders]/yarn/yarn_builder.js | 81 + .../[system]/[builders]/yarn/yarn_cli.js | 147392 +++++++++++++++ resources/[system]/baseevents/deathevents.lua | 73 + resources/[system]/baseevents/fxmanifest.lua | 14 + resources/[system]/baseevents/server.lua | 19 + .../[system]/baseevents/vehiclechecker.lua | 57 + resources/[system]/hardcap/client.lua | 11 + resources/[system]/hardcap/fxmanifest.lua | 14 + resources/[system]/hardcap/server.lua | 31 + resources/[system]/rconlog/fxmanifest.lua | 15 + resources/[system]/rconlog/rconlog_client.lua | 25 + resources/[system]/rconlog/rconlog_server.lua | 84 + resources/[system]/runcode/.gitignore | 1 + resources/[system]/runcode/fxmanifest.lua | 24 + resources/[system]/runcode/runcode.js | 11 + resources/[system]/runcode/runcode_cl.lua | 15 + resources/[system]/runcode/runcode_shared.lua | 32 + resources/[system]/runcode/runcode_sv.lua | 42 + resources/[system]/runcode/runcode_ui.lua | 66 + resources/[system]/runcode/runcode_web.lua | 192 + resources/[system]/runcode/web/index.html | 486 + resources/[system]/runcode/web/nui.html | 60 + .../[system]/sessionmanager-rdr3/.gitignore | 2 + .../sessionmanager-rdr3/fxmanifest.lua | 17 + .../[system]/sessionmanager-rdr3/package.json | 6 + .../[system]/sessionmanager-rdr3/rline.proto | 192 + .../[system]/sessionmanager-rdr3/sm_server.js | 328 + .../[system]/sessionmanager-rdr3/yarn.lock | 90 + .../[system]/sessionmanager/client/empty.lua | 3 + .../[system]/sessionmanager/fxmanifest.lua | 13 + .../sessionmanager/server/host_lock.lua | 69 + .../[test]/example-loadscreen/bankgothic.ttf | Bin 0 -> 36272 bytes .../[test]/example-loadscreen/fxmanifest.lua | 19 + .../[test]/example-loadscreen/index.html | 77 + resources/[test]/example-loadscreen/keks.css | 151 + .../[test]/example-loadscreen/loadscreen.jpg | Bin 0 -> 289433 bytes resources/[test]/fivem/fxmanifest.lua | 13 + run.sh | 10 + server.cfg | 62 + start.sh | 2 + txData/admins.json | 1 + txData/dev_server/config.json | 9 + txData/dev_server/data/cachedData.json | 1 + txData/dev_server/data/configChangelog.json | 1 + txData/dev_server/data/playersDB.backup.json | 1 + txData/dev_server/data/playersDB.json | 1 + txData/dev_server/data/stats_playerDrop.json | 1 + txData/dev_server/data/stats_svRuntime.json | 1 + txData/dev_server/logs/admin.log | 23 + txData/dev_server/logs/fxserver.log | 505 + txData/dev_server/logs/server.log | 16 + 129 files changed, 162287 insertions(+) create mode 100644 .replxx_history create mode 100644 icon.png create mode 100644 readme.md create mode 100644 resources/[gamemodes]/[maps]/fivem-map-hipster/fxmanifest.lua create mode 100644 resources/[gamemodes]/[maps]/fivem-map-hipster/map.lua create mode 100644 resources/[gamemodes]/[maps]/fivem-map-skater/fxmanifest.lua create mode 100644 resources/[gamemodes]/[maps]/fivem-map-skater/map.lua create mode 100644 resources/[gamemodes]/[maps]/redm-map-one/fxmanifest.lua create mode 100644 resources/[gamemodes]/[maps]/redm-map-one/map.lua create mode 100644 resources/[gamemodes]/basic-gamemode/basic_client.lua create mode 100644 resources/[gamemodes]/basic-gamemode/fxmanifest.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain-example-map/fxmanifest.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain-example-map/map.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain/client.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain/fxmanifest.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain/mapdata.lua create mode 100644 resources/[gameplay]/[examples]/money-fountain/server.lua create mode 100644 resources/[gameplay]/[examples]/money/client.lua create mode 100644 resources/[gameplay]/[examples]/money/fxmanifest.lua create mode 100644 resources/[gameplay]/[examples]/money/server.lua create mode 100644 resources/[gameplay]/[examples]/ped-money-drops/client.lua create mode 100644 resources/[gameplay]/[examples]/ped-money-drops/fxmanifest.lua create mode 100644 resources/[gameplay]/[examples]/ped-money-drops/server.lua create mode 100644 resources/[gameplay]/chat-theme-gtao/fxmanifest.lua create mode 100644 resources/[gameplay]/chat-theme-gtao/shadow.js create mode 100644 resources/[gameplay]/chat-theme-gtao/style.css create mode 100644 resources/[gameplay]/chat/.gitignore create mode 100644 resources/[gameplay]/chat/README.md create mode 100644 resources/[gameplay]/chat/cl_chat.lua create mode 100644 resources/[gameplay]/chat/fxmanifest.lua create mode 100644 resources/[gameplay]/chat/html/App.ts create mode 100644 resources/[gameplay]/chat/html/App.vue create mode 100644 resources/[gameplay]/chat/html/Message.ts create mode 100644 resources/[gameplay]/chat/html/Message.vue create mode 100644 resources/[gameplay]/chat/html/Suggestions.ts create mode 100644 resources/[gameplay]/chat/html/Suggestions.vue create mode 100644 resources/[gameplay]/chat/html/config.ts create mode 100644 resources/[gameplay]/chat/html/index.css create mode 100644 resources/[gameplay]/chat/html/index.d.ts create mode 100644 resources/[gameplay]/chat/html/index.html create mode 100644 resources/[gameplay]/chat/html/main.ts create mode 100644 resources/[gameplay]/chat/html/tsconfig.json create mode 100644 resources/[gameplay]/chat/html/utils.ts create mode 100644 resources/[gameplay]/chat/html/vendor/animate.3.5.2.min.css create mode 100644 resources/[gameplay]/chat/html/vendor/flexboxgrid.6.3.1.min.css create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoBold.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoBold2.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoLight.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoLight2.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoRegular.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/fonts/LatoRegular2.woff2 create mode 100644 resources/[gameplay]/chat/html/vendor/latofonts.css create mode 100644 resources/[gameplay]/chat/package.json create mode 100644 resources/[gameplay]/chat/sv_chat.lua create mode 100644 resources/[gameplay]/chat/webpack.config.js create mode 100644 resources/[gameplay]/chat/yarn.lock create mode 100644 resources/[gameplay]/player-data/fxmanifest.lua create mode 100644 resources/[gameplay]/player-data/server.lua create mode 100644 resources/[gameplay]/playernames/fxmanifest.lua create mode 100644 resources/[gameplay]/playernames/playernames_api.lua create mode 100644 resources/[gameplay]/playernames/playernames_cl.lua create mode 100644 resources/[gameplay]/playernames/playernames_sv.lua create mode 100644 resources/[gameplay]/playernames/template/LICENSE create mode 100644 resources/[gameplay]/playernames/template/template.lua create mode 100644 resources/[local]/.gitkeep create mode 100644 resources/[managers]/mapmanager/fxmanifest.lua create mode 100644 resources/[managers]/mapmanager/mapmanager_client.lua create mode 100644 resources/[managers]/mapmanager/mapmanager_server.lua create mode 100644 resources/[managers]/mapmanager/mapmanager_shared.lua create mode 100644 resources/[managers]/spawnmanager/fxmanifest.lua create mode 100644 resources/[managers]/spawnmanager/spawnmanager.lua create mode 100644 resources/[system]/[builders]/webpack/.gitignore create mode 100644 resources/[system]/[builders]/webpack/fxmanifest.lua create mode 100644 resources/[system]/[builders]/webpack/package.json create mode 100644 resources/[system]/[builders]/webpack/webpack_builder.js create mode 100644 resources/[system]/[builders]/webpack/webpack_runner.js create mode 100644 resources/[system]/[builders]/webpack/yarn.lock create mode 100644 resources/[system]/[builders]/yarn/fxmanifest.lua create mode 100644 resources/[system]/[builders]/yarn/yarn_builder.js create mode 100644 resources/[system]/[builders]/yarn/yarn_cli.js create mode 100644 resources/[system]/baseevents/deathevents.lua create mode 100644 resources/[system]/baseevents/fxmanifest.lua create mode 100644 resources/[system]/baseevents/server.lua create mode 100644 resources/[system]/baseevents/vehiclechecker.lua create mode 100644 resources/[system]/hardcap/client.lua create mode 100644 resources/[system]/hardcap/fxmanifest.lua create mode 100644 resources/[system]/hardcap/server.lua create mode 100644 resources/[system]/rconlog/fxmanifest.lua create mode 100644 resources/[system]/rconlog/rconlog_client.lua create mode 100644 resources/[system]/rconlog/rconlog_server.lua create mode 100644 resources/[system]/runcode/.gitignore create mode 100644 resources/[system]/runcode/fxmanifest.lua create mode 100644 resources/[system]/runcode/runcode.js create mode 100644 resources/[system]/runcode/runcode_cl.lua create mode 100644 resources/[system]/runcode/runcode_shared.lua create mode 100644 resources/[system]/runcode/runcode_sv.lua create mode 100644 resources/[system]/runcode/runcode_ui.lua create mode 100644 resources/[system]/runcode/runcode_web.lua create mode 100644 resources/[system]/runcode/web/index.html create mode 100644 resources/[system]/runcode/web/nui.html create mode 100644 resources/[system]/sessionmanager-rdr3/.gitignore create mode 100644 resources/[system]/sessionmanager-rdr3/fxmanifest.lua create mode 100644 resources/[system]/sessionmanager-rdr3/package.json create mode 100644 resources/[system]/sessionmanager-rdr3/rline.proto create mode 100644 resources/[system]/sessionmanager-rdr3/sm_server.js create mode 100644 resources/[system]/sessionmanager-rdr3/yarn.lock create mode 100644 resources/[system]/sessionmanager/client/empty.lua create mode 100644 resources/[system]/sessionmanager/fxmanifest.lua create mode 100644 resources/[system]/sessionmanager/server/host_lock.lua create mode 100644 resources/[test]/example-loadscreen/bankgothic.ttf create mode 100644 resources/[test]/example-loadscreen/fxmanifest.lua create mode 100644 resources/[test]/example-loadscreen/index.html create mode 100644 resources/[test]/example-loadscreen/keks.css create mode 100644 resources/[test]/example-loadscreen/loadscreen.jpg create mode 100644 resources/[test]/fivem/fxmanifest.lua create mode 100755 run.sh create mode 100644 server.cfg create mode 100755 start.sh create mode 100644 txData/admins.json create mode 100644 txData/dev_server/config.json create mode 100644 txData/dev_server/data/cachedData.json create mode 100644 txData/dev_server/data/configChangelog.json create mode 100644 txData/dev_server/data/playersDB.backup.json create mode 100644 txData/dev_server/data/playersDB.json create mode 100644 txData/dev_server/data/stats_playerDrop.json create mode 100644 txData/dev_server/data/stats_svRuntime.json create mode 100644 txData/dev_server/logs/admin.log create mode 100644 txData/dev_server/logs/fxserver.log create mode 100644 txData/dev_server/logs/server.log diff --git a/.replxx_history b/.replxx_history new file mode 100644 index 0000000..e69de29 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbebd4c0bd1ca579792ccca1b97526c38468741 GIT binary patch literal 3789 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 D<60a< literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..3efc856 --- /dev/null +++ b/readme.md @@ -0,0 +1,19 @@ +

UIRP Legacy

+ + +- [x] Character Customization +- [x] Escape Menu +- [ ] Loading Screen +- [ ] Multicharacter UI Update + - [ ] Multicharacter Integration with illenium +- [ ] Police Job +- [ ] EMS Job +- [ ] Fishing +- [ ] Mining +- [ ] Banking +- [ ] Dispatch +- [ ] Mechanic +- [ ] Vehicle Ownership + Persistance +- [ ] Crafting System +- [ ] Chat Change to Production +- [ ] Doors & Other Accessories \ No newline at end of file diff --git a/resources/[gamemodes]/[maps]/fivem-map-hipster/fxmanifest.lua b/resources/[gamemodes]/[maps]/fivem-map-hipster/fxmanifest.lua new file mode 100644 index 0000000..aec55b6 --- /dev/null +++ b/resources/[gamemodes]/[maps]/fivem-map-hipster/fxmanifest.lua @@ -0,0 +1,14 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Example spawn points for FiveM with a "hipster" model.' +repository 'https://github.com/citizenfx/cfx-server-data' + +resource_type 'map' { gameTypes = { ['basic-gamemode'] = true } } + +map 'map.lua' + +fx_version 'adamant' +game 'gta5' diff --git a/resources/[gamemodes]/[maps]/fivem-map-hipster/map.lua b/resources/[gamemodes]/[maps]/fivem-map-hipster/map.lua new file mode 100644 index 0000000..be81831 --- /dev/null +++ b/resources/[gamemodes]/[maps]/fivem-map-hipster/map.lua @@ -0,0 +1,63 @@ +vehicle_generator "airtug" { -54.26639938354492, -1679.548828125, 28.4414, heading = 228.2736053466797 } + +spawnpoint 'a_m_y_hipster_01' { x = -802.311, y = 175.056, z = 72.8446 } +spawnpoint 'a_m_y_hipster_02' { x = -9.96562, y = -1438.54, z = 31.1015 } +spawnpoint 'a_m_y_hipster_01' { x = 0.916756, y = 528.485, z = 174.628 } +spawnpoint 'a_m_y_hipster_01' { x = -181.615, y = 852.8, z = 232.701 } +spawnpoint 'a_m_y_hipster_02' { x = 657.723, y = 457.342, z = 144.641 } +spawnpoint 'a_m_y_hipster_01' { x = 134.387, y = 1150.31, z = 231.594 } +spawnpoint 'a_m_y_hipster_02' { x = 726.14, y = 1196.91, z = 326.262 } +spawnpoint 'a_m_y_hipster_01' { x = 740.792, y = 1283.62, z = 360.297 } +spawnpoint 'a_m_y_hipster_02' { x = -437.009, y = 1059.59, z = 327.331 } +spawnpoint 'a_m_y_hipster_01' { x = -428.771, y = 1596.8, z = 356.338 } +spawnpoint 'a_m_y_hipster_02' { x = -1348.78, y = 723.87, z = 186.45 } +spawnpoint 'a_m_y_hipster_01' { x = -1543.24, y = 830.069, z = 182.132 } +spawnpoint 'a_m_y_hipster_02' { x = -2150.48, y = 222.019, z = 184.602 } +spawnpoint 'a_m_y_hipster_01' { x = -3032.13, y = 22.2157, z = 10.1184 } +spawnpoint 'a_m_y_hipster_02' { x = 3063.97, y = 5608.88, z = 209.245 } +spawnpoint 'a_m_y_hipster_01' { x = -2614.35, y = 1872.49, z = 167.32 } +spawnpoint 'a_m_y_hipster_02' { x = -1873.94, y = 2088.73, z = 140.994 } +spawnpoint 'a_m_y_hipster_01' { x = -597.177, y = 2092.16, z = 131.413 } +spawnpoint 'a_m_y_hipster_02' { x = 967.126, y = 2226.99, z = 54.0588 } +spawnpoint 'a_m_y_hipster_01' { x = -338.043, y = 2829, z = 56.0871 } +spawnpoint 'a_m_y_hipster_02' { x = 1082.25, y = -696.921, z = 58.0099 } +spawnpoint 'a_m_y_hipster_01' { x = 1658.31, y = -13.9234, z = 169.992 } +spawnpoint 'a_m_y_hipster_02' { x = 2522.98, y = -384.436, z = 92.9928 } +spawnpoint 'a_m_y_hipster_01' { x = 2826.27, y = -656.489, z = 1.87841 } +spawnpoint 'a_m_y_hipster_02' { x = 2851.12, y = 1467.5, z = 24.5554 } +spawnpoint 'a_m_y_hipster_01' { x = 2336.33, y = 2535.39, z = 46.5177 } +spawnpoint 'a_m_y_hipster_02' { x = 2410.46, y = 3077.88, z = 48.1529 } +spawnpoint 'a_m_y_hipster_01' { x = 2451.15, y = 3768.37, z = 41.3477 } +spawnpoint 'a_m_y_hipster_02' { x = 3337.78, y = 5174.8, z = 18.2108 } +spawnpoint 'a_m_y_hipster_01' { x = -1119.33, y = 4978.52, z = 186.26 } +spawnpoint 'a_m_y_hipster_02' { x = 2877.3, y = 5911.57, z = 369.618 } +spawnpoint 'a_m_y_hipster_01' { x = 2942.1, y = 5306.73, z = 101.52 } +spawnpoint 'a_m_y_hipster_02' { x = 2211.29, y = 5577.94, z = 53.872 } +spawnpoint 'a_m_y_hipster_01' { x = 1602.39, y = 6623.02, z = 15.8417 } +spawnpoint 'a_m_y_hipster_02' { x = 66.0113, y = 7203.58, z = 3.16 } +spawnpoint 'a_m_y_hipster_01' { x = -219.201, y = 6562.82, z = 10.9706 } +spawnpoint 'a_m_y_hipster_02' { x = -45.1562, y = 6301.64, z = 31.6114 } +spawnpoint 'a_m_y_hipster_01' { x = -1004.77, y = 4854.32, z = 274.606 } +spawnpoint 'a_m_y_hipster_02' { x = -1580.01, y = 5173.3, z = 19.5813 } +spawnpoint 'a_m_y_hipster_01' { x = -1467.95, y = 5416.2, z = 23.5959 } +spawnpoint 'a_m_y_hipster_02' { x = -2359.31, y = 3243.83, z = 92.9037 } +spawnpoint 'a_m_y_hipster_01' { x = -2612.96, y = 3555.03, z = 4.85649 } +spawnpoint 'a_m_y_hipster_02' { x = -2083.27, y = 2616.94, z = 3.08396 } +spawnpoint 'a_m_y_hipster_01' { x = -524.471, y = 4195, z = 193.731 } +spawnpoint 'a_m_y_hipster_02' { x = -840.713, y = 4183.18, z = 215.29 } +spawnpoint 'a_m_y_hipster_01' { x = -1576.24, y = 2103.87, z = 67.576 } +spawnpoint 'a_m_y_hipster_02' { x = -1634.37, y = 209.816, z = 60.6413 } +spawnpoint 'a_m_y_hipster_01' { x = -1495.07, y = 142.697, z = 55.6527 } +spawnpoint 'a_m_y_hipster_02' { x = -1715.41, y = -197.722, z = 57.698 } +spawnpoint 'a_m_y_hipster_01' { x = -1181.07, y = -505.544, z = 35.5661 } +spawnpoint 'a_m_y_hipster_02' { x = -1712.37, y = -1082.91, z = 13.0801 } +spawnpoint 'a_m_y_hipster_01' { x = -1352.43, y = -1542.75, z = 4.42268 } +spawnpoint 'a_m_y_hipster_02' { x = -1756.89, y = 427.531, z = 127.685 } +spawnpoint 'a_m_y_hipster_01' { x = 3060.2, y = 2113.2, z = 1.6613 } +spawnpoint 'a_m_y_hipster_02' { x = 501.646, y = 5604.53, z = 797.91 } +spawnpoint 'a_m_y_hipster_01' { x = 714.109, y = 4151.15, z = 35.7792 } +spawnpoint 'a_m_y_hipster_02' { x = -103.651, y = -967.93, z = 296.52 } +spawnpoint 'a_m_y_hipster_01' { x = -265.333, y = -2419.35, z = 122.366 } +spawnpoint 'a_m_y_hipster_02' { x = 1788.25, y = 3890.34, z = 34.3849 } + +-- diff --git a/resources/[gamemodes]/[maps]/fivem-map-skater/fxmanifest.lua b/resources/[gamemodes]/[maps]/fivem-map-skater/fxmanifest.lua new file mode 100644 index 0000000..5075a0c --- /dev/null +++ b/resources/[gamemodes]/[maps]/fivem-map-skater/fxmanifest.lua @@ -0,0 +1,14 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Example spawn points for FiveM with a "skater" model.' +repository 'https://github.com/citizenfx/cfx-server-data' + +resource_type 'map' { gameTypes = { ['basic-gamemode'] = true } } + +map 'map.lua' + +fx_version 'adamant' +game 'gta5' diff --git a/resources/[gamemodes]/[maps]/fivem-map-skater/map.lua b/resources/[gamemodes]/[maps]/fivem-map-skater/map.lua new file mode 100644 index 0000000..93a9069 --- /dev/null +++ b/resources/[gamemodes]/[maps]/fivem-map-skater/map.lua @@ -0,0 +1,62 @@ +spawnpoint 'a_m_y_skater_01' { x = -802.311, y = 175.056, z = 72.8446 } +spawnpoint 'a_m_y_skater_02' { x = -9.96562, y = -1438.54, z = 31.1015 } +spawnpoint 'a_m_y_skater_01' { x = 0.916756, y = 528.485, z = 174.628 } +spawnpoint 'a_m_y_skater_02' { x = 1975.86, y = 3821.03, z = 33.4501 } +spawnpoint 'a_m_y_skater_01' { x = -181.615, y = 852.8, z = 232.701 } +spawnpoint 'a_m_y_skater_02' { x = 657.723, y = 457.342, z = 144.641 } +spawnpoint 'a_m_y_skater_01' { x = 134.387, y = 1150.31, z = 231.594 } +spawnpoint 'a_m_y_skater_02' { x = 726.14, y = 1196.91, z = 326.262 } +spawnpoint 'a_m_y_skater_01' { x = 740.792, y = 1283.62, z = 360.297 } +spawnpoint 'a_m_y_skater_02' { x = -437.009, y = 1059.59, z = 327.331 } +spawnpoint 'a_m_y_skater_01' { x = -428.771, y = 1596.8, z = 356.338 } +spawnpoint 'a_m_y_skater_02' { x = -1348.78, y = 723.87, z = 186.45 } +spawnpoint 'a_m_y_skater_01' { x = -1543.24, y = 830.069, z = 182.132 } +spawnpoint 'a_m_y_skater_02' { x = -2150.48, y = 222.019, z = 184.602 } +spawnpoint 'a_m_y_skater_01' { x = -3032.13, y = 22.2157, z = 10.1184 } +spawnpoint 'a_m_y_skater_02' { x = 3063.97, y = 5608.88, z = 209.245 } +spawnpoint 'a_m_y_skater_01' { x = -2614.35, y = 1872.49, z = 167.32 } +spawnpoint 'a_m_y_skater_02' { x = -1873.94, y = 2088.73, z = 140.994 } +spawnpoint 'a_m_y_skater_01' { x = -597.177, y = 2092.16, z = 131.413 } +spawnpoint 'a_m_y_skater_02' { x = 967.126, y = 2226.99, z = 54.0588 } +spawnpoint 'a_m_y_skater_01' { x = -338.043, y = 2829, z = 56.0871 } +spawnpoint 'a_m_y_skater_02' { x = 1082.25, y = -696.921, z = 58.0099 } +spawnpoint 'a_m_y_skater_01' { x = 1658.31, y = -13.9234, z = 169.992 } +spawnpoint 'a_m_y_skater_02' { x = 2522.98, y = -384.436, z = 92.9928 } +spawnpoint 'a_m_y_skater_01' { x = 2826.27, y = -656.489, z = 1.87841 } +spawnpoint 'a_m_y_skater_02' { x = 2851.12, y = 1467.5, z = 24.5554 } +spawnpoint 'a_m_y_skater_01' { x = 2336.33, y = 2535.39, z = 46.5177 } +spawnpoint 'a_m_y_skater_02' { x = 2410.46, y = 3077.88, z = 48.1529 } +spawnpoint 'a_m_y_skater_01' { x = 2451.15, y = 3768.37, z = 41.3477 } +spawnpoint 'a_m_y_skater_02' { x = 3337.78, y = 5174.8, z = 18.2108 } +spawnpoint 'a_m_y_skater_01' { x = -1119.33, y = 4978.52, z = 186.26 } +spawnpoint 'a_m_y_skater_02' { x = 2877.3, y = 5911.57, z = 369.618 } +spawnpoint 'a_m_y_skater_01' { x = 2942.1, y = 5306.73, z = 101.52 } +spawnpoint 'a_m_y_skater_02' { x = 2211.29, y = 5577.94, z = 53.872 } +spawnpoint 'a_m_y_skater_01' { x = 1602.39, y = 6623.02, z = 15.8417 } +spawnpoint 'a_m_y_skater_02' { x = 66.0113, y = 7203.58, z = 3.16 } +spawnpoint 'a_m_y_skater_01' { x = -219.201, y = 6562.82, z = 10.9706 } +spawnpoint 'a_m_y_skater_02' { x = -45.1562, y = 6301.64, z = 31.6114 } +spawnpoint 'a_m_y_skater_01' { x = -1004.77, y = 4854.32, z = 274.606 } +spawnpoint 'a_m_y_skater_02' { x = -1580.01, y = 5173.3, z = 19.5813 } +spawnpoint 'a_m_y_skater_01' { x = -1467.95, y = 5416.2, z = 23.5959 } +spawnpoint 'a_m_y_skater_02' { x = -2359.31, y = 3243.83, z = 92.9037 } +spawnpoint 'a_m_y_skater_01' { x = -2612.96, y = 3555.03, z = 4.85649 } +spawnpoint 'a_m_y_skater_02' { x = -2083.27, y = 2616.94, z = 3.08396 } +spawnpoint 'a_m_y_skater_01' { x = -524.471, y = 4195, z = 193.731 } +spawnpoint 'a_m_y_skater_02' { x = -840.713, y = 4183.18, z = 215.29 } +spawnpoint 'a_m_y_skater_01' { x = -1576.24, y = 2103.87, z = 67.576 } +spawnpoint 'a_m_y_skater_02' { x = -1634.37, y = 209.816, z = 60.6413 } +spawnpoint 'a_m_y_skater_01' { x = -1495.07, y = 142.697, z = 55.6527 } +spawnpoint 'a_m_y_skater_02' { x = -1715.41, y = -197.722, z = 57.698 } +spawnpoint 'a_m_y_skater_01' { x = -1181.07, y = -505.544, z = 35.5661 } +spawnpoint 'a_m_y_skater_02' { x = -1712.37, y = -1082.91, z = 13.0801 } +spawnpoint 'a_m_y_skater_01' { x = -1352.43, y = -1542.75, z = 4.42268 } +spawnpoint 'a_m_y_skater_02' { x = -1756.89, y = 427.531, z = 127.685 } +spawnpoint 'a_m_y_skater_01' { x = 3060.2, y = 2113.2, z = 1.6613 } +spawnpoint 'a_m_y_skater_02' { x = 501.646, y = 5604.53, z = 797.91 } +spawnpoint 'a_m_y_skater_01' { x = 714.109, y = 4151.15, z = 35.7792 } +spawnpoint 'a_m_y_skater_02' { x = -103.651, y = -967.93, z = 296.52 } +spawnpoint 'a_m_y_skater_01' { x = -265.333, y = -2419.35, z = 122.366 } +spawnpoint 'a_m_y_skater_02' { x = 1788.25, y = 3890.34, z = 34.3849 } + +-- \ No newline at end of file diff --git a/resources/[gamemodes]/[maps]/redm-map-one/fxmanifest.lua b/resources/[gamemodes]/[maps]/redm-map-one/fxmanifest.lua new file mode 100644 index 0000000..a5b1f49 --- /dev/null +++ b/resources/[gamemodes]/[maps]/redm-map-one/fxmanifest.lua @@ -0,0 +1,16 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Example spawn points for RedM.' +repository 'https://github.com/citizenfx/cfx-server-data' + +resource_type 'map' { gameTypes = { ['basic-gamemode'] = true } } + +map 'map.lua' + +fx_version 'adamant' +game 'rdr3' + +rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' diff --git a/resources/[gamemodes]/[maps]/redm-map-one/map.lua b/resources/[gamemodes]/[maps]/redm-map-one/map.lua new file mode 100644 index 0000000..d010aed --- /dev/null +++ b/resources/[gamemodes]/[maps]/redm-map-one/map.lua @@ -0,0 +1,2 @@ +spawnpoint 'player_three' { x = -262.849, y = 793.404, z = 118.087 } +spawnpoint 'player_zero' { x = -262.849, y = 793.404, z = 118.087 } diff --git a/resources/[gamemodes]/basic-gamemode/basic_client.lua b/resources/[gamemodes]/basic-gamemode/basic_client.lua new file mode 100644 index 0000000..5631d48 --- /dev/null +++ b/resources/[gamemodes]/basic-gamemode/basic_client.lua @@ -0,0 +1,4 @@ +AddEventHandler('onClientMapStart', function() + exports.spawnmanager:setAutoSpawn(true) + exports.spawnmanager:forceRespawn() +end) diff --git a/resources/[gamemodes]/basic-gamemode/fxmanifest.lua b/resources/[gamemodes]/basic-gamemode/fxmanifest.lua new file mode 100644 index 0000000..74911e9 --- /dev/null +++ b/resources/[gamemodes]/basic-gamemode/fxmanifest.lua @@ -0,0 +1,14 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'A basic freeroam gametype that uses the default spawn logic from spawnmanager.' +repository 'https://github.com/citizenfx/cfx-server-data' + +resource_type 'gametype' { name = 'Freeroam' } + +client_script 'basic_client.lua' + +game 'common' +fx_version 'adamant' diff --git a/resources/[gameplay]/[examples]/money-fountain-example-map/fxmanifest.lua b/resources/[gameplay]/[examples]/money-fountain-example-map/fxmanifest.lua new file mode 100644 index 0000000..a1365ca --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain-example-map/fxmanifest.lua @@ -0,0 +1,14 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +description 'An example money system fountain spawn point.' +repository 'https://github.com/citizenfx/cfx-server-data' +author 'Cfx.re ' + +fx_version 'cerulean' +game 'gta5' + +map 'map.lua' + +dependency 'money-fountain' diff --git a/resources/[gameplay]/[examples]/money-fountain-example-map/map.lua b/resources/[gameplay]/[examples]/money-fountain-example-map/map.lua new file mode 100644 index 0000000..e7e1626 --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain-example-map/map.lua @@ -0,0 +1,4 @@ +money_fountain 'test_fountain' { + vector3(97.334, -973.621, 29.36), + amount = 75 +} \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/money-fountain/client.lua b/resources/[gameplay]/[examples]/money-fountain/client.lua new file mode 100644 index 0000000..1cdc1f1 --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain/client.lua @@ -0,0 +1,101 @@ +-- add text entries for all the help types we have +AddTextEntry('FOUNTAIN_HELP', 'This fountain currently contains $~1~.~n~Press ~INPUT_PICKUP~ to obtain $~1~.~n~Press ~INPUT_DETONATE~ to place $~1~.') +AddTextEntry('FOUNTAIN_HELP_DRAINED', 'This fountain currently contains $~1~.~n~Press ~INPUT_DETONATE~ to place $~1~.') +AddTextEntry('FOUNTAIN_HELP_BROKE', 'This fountain currently contains $~1~.~n~Press ~INPUT_PICKUP~ to obtain $~1~.') +AddTextEntry('FOUNTAIN_HELP_BROKE_N_DRAINED', 'This fountain currently contains $~1~.') +AddTextEntry('FOUNTAIN_HELP_INUSE', 'This fountain currently contains $~1~.~n~You can use it again in ~a~.') + +-- upvalue aliases so that we will be fast if far away +local Wait = Wait +local GetEntityCoords = GetEntityCoords +local PlayerPedId = PlayerPedId + +-- timer, don't tick as frequently if we're far from any money fountain +local relevanceTimer = 500 + +CreateThread(function() + local pressing = false + + while true do + Wait(relevanceTimer) + + local coords = GetEntityCoords(PlayerPedId()) + + for _, data in pairs(moneyFountains) do + -- if we're near this fountain + local dist = #(coords - data.coords) + + -- near enough to draw + if dist < 40 then + -- ensure per-frame tick + relevanceTimer = 0 + + DrawMarker(29, data.coords.x, data.coords.y, data.coords.z, 0, 0, 0, 0.0, 0, 0, 1.0, 1.0, 1.0, 0, 150, 0, 120, false, true, 2, false, nil, nil, false) + else + -- put the relevance timer back to the way it was + relevanceTimer = 500 + end + + -- near enough to use + if dist < 1 then + -- are we able to use it? if not, display appropriate help + local player = LocalPlayer + local nextUse = player.state['fountain_nextUse'] + + -- GetNetworkTime is synced for everyone + if nextUse and nextUse >= GetNetworkTime() then + BeginTextCommandDisplayHelp('FOUNTAIN_HELP_INUSE') + AddTextComponentInteger(GlobalState['fountain_' .. data.id]) + AddTextComponentSubstringTime(math.tointeger(nextUse - GetNetworkTime()), 2 | 4) -- seconds (2), minutes (4) + EndTextCommandDisplayHelp(0, false, false, 1000) + else + -- handle inputs for pickup/place + if not pressing then + if IsControlPressed(0, 38 --[[ INPUT_PICKUP ]]) then + TriggerServerEvent('money_fountain:tryPickup', data.id) + pressing = true + elseif IsControlPressed(0, 47 --[[ INPUT_DETONATE ]]) then + TriggerServerEvent('money_fountain:tryPlace', data.id) + pressing = true + end + else + if not IsControlPressed(0, 38 --[[ INPUT_PICKUP ]]) and + not IsControlPressed(0, 47 --[[ INPUT_DETONATE ]]) then + pressing = false + end + end + + -- decide the appropriate help message + local youCanSpend = (player.state['money_cash'] or 0) >= data.amount + local fountainCanSpend = GlobalState['fountain_' .. data.id] >= data.amount + + local helpName + + if youCanSpend and fountainCanSpend then + helpName = 'FOUNTAIN_HELP' + elseif youCanSpend and not fountainCanSpend then + helpName = 'FOUNTAIN_HELP_DRAINED' + elseif not youCanSpend and fountainCanSpend then + helpName = 'FOUNTAIN_HELP_BROKE' + else + helpName = 'FOUNTAIN_HELP_BROKE_N_DRAINED' + end + + -- and print it + BeginTextCommandDisplayHelp(helpName) + AddTextComponentInteger(GlobalState['fountain_' .. data.id]) + + if fountainCanSpend then + AddTextComponentInteger(data.amount) + end + + if youCanSpend then + AddTextComponentInteger(data.amount) + end + + EndTextCommandDisplayHelp(0, false, false, 1000) + end + end + end + end +end) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/money-fountain/fxmanifest.lua b/resources/[gameplay]/[examples]/money-fountain/fxmanifest.lua new file mode 100644 index 0000000..0218c4d --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain/fxmanifest.lua @@ -0,0 +1,22 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +description 'An example money system client containing a money fountain.' +repository 'https://github.com/citizenfx/cfx-server-data' +author 'Cfx.re ' + +fx_version 'bodacious' +game 'gta5' + +client_script 'client.lua' +server_script 'server.lua' + +shared_script 'mapdata.lua' + +dependencies { + 'mapmanager', + 'money' +} + +lua54 'yes' diff --git a/resources/[gameplay]/[examples]/money-fountain/mapdata.lua b/resources/[gameplay]/[examples]/money-fountain/mapdata.lua new file mode 100644 index 0000000..4eecad8 --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain/mapdata.lua @@ -0,0 +1,28 @@ +-- define the money fountain list (SHARED SCRIPT) +moneyFountains = {} + +-- index to know what to remove +local fountainIdx = 1 + +AddEventHandler('getMapDirectives', function(add) + -- add a 'money_fountain' map directive + add('money_fountain', function(state, name) + return function(data) + local coords = data[1] + local amount = data.amount or 100 + + local idx = fountainIdx + fountainIdx += 1 + + moneyFountains[idx] = { + id = name, + coords = coords, + amount = amount + } + + state.add('idx', idx) + end + end, function(state) + moneyFountains[state.idx] = nil + end) +end) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/money-fountain/server.lua b/resources/[gameplay]/[examples]/money-fountain/server.lua new file mode 100644 index 0000000..9b1e238 --- /dev/null +++ b/resources/[gameplay]/[examples]/money-fountain/server.lua @@ -0,0 +1,107 @@ +-- track down what we've added to global state +local sentState = {} + +-- money system +local ms = exports['money'] + +-- get the fountain content from storage +local function getMoneyForId(fountainId) + return GetResourceKvpInt(('money:%s'):format(fountainId)) / 100.0 +end + +-- set the fountain content in storage + state +local function setMoneyForId(fountainId, money) + GlobalState['fountain_' .. fountainId] = math.tointeger(money) + + return SetResourceKvpInt(('money:%s'):format(fountainId), math.tointeger(money * 100.0)) +end + +-- get the nearest fountain to the player + ID +local function getMoneyFountain(id, source) + local coords = GetEntityCoords(GetPlayerPed(source)) + + for _, v in pairs(moneyFountains) do + if v.id == id then + if #(v.coords - coords) < 2.5 then + return v + end + end + end + + return nil +end + +-- generic function for events +local function handleFountainStuff(source, id, pickup) + -- if near the fountain we specify + local fountain = getMoneyFountain(id, source) + + if fountain then + -- and we can actually use the fountain already + local player = Player(source) + + local nextUse = player.state['fountain_nextUse'] + if not nextUse then + nextUse = 0 + end + + -- GetGameTimer ~ GetNetworkTime on client + if nextUse <= GetGameTimer() then + -- not rate limited + local success = false + local money = getMoneyForId(fountain.id) + + -- decide the op + if pickup then + -- if the fountain is rich enough to get the per-use amount + if money >= fountain.amount then + -- give the player money + if ms:addMoney(source, 'cash', fountain.amount) then + money -= fountain.amount + success = true + end + end + else + -- if the player is rich enough + if ms:removeMoney(source, 'cash', fountain.amount) then + -- add to the fountain + money += fountain.amount + success = true + end + end + + -- save it and set the player's cooldown + if success then + setMoneyForId(fountain.id, money) + player.state['fountain_nextUse'] = GetGameTimer() + GetConvarInt('moneyFountain_cooldown', 5000) + end + end + end +end + +-- event for picking up fountain->player +RegisterNetEvent('money_fountain:tryPickup') +AddEventHandler('money_fountain:tryPickup', function(id) + handleFountainStuff(source, id, true) +end) + +-- event for donating player->fountain +RegisterNetEvent('money_fountain:tryPlace') +AddEventHandler('money_fountain:tryPlace', function(id) + handleFountainStuff(source, id, false) +end) + +-- listener: if a new fountain is added, set its current money in state +CreateThread(function() + while true do + Wait(500) + + for _, fountain in pairs(moneyFountains) do + if not sentState[fountain.id] then + GlobalState['fountain_' .. fountain.id] = math.tointeger(getMoneyForId(fountain.id)) + + sentState[fountain.id] = true + end + end + end +end) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/money/client.lua b/resources/[gameplay]/[examples]/money/client.lua new file mode 100644 index 0000000..e094dd1 --- /dev/null +++ b/resources/[gameplay]/[examples]/money/client.lua @@ -0,0 +1,30 @@ +local moneyTypes = { + cash = `MP0_WALLET_BALANCE`, + bank = `BANK_BALANCE`, +} + +RegisterNetEvent('money:displayUpdate') + +AddEventHandler('money:displayUpdate', function(type, money) + local stat = moneyTypes[type] + if not stat then return end + StatSetInt(stat, math.floor(money)) +end) + +TriggerServerEvent('money:requestDisplay') + +CreateThread(function() + while true do + Wait(0) + + if IsControlJustPressed(0, 20) then + SetMultiplayerBankCash() + SetMultiplayerWalletCash() + + Wait(4350) + + RemoveMultiplayerBankCash() + RemoveMultiplayerWalletCash() + end + end +end) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/money/fxmanifest.lua b/resources/[gameplay]/[examples]/money/fxmanifest.lua new file mode 100644 index 0000000..7abd12c --- /dev/null +++ b/resources/[gameplay]/[examples]/money/fxmanifest.lua @@ -0,0 +1,16 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +description 'An example money system using KVS.' +repository 'https://github.com/citizenfx/cfx-server-data' +author 'Cfx.re ' + +fx_version 'bodacious' +game 'gta5' + +client_script 'client.lua' +server_script 'server.lua' + +--dependency 'cfx.re/playerData.v1alpha1' +lua54 'yes' diff --git a/resources/[gameplay]/[examples]/money/server.lua b/resources/[gameplay]/[examples]/money/server.lua new file mode 100644 index 0000000..2b2ce96 --- /dev/null +++ b/resources/[gameplay]/[examples]/money/server.lua @@ -0,0 +1,119 @@ +local playerData = exports['cfx.re/playerData.v1alpha1'] + +local validMoneyTypes = { + bank = true, + cash = true, +} + +local function getMoneyForId(playerId, moneyType) + return GetResourceKvpInt(('money:%s:%s'):format(playerId, moneyType)) / 100.0 +end + +local function setMoneyForId(playerId, moneyType, money) + local s = playerData:getPlayerById(playerId) + + TriggerEvent('money:updated', { + dbId = playerId, + source = s, + moneyType = moneyType, + money = money + }) + + return SetResourceKvpInt(('money:%s:%s'):format(playerId, moneyType), math.tointeger(money * 100.0)) +end + +local function addMoneyForId(playerId, moneyType, amount) + local curMoney = getMoneyForId(playerId, moneyType) + curMoney += amount + + if curMoney >= 0 then + setMoneyForId(playerId, moneyType, curMoney) + return true, curMoney + end + + return false, 0 +end + +exports('addMoney', function(playerIdx, moneyType, amount) + amount = tonumber(amount) + + if amount <= 0 or amount > (1 << 30) then + return false + end + + if not validMoneyTypes[moneyType] then + return false + end + + local playerId = playerData:getPlayerId(playerIdx) + local success, money = addMoneyForId(playerId, moneyType, amount) + + if success then + Player(playerIdx).state['money_' .. moneyType] = money + end + + return true +end) + +exports('removeMoney', function(playerIdx, moneyType, amount) + amount = tonumber(amount) + + if amount <= 0 or amount > (1 << 30) then + return false + end + + if not validMoneyTypes[moneyType] then + return false + end + + local playerId = playerData:getPlayerId(playerIdx) + local success, money = addMoneyForId(playerId, moneyType, -amount) + + if success then + Player(playerIdx).state['money_' .. moneyType] = money + end + + return success +end) + +exports('getMoney', function(playerIdx, moneyType) + local playerId = playerData:getPlayerId(playerIdx) + return getMoneyForId(playerId, moneyType) +end) + +-- player display bits +AddEventHandler('money:updated', function(data) + if data.source then + TriggerClientEvent('money:displayUpdate', data.source, data.moneyType, data.money) + end +end) + +RegisterNetEvent('money:requestDisplay') + +AddEventHandler('money:requestDisplay', function() + local source = source + local playerId = playerData:getPlayerId(source) + + for type, _ in pairs(validMoneyTypes) do + local amount = getMoneyForId(playerId, type) + TriggerClientEvent('money:displayUpdate', source, type, amount) + + Player(source).state['money_' .. type] = amount + end +end) + +RegisterCommand('earn', function(source, args) + local type = args[1] + local amount = tonumber(args[2]) + + exports['money']:addMoney(source, type, amount) +end, true) + +RegisterCommand('spend', function(source, args) + local type = args[1] + local amount = tonumber(args[2]) + + if not exports['money']:removeMoney(source, type, amount) then + print('you are broke??') + end +end, true) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/ped-money-drops/client.lua b/resources/[gameplay]/[examples]/ped-money-drops/client.lua new file mode 100644 index 0000000..d6d000c --- /dev/null +++ b/resources/[gameplay]/[examples]/ped-money-drops/client.lua @@ -0,0 +1,41 @@ +AddEventHandler('gameEventTriggered', function(eventName, args) + if eventName == 'CEventNetworkEntityDamage' then + local victim = args[1] + local culprit = args[2] + local isDead = args[4] == 1 + + if isDead then + local origCoords = GetEntityCoords(victim) + local pickup = CreatePickupRotate(`PICKUP_MONEY_VARIABLE`, origCoords.x, origCoords.y, origCoords.z - 0.7, 0.0, 0.0, 0.0, 512, 0, false, 0) + local netId = PedToNet(victim) + + local undoStuff = { false } + + CreateThread(function() + local self = PlayerPedId() + + while not undoStuff[1] do + Wait(50) + + if #(GetEntityCoords(self) - origCoords) < 2.5 and HasPickupBeenCollected(pickup) then + TriggerServerEvent('money:tryPickup', netId) + + RemovePickup(pickup) + break + end + end + + undoStuff[1] = true + end) + + SetTimeout(15000, function() + if not undoStuff[1] then + RemovePickup(pickup) + undoStuff[1] = true + end + end) + + TriggerServerEvent('money:allowPickupNear', netId) + end + end +end) \ No newline at end of file diff --git a/resources/[gameplay]/[examples]/ped-money-drops/fxmanifest.lua b/resources/[gameplay]/[examples]/ped-money-drops/fxmanifest.lua new file mode 100644 index 0000000..1e6b7b2 --- /dev/null +++ b/resources/[gameplay]/[examples]/ped-money-drops/fxmanifest.lua @@ -0,0 +1,15 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +description 'An example money system client.' +author 'Cfx.re ' +repository 'https://github.com/citizenfx/cfx-server-data' + +fx_version 'bodacious' +game 'gta5' + +client_script 'client.lua' +server_script 'server.lua' + +lua54 'yes' diff --git a/resources/[gameplay]/[examples]/ped-money-drops/server.lua b/resources/[gameplay]/[examples]/ped-money-drops/server.lua new file mode 100644 index 0000000..6876952 --- /dev/null +++ b/resources/[gameplay]/[examples]/ped-money-drops/server.lua @@ -0,0 +1,42 @@ +local safePositions = {} + +RegisterNetEvent('money:allowPickupNear') + +AddEventHandler('money:allowPickupNear', function(pedId) + local entity = NetworkGetEntityFromNetworkId(pedId) + + Wait(250) + + if not DoesEntityExist(entity) then + return + end + + if GetEntityHealth(entity) > 100 then + return + end + + local coords = GetEntityCoords(entity) + safePositions[pedId] = coords +end) + +RegisterNetEvent('money:tryPickup') + +AddEventHandler('money:tryPickup', function(entity) + if not safePositions[entity] then + return + end + + local source = source + local playerPed = GetPlayerPed(source) + local coords = GetEntityCoords(playerPed) + + if #(safePositions[entity] - coords) < 2.5 then + exports['money']:addMoney(source, 'cash', 40) + end + + safePositions[entity] = nil +end) + +AddEventHandler('entityRemoved', function(entity) + safePositions[entity] = nil +end) \ No newline at end of file diff --git a/resources/[gameplay]/chat-theme-gtao/fxmanifest.lua b/resources/[gameplay]/chat-theme-gtao/fxmanifest.lua new file mode 100644 index 0000000..08bdf27 --- /dev/null +++ b/resources/[gameplay]/chat-theme-gtao/fxmanifest.lua @@ -0,0 +1,21 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'A GTA Online-styled theme for the chat resource.' +repository 'https://github.com/citizenfx/cfx-server-data' + +file 'style.css' +file 'shadow.js' + +chat_theme 'gtao' { + styleSheet = 'style.css', + script = 'shadow.js', + msgTemplates = { + default = '{0}{1}' + } +} + +game 'common' +fx_version 'adamant' diff --git a/resources/[gameplay]/chat-theme-gtao/shadow.js b/resources/[gameplay]/chat-theme-gtao/shadow.js new file mode 100644 index 0000000..55d3176 --- /dev/null +++ b/resources/[gameplay]/chat-theme-gtao/shadow.js @@ -0,0 +1,74 @@ +(function() { +var Filters = {} + +var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); +svg.setAttribute("style", "display:block;width:0px;height:0px"); +var defs = document.createElementNS("http://www.w3.org/2000/svg", "defs"); + +var blurFilter = document.createElementNS("http://www.w3.org/2000/svg", "filter"); +blurFilter.setAttribute("id", "svgBlurFilter"); +var feGaussianFilter = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur"); +feGaussianFilter.setAttribute("stdDeviation", "0 0"); +blurFilter.appendChild(feGaussianFilter); +defs.appendChild(blurFilter); +Filters._svgBlurFilter = feGaussianFilter; + +// Drop Shadow Filter +var dropShadowFilter = document.createElementNS("http://www.w3.org/2000/svg", "filter"); +dropShadowFilter.setAttribute("id", "svgDropShadowFilter"); +var feGaussianFilter = document.createElementNS("http://www.w3.org/2000/svg", "feGaussianBlur"); +feGaussianFilter.setAttribute("in", "SourceAlpha"); +feGaussianFilter.setAttribute("stdDeviation", "3"); +dropShadowFilter.appendChild(feGaussianFilter); +Filters._svgDropshadowFilterBlur = feGaussianFilter; + +var feOffset = document.createElementNS("http://www.w3.org/2000/svg", "feOffset"); +feOffset.setAttribute("dx", "0"); +feOffset.setAttribute("dy", "0"); +feOffset.setAttribute("result", "offsetblur"); +dropShadowFilter.appendChild(feOffset); +Filters._svgDropshadowFilterOffset = feOffset; + +var feFlood = document.createElementNS("http://www.w3.org/2000/svg", "feFlood"); +feFlood.setAttribute("flood-color", "rgba(0,0,0,1)"); +dropShadowFilter.appendChild(feFlood); +Filters._svgDropshadowFilterFlood = feFlood; + +var feComposite = document.createElementNS("http://www.w3.org/2000/svg", "feComposite"); +feComposite.setAttribute("in2", "offsetblur"); +feComposite.setAttribute("operator", "in"); +dropShadowFilter.appendChild(feComposite); +var feComposite = document.createElementNS("http://www.w3.org/2000/svg", "feComposite"); +feComposite.setAttribute("in2", "SourceAlpha"); +feComposite.setAttribute("operator", "out"); +feComposite.setAttribute("result", "outer"); +dropShadowFilter.appendChild(feComposite); + +var feMerge = document.createElementNS("http://www.w3.org/2000/svg", "feMerge"); +var feMergeNode = document.createElementNS("http://www.w3.org/2000/svg", "feMergeNode"); +feMerge.appendChild(feMergeNode); +var feMergeNode = document.createElementNS("http://www.w3.org/2000/svg", "feMergeNode"); +feMerge.appendChild(feMergeNode); +Filters._svgDropshadowMergeNode = feMergeNode; +dropShadowFilter.appendChild(feMerge); +defs.appendChild(dropShadowFilter); +svg.appendChild(defs); +document.documentElement.appendChild(svg); + +const blurScale = 1; +const scale = (document.body.clientWidth / 1280); + +Filters._svgDropshadowFilterBlur.setAttribute("stdDeviation", + 1 * blurScale + " " + + 1 * blurScale +); +Filters._svgDropshadowFilterOffset.setAttribute("dx", + String(Math.cos(45 * Math.PI / 180) * 1 * scale)); +Filters._svgDropshadowFilterOffset.setAttribute("dy", + String(Math.sin(45 * Math.PI / 180) * 1 * scale)); +Filters._svgDropshadowFilterFlood.setAttribute("flood-color", + 'rgba(0, 0, 0, 1)'); +Filters._svgDropshadowMergeNode.setAttribute("in", + "SourceGraphic"); + +})(); \ No newline at end of file diff --git a/resources/[gameplay]/chat-theme-gtao/style.css b/resources/[gameplay]/chat-theme-gtao/style.css new file mode 100644 index 0000000..5e28f97 --- /dev/null +++ b/resources/[gameplay]/chat-theme-gtao/style.css @@ -0,0 +1,141 @@ +* { + font-family: inherit; +} + +.chat-window { + --size: calc(((2.7vh * 1.2)) * 6); + + position: absolute; + right: calc(2.77vh); + top: calc(50% - (var(--size) / 2)); + height: var(--size) !important; + + background: inherit !important; + + text-align: right; + + left: auto; + + user-select: none; +} + +@font-face { + font-family: 'Font2'; + src: url(https://runtime.fivem.net/temp/ChaletLondonNineteenSixty.otf?a); +} + +@font-face { + font-family: 'Font2_cond'; + src: url(https://runtime.fivem.net/temp/chaletcomprime-colognesixty-webfont.ttf?a); +} + +.msg { + font-family: Font2, sans-serif; + color: #fff; + + font-size: calc(1.8vh); /* 13px in 720p, calc'd by width */ + filter: url(#svgDropShadowFilter); + + line-height: calc(2.7vh * 1.2); + + margin-bottom: 0; +} + +.chat-messages { + margin: 0; + height: 100%; +} + +.msg > span > span > b { + font-family: Font2_cond, sans-serif; + font-weight: normal; + + vertical-align: baseline; + padding-right: 11px; + + line-height: 1; + + font-size: calc(2.7vh); +} + +.msg > span > span > span { + vertical-align: baseline; +} + +.msg i:first-of-type { + font-style: normal; + color: #c0c0c0; +} + +.chat-input { + position: absolute; + right: calc(2.77vh); + bottom: calc(2.77vh); + + background: inherit !important; + + text-align: right; + + top: auto; + left: auto; + + height: auto; + + font-family: Font2, sans-serif; +} + +.chat-input > div { + background-color: rgba(0, 0, 0, .6) !important; + border: calc(0.28vh / 2) solid rgba(180, 180, 180, .6); + outline: calc(0.28vh / 2) solid rgba(0, 0, 0, .8); /* to replace margin-background */ + padding: calc(0.28vh / 2); +} + +.chat-input .prefix { + margin: 0; + margin-left: 0.7%; + margin-top: -0.1%; + line-height: 2.8vh; +} + +.chat-input .prefix.any { + opacity: 0.8; +} + +.chat-input .prefix.any:before { + content: '['; +} + +.chat-input .prefix.any:after { + content: ']'; +} + +.chat-input > div + div { + position: absolute; + bottom: calc(1.65vh + 0.28vh + 0.28vh + 0.28vh + (0.28vh / 2)); + width: 99.6%; + + text-align: left; +} + +.suggestions { + border: calc(0.28vh / 2) solid rgba(180, 180, 180, .6); + background: transparent; +} + +textarea { + background: transparent; + padding: 0.5vh; +} + +@media screen and (min-aspect-ratio: 21/9) { + .chat-window, .chat-input { + right: calc(12.8vw); + } +} + +@media screen and (min-aspect-ratio: 32/9) { + .chat-window, .chat-input { + right: calc(25vw); + } +} diff --git a/resources/[gameplay]/chat/.gitignore b/resources/[gameplay]/chat/.gitignore new file mode 100644 index 0000000..3e0ed55 --- /dev/null +++ b/resources/[gameplay]/chat/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.yarn.installed +yarn-error.log +dist/ \ No newline at end of file diff --git a/resources/[gameplay]/chat/README.md b/resources/[gameplay]/chat/README.md new file mode 100644 index 0000000..279df4a --- /dev/null +++ b/resources/[gameplay]/chat/README.md @@ -0,0 +1 @@ +# Chat diff --git a/resources/[gameplay]/chat/cl_chat.lua b/resources/[gameplay]/chat/cl_chat.lua new file mode 100644 index 0000000..b0ad88e --- /dev/null +++ b/resources/[gameplay]/chat/cl_chat.lua @@ -0,0 +1,308 @@ +local isRDR = not TerraingridActivate and true or false + +local chatInputActive = false +local chatInputActivating = false +local chatLoaded = false + +RegisterNetEvent('chatMessage') +RegisterNetEvent('chat:addTemplate') +RegisterNetEvent('chat:addMessage') +RegisterNetEvent('chat:addSuggestion') +RegisterNetEvent('chat:addSuggestions') +RegisterNetEvent('chat:addMode') +RegisterNetEvent('chat:removeMode') +RegisterNetEvent('chat:removeSuggestion') +RegisterNetEvent('chat:clear') + +-- internal events +RegisterNetEvent('__cfx_internal:serverPrint') + +RegisterNetEvent('_chat:messageEntered') + +--deprecated, use chat:addMessage +AddEventHandler('chatMessage', function(author, color, text) + local args = { text } + if author ~= "" then + table.insert(args, 1, author) + end + SendNUIMessage({ + type = 'ON_MESSAGE', + message = { + color = color, + multiline = true, + args = args + } + }) +end) + +AddEventHandler('__cfx_internal:serverPrint', function(msg) + print(msg) + + SendNUIMessage({ + type = 'ON_MESSAGE', + message = { + templateId = 'print', + multiline = true, + args = { msg }, + mode = '_global' + } + }) +end) + +-- addMessage +local addMessage = function(message) + if type(message) == 'string' then + message = { + args = { message } + } + end + + SendNUIMessage({ + type = 'ON_MESSAGE', + message = message + }) +end + +exports('addMessage', addMessage) +AddEventHandler('chat:addMessage', addMessage) + +-- addSuggestion +local addSuggestion = function(name, help, params) + SendNUIMessage({ + type = 'ON_SUGGESTION_ADD', + suggestion = { + name = name, + help = help, + params = params or nil + } + }) +end + +exports('addSuggestion', addSuggestion) +AddEventHandler('chat:addSuggestion', addSuggestion) + +AddEventHandler('chat:addSuggestions', function(suggestions) + for _, suggestion in ipairs(suggestions) do + SendNUIMessage({ + type = 'ON_SUGGESTION_ADD', + suggestion = suggestion + }) + end +end) + +AddEventHandler('chat:removeSuggestion', function(name) + SendNUIMessage({ + type = 'ON_SUGGESTION_REMOVE', + name = name + }) +end) + +AddEventHandler('chat:addMode', function(mode) + SendNUIMessage({ + type = 'ON_MODE_ADD', + mode = mode + }) +end) + +AddEventHandler('chat:removeMode', function(name) + SendNUIMessage({ + type = 'ON_MODE_REMOVE', + name = name + }) +end) + +AddEventHandler('chat:addTemplate', function(id, html) + SendNUIMessage({ + type = 'ON_TEMPLATE_ADD', + template = { + id = id, + html = html + } + }) +end) + +AddEventHandler('chat:clear', function(name) + SendNUIMessage({ + type = 'ON_CLEAR' + }) +end) + +RegisterNUICallback('chatResult', function(data, cb) + chatInputActive = false + SetNuiFocus(false) + + if not data.canceled then + local id = PlayerId() + + --deprecated + local r, g, b = 0, 0x99, 255 + + if data.message:sub(1, 1) == '/' then + ExecuteCommand(data.message:sub(2)) + else + TriggerServerEvent('_chat:messageEntered', GetPlayerName(id), { r, g, b }, data.message, data.mode) + end + end + + cb('ok') +end) + +local function refreshCommands() + if GetRegisteredCommands then + local registeredCommands = GetRegisteredCommands() + + local suggestions = {} + + for _, command in ipairs(registeredCommands) do + if IsAceAllowed(('command.%s'):format(command.name)) and command.name ~= 'toggleChat' then + table.insert(suggestions, { + name = '/' .. command.name, + help = '' + }) + end + end + + TriggerEvent('chat:addSuggestions', suggestions) + end +end + +local function refreshThemes() + local themes = {} + + for resIdx = 0, GetNumResources() - 1 do + local resource = GetResourceByFindIndex(resIdx) + + if GetResourceState(resource) == 'started' then + local numThemes = GetNumResourceMetadata(resource, 'chat_theme') + + if numThemes > 0 then + local themeName = GetResourceMetadata(resource, 'chat_theme') + local themeData = json.decode(GetResourceMetadata(resource, 'chat_theme_extra') or 'null') + + if themeName and themeData then + themeData.baseUrl = 'nui://' .. resource .. '/' + themes[themeName] = themeData + end + end + end + end + + SendNUIMessage({ + type = 'ON_UPDATE_THEMES', + themes = themes + }) +end + +AddEventHandler('onClientResourceStart', function(resName) + Wait(500) + + refreshCommands() + refreshThemes() +end) + +AddEventHandler('onClientResourceStop', function(resName) + Wait(500) + + refreshCommands() + refreshThemes() +end) + +RegisterNUICallback('loaded', function(data, cb) + TriggerServerEvent('chat:init') + + refreshCommands() + refreshThemes() + + chatLoaded = true + + cb('ok') +end) + +local CHAT_HIDE_STATES = { + SHOW_WHEN_ACTIVE = 0, + ALWAYS_SHOW = 1, + ALWAYS_HIDE = 2 +} + +local kvpEntry = GetResourceKvpString('hideState') +local chatHideState = kvpEntry and tonumber(kvpEntry) or CHAT_HIDE_STATES.SHOW_WHEN_ACTIVE +local isFirstHide = true + +if not isRDR then + if RegisterKeyMapping then + RegisterKeyMapping('toggleChat', 'Toggle chat', 'keyboard', 'l') + end + + RegisterCommand('toggleChat', function() + if chatHideState == CHAT_HIDE_STATES.SHOW_WHEN_ACTIVE then + chatHideState = CHAT_HIDE_STATES.ALWAYS_SHOW + elseif chatHideState == CHAT_HIDE_STATES.ALWAYS_SHOW then + chatHideState = CHAT_HIDE_STATES.ALWAYS_HIDE + elseif chatHideState == CHAT_HIDE_STATES.ALWAYS_HIDE then + chatHideState = CHAT_HIDE_STATES.SHOW_WHEN_ACTIVE + end + + isFirstHide = false + + SetResourceKvp('hideState', tostring(chatHideState)) + end, false) +end + +Citizen.CreateThread(function() + SetTextChatEnabled(false) + SetNuiFocus(false) + + local lastChatHideState = -1 + local origChatHideState = -1 + + while true do + Wait(0) + + if not chatInputActive then + if IsControlPressed(0, isRDR and `INPUT_MP_TEXT_CHAT_ALL` or 245) --[[ INPUT_MP_TEXT_CHAT_ALL ]] then + chatInputActive = true + chatInputActivating = true + + SendNUIMessage({ + type = 'ON_OPEN' + }) + end + end + + if chatInputActivating then + if not IsControlPressed(0, isRDR and `INPUT_MP_TEXT_CHAT_ALL` or 245) then + SetNuiFocus(true) + + chatInputActivating = false + end + end + + if chatLoaded then + local forceHide = IsScreenFadedOut() or IsPauseMenuActive() + local wasForceHide = false + + if chatHideState ~= CHAT_HIDE_STATES.ALWAYS_HIDE then + if forceHide then + origChatHideState = chatHideState + chatHideState = CHAT_HIDE_STATES.ALWAYS_HIDE + end + elseif not forceHide and origChatHideState ~= -1 then + chatHideState = origChatHideState + origChatHideState = -1 + wasForceHide = true + end + + if chatHideState ~= lastChatHideState then + lastChatHideState = chatHideState + + SendNUIMessage({ + type = 'ON_SCREEN_STATE_CHANGE', + hideState = chatHideState, + fromUserInteraction = not forceHide and not isFirstHide and not wasForceHide + }) + + isFirstHide = false + end + end + end +end) diff --git a/resources/[gameplay]/chat/fxmanifest.lua b/resources/[gameplay]/chat/fxmanifest.lua new file mode 100644 index 0000000..af382df --- /dev/null +++ b/resources/[gameplay]/chat/fxmanifest.lua @@ -0,0 +1,30 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Provides baseline chat functionality using a NUI-based interface.' +repository 'https://github.com/citizenfx/cfx-server-data' + +ui_page 'dist/ui.html' + +client_script 'cl_chat.lua' +server_script 'sv_chat.lua' + +files { + 'dist/ui.html', + 'dist/index.css', + 'html/vendor/*.css', + 'html/vendor/fonts/*.woff2', +} + +fx_version 'adamant' +games { 'rdr3', 'gta5' } +rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' + +dependencies { + 'yarn', + 'webpack' +} + +webpack_config 'webpack.config.js' diff --git a/resources/[gameplay]/chat/html/App.ts b/resources/[gameplay]/chat/html/App.ts new file mode 100644 index 0000000..031d59e --- /dev/null +++ b/resources/[gameplay]/chat/html/App.ts @@ -0,0 +1,467 @@ +import { post } from './utils'; +import CONFIG from './config'; +import Vue from 'vue'; + +import Suggestions from './Suggestions.vue'; +import MessageV from './Message.vue'; +import { Suggestion } from './Suggestions'; + +export interface Message { + args: string[]; + template: string; + params?: { [key: string]: string }; + multiline?: boolean; + color?: [ number, number, number ]; + templateId?: number; + mode?: string; + modeData?: Mode; + + id?: string; +} + +export interface ThemeData { + style: string; + styleSheet: string; + baseUrl: string; + script: string; + templates: { [id: string]: string }; // not supported rn + msgTemplates: { [id: string]: string }; + +} + +export interface Mode { + name: string; + displayName: string; + color: string; + hidden?: boolean; + isChannel?: boolean; + isGlobal?: boolean; +} + +enum ChatHideStates { + ShowWhenActive = 0, + AlwaysShow = 1, + AlwaysHide = 2, +} + +const defaultMode: Mode = { + name: 'all', + displayName: 'All', + color: '#fff' +}; + +const globalMode: Mode = { + name: '_global', + displayName: 'All', + color: '#fff', + isGlobal: true, + hidden: true +}; + +export default Vue.extend({ + template: "#app_template", + name: "app", + components: { + Suggestions, + MessageV + }, + data() { + return { + style: CONFIG.style, + showInput: false, + showWindow: false, + showHideState: false, + hideState: ChatHideStates.ShowWhenActive, + backingSuggestions: [] as Suggestion[], + removedSuggestions: [] as string[], + templates: { ...CONFIG.templates } as { [ key: string ]: string }, + message: "", + messages: [] as Message[], + oldMessages: [] as string[], + oldMessagesIndex: -1, + tplBackups: [] as unknown as [ HTMLElement, string ][], + msgTplBackups: [] as unknown as [ string, string ][], + focusTimer: 0, + showWindowTimer: 0, + showHideStateTimer: 0, + listener: (event: MessageEvent) => {}, + modes: [defaultMode, globalMode] as Mode[], + modeIdx: 0, + }; + }, + destroyed() { + clearInterval(this.focusTimer); + window.removeEventListener("message", this.listener); + }, + mounted() { + post("http://chat/loaded", JSON.stringify({})); + + this.listener = (event: MessageEvent) => { + const item: any = event.data || (event).detail; //'detail' is for debugging via browsers + + if (!item || !item.type) { + return; + } + + const typeRef = item.type as + 'ON_OPEN' | 'ON_SCREEN_STATE_CHANGE' | 'ON_MESSAGE' | 'ON_CLEAR' | 'ON_SUGGESTION_ADD' | + 'ON_SUGGESTION_REMOVE' | 'ON_TEMPLATE_ADD' | 'ON_UPDATE_THEMES' | 'ON_MODE_ADD' | 'ON_MODE_REMOVE'; + + if (this[typeRef]) { + this[typeRef](item); + } + }; + + window.addEventListener("message", this.listener); + }, + watch: { + messages() { + if (this.hideState !== ChatHideStates.AlwaysHide) { + if (this.showWindowTimer) { + clearTimeout(this.showWindowTimer); + } + this.showWindow = true; + this.resetShowWindowTimer(); + } + + const messagesObj = this.$refs.messages as HTMLDivElement; + this.$nextTick(() => { + messagesObj.scrollTop = messagesObj.scrollHeight; + }); + } + }, + computed: { + filteredMessages(): Message[] { + return this.messages.filter( + // show messages that are + // - (if the current mode is a channel) global, or in the current mode + // - (if the message is a channel) in the current mode + el => (el.modeData?.isChannel || this.modes[this.modeIdx].isChannel) ? + (el.mode === this.modes[this.modeIdx].name || el.modeData?.isGlobal) : + true + ); + }, + + suggestions(): Suggestion[] { + return this.backingSuggestions.filter( + el => this.removedSuggestions.indexOf(el.name) <= -1 + ); + }, + + hideAnimated(): boolean { + return this.hideState !== ChatHideStates.AlwaysHide; + }, + + modeIdxGet(): number { + return (this.modeIdx >= this.modes.length) ? (this.modes.length - 1) : this.modeIdx; + }, + + modePrefix(): string { + if (this.modes.length === 2) { + return `➤`; + } + + return this.modes[this.modeIdxGet].displayName; + }, + + modeColor(): string { + return this.modes[this.modeIdxGet].color; + }, + + hideStateString(): string { + // TODO: localization + switch (this.hideState) { + case ChatHideStates.AlwaysShow: + return 'Visible'; + case ChatHideStates.AlwaysHide: + return 'Hidden'; + case ChatHideStates.ShowWhenActive: + return 'When active'; + } + } + }, + methods: { + ON_SCREEN_STATE_CHANGE({ hideState, fromUserInteraction }: { hideState: ChatHideStates, fromUserInteraction: boolean }) { + this.hideState = hideState; + + if (this.hideState === ChatHideStates.AlwaysHide) { + if (!this.showInput) { + this.showWindow = false; + } + } else if (this.hideState === ChatHideStates.AlwaysShow) { + this.showWindow = true; + if (this.showWindowTimer) { + clearTimeout(this.showWindowTimer); + } + } else { + this.resetShowWindowTimer(); + } + + if (fromUserInteraction) { + this.showHideState = true; + + if (this.showHideStateTimer) { + clearTimeout(this.showHideStateTimer); + } + + this.showHideStateTimer = window.setTimeout(() => { + this.showHideState = false; + }, 1500); + } + }, + ON_OPEN() { + this.showInput = true; + this.showWindow = true; + if (this.showWindowTimer) { + clearTimeout(this.showWindowTimer); + } + this.focusTimer = window.setInterval(() => { + if (this.$refs.input) { + (this.$refs.input as HTMLInputElement).focus(); + } else { + clearInterval(this.focusTimer); + } + }, 100); + }, + ON_MESSAGE({ message }: { message: Message }) { + message.id = `${new Date().getTime()}${Math.random()}`; + message.modeData = this.modes.find(mode => mode.name === message.mode); + this.messages.push(message); + }, + ON_CLEAR() { + this.messages = []; + this.oldMessages = []; + this.oldMessagesIndex = -1; + }, + ON_SUGGESTION_ADD({ suggestion }: { suggestion: Suggestion }) { + this.removedSuggestions = this.removedSuggestions.filter(a => a !== suggestion.name); + const duplicateSuggestion = this.backingSuggestions.find( + a => a.name == suggestion.name + ); + if (duplicateSuggestion) { + if (suggestion.help || suggestion.params) { + duplicateSuggestion.help = suggestion.help || ""; + duplicateSuggestion.params = suggestion.params || []; + } + return; + } + if (!suggestion.params) { + suggestion.params = []; //TODO Move somewhere else + } + this.backingSuggestions.push(suggestion); + }, + ON_SUGGESTION_REMOVE({ name }: { name: string }) { + if (this.removedSuggestions.indexOf(name) <= -1) { + this.removedSuggestions.push(name); + } + }, + ON_MODE_ADD({ mode }: { mode: Mode }) { + this.modes = [ + ...this.modes.filter(a => a.name !== mode.name), + mode + ]; + }, + ON_MODE_REMOVE({ name }: { name: string }) { + this.modes = this.modes.filter(a => a.name !== name); + + if (this.modes.length === 0) { + this.modes = [defaultMode]; + } + }, + ON_TEMPLATE_ADD({ template }: { template: { id: string, html: string }}) { + if (this.templates[template.id]) { + this.warn(`Tried to add duplicate template '${template.id}'`); + } else { + this.templates[template.id] = template.html; + } + }, + ON_UPDATE_THEMES({ themes }: { themes: { [key: string]: ThemeData } }) { + this.removeThemes(); + + this.setThemes(themes); + }, + removeThemes() { + for (let i = 0; i < document.styleSheets.length; i++) { + const styleSheet = document.styleSheets[i]; + const node = styleSheet.ownerNode as Element; + + if (node.getAttribute("data-theme")) { + node.parentNode?.removeChild(node); + } + } + + this.tplBackups.reverse(); + + for (const [elem, oldData] of this.tplBackups) { + elem.innerText = oldData; + } + + this.tplBackups = []; + + this.msgTplBackups.reverse(); + + for (const [id, oldData] of this.msgTplBackups) { + this.templates[id] = oldData; + } + + this.msgTplBackups = []; + }, + setThemes(themes: { [key: string]: ThemeData }) { + for (const [id, data] of Object.entries(themes)) { + if (data.style) { + const style = document.createElement("style"); + style.type = "text/css"; + style.setAttribute("data-theme", id); + style.appendChild(document.createTextNode(data.style)); + + document.head.appendChild(style); + } + + if (data.styleSheet) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.type = "text/css"; + link.href = data.baseUrl + data.styleSheet; + link.setAttribute("data-theme", id); + + document.head.appendChild(link); + } + + if (data.templates) { + for (const [tplId, tpl] of Object.entries(data.templates)) { + const elem = document.getElementById(tplId); + + if (elem) { + this.tplBackups.push([elem, elem.innerText]); + elem.innerText = tpl; + } + } + } + + if (data.script) { + const script = document.createElement("script"); + script.type = "text/javascript"; + script.src = data.baseUrl + data.script; + + document.head.appendChild(script); + } + + if (data.msgTemplates) { + for (const [tplId, tpl] of Object.entries(data.msgTemplates)) { + this.msgTplBackups.push([tplId, this.templates[tplId]]); + this.templates[tplId] = tpl; + } + } + } + }, + warn(msg: string) { + this.messages.push({ + args: [msg], + template: "^3CHAT-WARN: ^0{0}" + }); + }, + clearShowWindowTimer() { + clearTimeout(this.showWindowTimer); + }, + resetShowWindowTimer() { + this.clearShowWindowTimer(); + this.showWindowTimer = window.setTimeout(() => { + if (this.hideState !== ChatHideStates.AlwaysShow && !this.showInput) { + this.showWindow = false; + } + }, CONFIG.fadeTimeout); + }, + keyUp() { + this.resize(); + }, + keyDown(e: KeyboardEvent) { + if (e.which === 38 || e.which === 40) { + e.preventDefault(); + this.moveOldMessageIndex(e.which === 38); + } else if (e.which == 33) { + var buf = document.getElementsByClassName("chat-messages")[0]; + buf.scrollTop = buf.scrollTop - 100; + } else if (e.which == 34) { + var buf = document.getElementsByClassName("chat-messages")[0]; + buf.scrollTop = buf.scrollTop + 100; + } else if (e.which === 9) { // tab + if (e.shiftKey || e.altKey) { + do { + --this.modeIdx; + + if (this.modeIdx < 0) { + this.modeIdx = this.modes.length - 1; + } + } while (this.modes[this.modeIdx].hidden); + } else { + do { + this.modeIdx = (this.modeIdx + 1) % this.modes.length; + } while (this.modes[this.modeIdx].hidden); + } + + const buf = document.getElementsByClassName('chat-messages')[0]; + setTimeout(() => buf.scrollTop = buf.scrollHeight, 0); + } + + this.resize(); + }, + moveOldMessageIndex(up: boolean) { + if (up && this.oldMessages.length > this.oldMessagesIndex + 1) { + this.oldMessagesIndex += 1; + this.message = this.oldMessages[this.oldMessagesIndex]; + } else if (!up && this.oldMessagesIndex - 1 >= 0) { + this.oldMessagesIndex -= 1; + this.message = this.oldMessages[this.oldMessagesIndex]; + } else if (!up && this.oldMessagesIndex - 1 === -1) { + this.oldMessagesIndex = -1; + this.message = ""; + } + }, + resize() { + const input = this.$refs.input as HTMLInputElement; + + // scrollHeight includes padding, but content-box excludes padding + // remove padding before setting height on the element + const style = getComputedStyle(input); + const paddingRemove = parseFloat(style.paddingBottom) + parseFloat(style.paddingTop); + + input.style.height = "5px"; + input.style.height = `${input.scrollHeight - paddingRemove}px`; + }, + send() { + if (this.message !== "") { + post( + "http://chat/chatResult", + JSON.stringify({ + message: this.message, + mode: this.modes[this.modeIdxGet].name + }) + ); + this.oldMessages.unshift(this.message); + this.oldMessagesIndex = -1; + this.hideInput(); + } else { + this.hideInput(true); + } + }, + hideInput(canceled = false) { + setTimeout(() => { + const input = this.$refs.input as HTMLInputElement; + delete input.style.height; + }, 50); + + if (canceled) { + post("http://chat/chatResult", JSON.stringify({ canceled })); + } + this.message = ""; + this.showInput = false; + clearInterval(this.focusTimer); + + if (this.hideState !== ChatHideStates.AlwaysHide) { + this.resetShowWindowTimer(); + } else { + this.showWindow = false; + } + } + } +}); \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/App.vue b/resources/[gameplay]/chat/html/App.vue new file mode 100644 index 0000000..9a76ab8 --- /dev/null +++ b/resources/[gameplay]/chat/html/App.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/Message.ts b/resources/[gameplay]/chat/html/Message.ts new file mode 100644 index 0000000..9326fd7 --- /dev/null +++ b/resources/[gameplay]/chat/html/Message.ts @@ -0,0 +1,102 @@ +import CONFIG from './config'; +import Vue, { PropType } from 'vue'; + +export default Vue.component('message', { + data() { + return {}; + }, + computed: { + textEscaped(): string { + let s = this.template ? this.template : this.templates[this.templateId]; + + //This hack is required to preserve backwards compatability + if (!this.template && this.templateId == CONFIG.defaultTemplateId + && this.args.length == 1) { + s = this.templates[CONFIG.defaultAltTemplateId] //Swap out default template :/ + } + + s = s.replace(`@default`, this.templates[this.templateId]); + + s = s.replace(/{(\d+)}/g, (match, number) => { + const argEscaped = this.args[number] != undefined ? this.escape(this.args[number]) : match; + if (number == 0 && this.color) { + //color is deprecated, use templates or ^1 etc. + return this.colorizeOld(argEscaped); + } + return argEscaped; + }); + + // format variant args + s = s.replace(/\{\{([a-zA-Z0-9_\-]+?)\}\}/g, (match, id) => { + const argEscaped = this.params[id] != undefined ? this.escape(this.params[id]) : match; + return argEscaped; + }); + + return this.colorize(s); + }, + }, + methods: { + colorizeOld(str: string): string { + return `${str}` + }, + colorize(str: string): string { + let s = "" + colorTrans(str) + ""; + + const styleDict: {[ key: string ]: string} = { + '*': 'font-weight: bold;', + '_': 'text-decoration: underline;', + '~': 'text-decoration: line-through;', + '=': 'text-decoration: underline line-through;', + 'r': 'text-decoration: none;font-weight: normal;', + }; + + const styleRegex = /\^(\_|\*|\=|\~|\/|r)(.*?)(?=$|\^r|<\/em>)/; + while (s.match(styleRegex)) { //Any better solution would be appreciated :P + s = s.replace(styleRegex, (str, style, inner) => `${inner}`) + } + return s.replace(/]*><\/span[^>]*>/g, ''); + + function colorTrans(str: string) { + return str + .replace(/\^([0-9])/g, (str, color) => ``) + .replace(/\^#([0-9A-F]{3,6})/gi, (str, color) => ``) + .replace(/~([a-z])~/g, (str, color) => ``); + } + }, + escape(unsafe: string): string { + return String(unsafe) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, + }, + props: { + templates: { + type: Object as PropType<{ [key: string]: string }>, + }, + args: { + type: Array as PropType, + }, + params: { + type: Object as PropType<{ [ key: string]: string }>, + }, + template: { + type: String, + default: null, + }, + templateId: { + type: String, + default: CONFIG.defaultTemplateId, + }, + multiline: { + type: Boolean, + default: false, + }, + color: { //deprecated + type: Array as PropType, + default: null, + }, + }, +}); diff --git a/resources/[gameplay]/chat/html/Message.vue b/resources/[gameplay]/chat/html/Message.vue new file mode 100644 index 0000000..7f87cea --- /dev/null +++ b/resources/[gameplay]/chat/html/Message.vue @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/Suggestions.ts b/resources/[gameplay]/chat/html/Suggestions.ts new file mode 100644 index 0000000..08cd9ae --- /dev/null +++ b/resources/[gameplay]/chat/html/Suggestions.ts @@ -0,0 +1,63 @@ +import CONFIG from './config'; +import Vue, { PropType } from 'vue'; + +export interface Suggestion { + name: string; + help: string; + params: string[]; + + disabled: boolean; +} + +export default Vue.component('suggestions', { + props: { + message: { + type: String + }, + + suggestions: { + type: Array as PropType + } + }, + data() { + return {}; + }, + computed: { + currentSuggestions(): Suggestion[] { + if (this.message === '') { + return []; + } + const currentSuggestions = this.suggestions.filter((s) => { + if (!s.name.startsWith(this.message)) { + const suggestionSplitted = s.name.split(' '); + const messageSplitted = this.message.split(' '); + for (let i = 0; i < messageSplitted.length; i += 1) { + if (i >= suggestionSplitted.length) { + return i < suggestionSplitted.length + s.params.length; + } + if (suggestionSplitted[i] !== messageSplitted[i]) { + return false; + } + } + } + return true; + }).slice(0, CONFIG.suggestionLimit); + + currentSuggestions.forEach((s) => { + // eslint-disable-next-line no-param-reassign + s.disabled = !s.name.startsWith(this.message); + + s.params.forEach((p, index) => { + const wType = (index === s.params.length - 1) ? '.' : '\\S'; + const regex = new RegExp(`${s.name} (?:\\w+ ){${index}}(?:${wType}*)$`, 'g'); + + // eslint-disable-next-line no-param-reassign + // @ts-ignore + p.disabled = this.message.match(regex) == null; + }); + }); + return currentSuggestions; + }, + }, + methods: {}, +}); diff --git a/resources/[gameplay]/chat/html/Suggestions.vue b/resources/[gameplay]/chat/html/Suggestions.vue new file mode 100644 index 0000000..d8d5c38 --- /dev/null +++ b/resources/[gameplay]/chat/html/Suggestions.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/config.ts b/resources/[gameplay]/chat/html/config.ts new file mode 100644 index 0000000..bd76f77 --- /dev/null +++ b/resources/[gameplay]/chat/html/config.ts @@ -0,0 +1,17 @@ +export default { + defaultTemplateId: 'default', //This is the default template for 2 args1 + defaultAltTemplateId: 'defaultAlt', //This one for 1 arg + templates: { //You can add static templates here + 'default': '{0}: {1}', + 'defaultAlt': '{0}', + 'print': '
{0}
', + 'example:important': '

^2{0}

' + }, + fadeTimeout: 7000, + suggestionLimit: 5, + style: { + background: 'rgba(52, 73, 94, 0.7)', + width: '38vw', + height: '22%', + } +}; diff --git a/resources/[gameplay]/chat/html/index.css b/resources/[gameplay]/chat/html/index.css new file mode 100644 index 0000000..df5c1c2 --- /dev/null +++ b/resources/[gameplay]/chat/html/index.css @@ -0,0 +1,160 @@ +.color-0{color: #ffffff;} +.color-1{color: #ff4444;} +.color-2{color: #99cc00;} +.color-3{color: #ffbb33;} +.color-4{color: #0099cc;} +.color-5{color: #33b5e5;} +.color-6{color: #aa66cc;} +.color-8{color: #cc0000;} +.color-9{color: #cc0068;} + +.gameColor-w{color: #ffffff;} +.gameColor-r{color: #ff4444;} +.gameColor-g{color: #99cc00;} +.gameColor-y{color: #ffbb33;} +.gameColor-b{color: #33b5e5;} + +/* todo: more game colors */ + +* { + font-family: 'Lato', sans-serif; + margin: 0; + padding: 0; +} + +.no-grow { + flex-grow: 0; +} + +em { + font-style: normal; +} + +#app { + font-family: 'Lato', Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: white; +} + +.chat-window { + position: absolute; + top: 1.5%; + left: 0.8%; + width: 38%; + height: 22%; + max-width: 1000px; + background-color: rgba(52, 73, 94, 0.7); + -webkit-animation-duration: 2s; +} + + +.chat-messages { + position: relative; + height: 95%; + font-size: 1.8vh; + margin: 1%; + + overflow-x: hidden; + overflow-y: hidden; +} + + +.chat-input { + font-size: 1.65vh; + position: absolute; + + top: 23.8%; + left: 0.8%; + width: 38%; + max-width: 1000px; + box-sizing: border-box; +} + +.chat-input > div.input { + position: relative; + display: flex; + align-items: stretch; + width: 100%; + background-color: rgba(44, 62, 80, 1.0); +} + +.chat-hide-state { + text-transform: uppercase; + margin-left: 0.05vw; + font-size: 1.65vh; +} + +.prefix { + font-size: 1.8vh; + /*position: absolute; + top: 0%;*/ + height: 100%; + vertical-align: middle; + line-height: calc(1vh + 1vh + 1.85vh); + padding-left: 0.5vh; + text-transform: uppercase; + font-weight: bold; + display: inline-block; +} + +textarea { + font-size: 1.65vh; + line-height: 1.85vh; + display: block; + box-sizing: content-box; + padding: 1vh; + padding-left: 0.5vh; + color: white; + border-width: 0; + height: 3.15%; + overflow: hidden; + text-overflow: ellipsis; + flex: 1; + background-color: transparent; +} + +textarea:focus, input:focus { + outline: none; +} + +.msg { + margin-bottom: 0.28%; +} + +.multiline { + margin-left: 4%; + text-indent: -1.2rem; + white-space: pre-line; +} + +.suggestions { + list-style-type: none; + padding: 0.5%; + padding-left: 1.4%; + font-size: 1.65vh; + box-sizing: border-box; + color: white; + background-color: rgba(44, 62, 80, 1.0); + width: 100%; +} + +.help { + color: #b0bbbd; +} + +.disabled { + color: #b0bbbd; +} + +.suggestion { + margin-bottom: 0.5%; +} + +.hidden { + opacity: 0; +} + +.hidden.animated { + transition: opacity 1s; +} \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/index.d.ts b/resources/[gameplay]/chat/html/index.d.ts new file mode 100644 index 0000000..314e3aa --- /dev/null +++ b/resources/[gameplay]/chat/html/index.d.ts @@ -0,0 +1,4 @@ +declare module '*.vue' { + import Vue from 'vue' + export default Vue +} \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/index.html b/resources/[gameplay]/chat/html/index.html new file mode 100644 index 0000000..c9b40ac --- /dev/null +++ b/resources/[gameplay]/chat/html/index.html @@ -0,0 +1,14 @@ + + + + + + + + + + + +
+ + diff --git a/resources/[gameplay]/chat/html/main.ts b/resources/[gameplay]/chat/html/main.ts new file mode 100644 index 0000000..9a487fd --- /dev/null +++ b/resources/[gameplay]/chat/html/main.ts @@ -0,0 +1,7 @@ +import Vue from 'vue'; +import App from './App.vue'; + +const instance = new Vue({ + el: '#app', + render: h => h(App), +}); \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/tsconfig.json b/resources/[gameplay]/chat/html/tsconfig.json new file mode 100644 index 0000000..9a44563 --- /dev/null +++ b/resources/[gameplay]/chat/html/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "outDir": "./", + "module": "es6", + "strict": true, + "moduleResolution": "node", + "target": "es6", + "allowJs": true, + "lib": [ + "es2017", + "dom" + ] + }, + "include": [ + "./**/*" + ], + "exclude": [] +} \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/utils.ts b/resources/[gameplay]/chat/html/utils.ts new file mode 100644 index 0000000..76c30e5 --- /dev/null +++ b/resources/[gameplay]/chat/html/utils.ts @@ -0,0 +1,31 @@ +export function post(url: string, data: any) { + var request = new XMLHttpRequest(); + request.open('POST', url, true); + request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); + request.send(data); +} + +function emulate(type: string, detail = {}) { + const detailRef = { + type, + ...detail + }; + + window.dispatchEvent(new CustomEvent('message', { + detail: detailRef + })); +} + +(window as any)['emulate'] = emulate; + +(window as any)['demo'] = () => { + emulate('ON_MESSAGE', { + message: { + args: [ 'me', 'hello!' ] + } + }) + + emulate('ON_SCREEN_STATE_CHANGE', { + shouldHide: false + }); +}; \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/vendor/animate.3.5.2.min.css b/resources/[gameplay]/chat/html/vendor/animate.3.5.2.min.css new file mode 100644 index 0000000..b6f6129 --- /dev/null +++ b/resources/[gameplay]/chat/html/vendor/animate.3.5.2.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.1 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2016 Daniel Eden + */ + +.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.hinge{-webkit-animation-duration:2s;animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{-webkit-animation-duration:.75s;animation-duration:.75s}@-webkit-keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}40%,43%,70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}70%{-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}@keyframes bounce{0%,20%,53%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1);-webkit-transform:translateZ(0);transform:translateZ(0)}40%,43%{-webkit-transform:translate3d(0,-30px,0);transform:translate3d(0,-30px,0)}40%,43%,70%{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}70%{-webkit-transform:translate3d(0,-15px,0);transform:translate3d(0,-15px,0)}90%{-webkit-transform:translate3d(0,-4px,0);transform:translate3d(0,-4px,0)}}.bounce{-webkit-animation-name:bounce;animation-name:bounce;-webkit-transform-origin:center bottom;transform-origin:center bottom}@-webkit-keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.pulse{-webkit-animation-name:pulse;animation-name:pulse}@-webkit-keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.shake{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.headShake{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-name:headShake;animation-name:headShake}@-webkit-keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes swing{20%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}40%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}80%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}.swing{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;animation-name:swing}@-webkit-keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes tada{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}10%,20%{-webkit-transform:scale3d(.9,.9,.9) rotate(-3deg);transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(3deg);transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale3d(1.1,1.1,1.1) rotate(-3deg);transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.tada{-webkit-animation-name:tada;animation-name:tada}@-webkit-keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:none;transform:none}}@keyframes wobble{0%{-webkit-transform:none;transform:none}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:none;transform:none}}.wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes jello{0%,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}@keyframes jello{0%,11.1%,to{-webkit-transform:none;transform:none}22.2%{-webkit-transform:skewX(-12.5deg) skewY(-12.5deg);transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{-webkit-transform:skewX(6.25deg) skewY(6.25deg);transform:skewX(6.25deg) skewY(6.25deg)}44.4%{-webkit-transform:skewX(-3.125deg) skewY(-3.125deg);transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{-webkit-transform:skewX(1.5625deg) skewY(1.5625deg);transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{-webkit-transform:skewX(-.78125deg) skewY(-.78125deg);transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{-webkit-transform:skewX(.390625deg) skewY(.390625deg);transform:skewX(.390625deg) skewY(.390625deg)}88.8%{-webkit-transform:skewX(-.1953125deg) skewY(-.1953125deg);transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{-webkit-animation-name:jello;animation-name:jello;-webkit-transform-origin:center;transform-origin:center}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}.bounceIn{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0);transform:translate3d(0,-3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}to{-webkit-transform:none;transform:none}}.bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0);transform:translate3d(-3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}@keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0);transform:translate3d(3000px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}to{-webkit-transform:none;transform:none}}.bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0);transform:translate3d(0,3000px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes bounceOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}.bounceOut{-webkit-animation-name:bounceOut;animation-name:bounceOut}@-webkit-keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes bounceOutDown{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.bounceOutDown{-webkit-animation-name:bounceOutDown;animation-name:bounceOutDown}@-webkit-keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes bounceOutLeft{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.bounceOutLeft{-webkit-animation-name:bounceOutLeft;animation-name:bounceOutLeft}@-webkit-keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes bounceOutRight{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.bounceOutRight{-webkit-animation-name:bounceOutRight;animation-name:bounceOutRight}@-webkit-keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes bounceOutUp{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.bounceOutUp{-webkit-animation-name:bounceOutUp;animation-name:bounceOutUp}@-webkit-keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInDownBig{0%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInDownBig{-webkit-animation-name:fadeInDownBig;animation-name:fadeInDownBig}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInLeftBig{0%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInLeftBig{-webkit-animation-name:fadeInLeftBig;animation-name:fadeInLeftBig}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInRightBig{0%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInRightBig{-webkit-animation-name:fadeInRightBig;animation-name:fadeInRightBig}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}to{opacity:1;-webkit-transform:none;transform:none}}.fadeInUpBig{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes fadeOut{0%{opacity:1}to{opacity:0}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}@-webkit-keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}.fadeOutDownBig{-webkit-animation-name:fadeOutDownBig;animation-name:fadeOutDownBig}@-webkit-keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.fadeOutLeft{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}@-webkit-keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{-webkit-animation-name:fadeOutLeftBig;animation-name:fadeOutLeftBig}@-webkit-keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.fadeOutRight{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.fadeOutRightBig{-webkit-animation-name:fadeOutRightBig;animation-name:fadeOutRightBig}@-webkit-keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.fadeOutUp{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}@-webkit-keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{-webkit-animation-name:fadeOutUpBig;animation-name:fadeOutUpBig}@-webkit-keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(-1turn);transform:perspective(400px) rotateY(-1turn)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-190deg);transform:perspective(400px) translateZ(150px) rotateY(-190deg)}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-170deg);transform:perspective(400px) translateZ(150px) rotateY(-170deg)}50%,80%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95)}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}@keyframes flip{0%{-webkit-transform:perspective(400px) rotateY(-1turn);transform:perspective(400px) rotateY(-1turn)}0%,40%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-190deg);transform:perspective(400px) translateZ(150px) rotateY(-190deg)}50%{-webkit-transform:perspective(400px) translateZ(150px) rotateY(-170deg);transform:perspective(400px) translateZ(150px) rotateY(-170deg)}50%,80%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}80%{-webkit-transform:perspective(400px) scale3d(.95,.95,.95);transform:perspective(400px) scale3d(.95,.95,.95)}to{-webkit-transform:perspective(400px);transform:perspective(400px);-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;-webkit-animation-name:flip;animation-name:flip}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg)}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInX;animation-name:flipInX}@-webkit-keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}0%,40%{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg)}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipInY;animation-name:flipInY}@-webkit-keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{-webkit-animation-name:flipOutX;animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@-webkit-keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;-webkit-animation-name:flipOutY;animation-name:flipOutY}@-webkit-keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg)}60%,80%{opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:none;transform:none;opacity:1}}@keyframes lightSpeedIn{0%{-webkit-transform:translate3d(100%,0,0) skewX(-30deg);transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{-webkit-transform:skewX(20deg);transform:skewX(20deg)}60%,80%{opacity:1}80%{-webkit-transform:skewX(-5deg);transform:skewX(-5deg)}to{-webkit-transform:none;transform:none;opacity:1}}.lightSpeedIn{-webkit-animation-name:lightSpeedIn;animation-name:lightSpeedIn;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-webkit-keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}@keyframes lightSpeedOut{0%{opacity:1}to{-webkit-transform:translate3d(100%,0,0) skewX(30deg);transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{-webkit-animation-name:lightSpeedOut;animation-name:lightSpeedOut;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes rotateIn{0%{transform-origin:center;-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateIn{0%{transform-origin:center;-webkit-transform:rotate(-200deg);transform:rotate(-200deg);opacity:0}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:none;transform:none;opacity:1}}.rotateIn{-webkit-animation-name:rotateIn;animation-name:rotateIn}@-webkit-keyframes rotateInDownLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownLeft{-webkit-animation-name:rotateInDownLeft;animation-name:rotateInDownLeft}@-webkit-keyframes rotateInDownRight{0%{transform-origin:right bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInDownRight{0%{transform-origin:right bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInDownRight{-webkit-animation-name:rotateInDownRight;animation-name:rotateInDownRight}@-webkit-keyframes rotateInUpLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpLeft{-webkit-animation-name:rotateInUpLeft;animation-name:rotateInUpLeft}@-webkit-keyframes rotateInUpRight{0%{transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}@keyframes rotateInUpRight{0%{transform-origin:right bottom;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);opacity:0}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:none;transform:none;opacity:1}}.rotateInUpRight{-webkit-animation-name:rotateInUpRight;animation-name:rotateInUpRight}@-webkit-keyframes rotateOut{0%{transform-origin:center;opacity:1}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}@keyframes rotateOut{0%{transform-origin:center;opacity:1}0%,to{-webkit-transform-origin:center}to{transform-origin:center;-webkit-transform:rotate(200deg);transform:rotate(200deg);opacity:0}}.rotateOut{-webkit-animation-name:rotateOut;animation-name:rotateOut}@-webkit-keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(45deg);transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{-webkit-animation-name:rotateOutDownLeft;animation-name:rotateOutDownLeft}@-webkit-keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{-webkit-animation-name:rotateOutDownRight;animation-name:rotateOutDownRight}@-webkit-keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}0%,to{-webkit-transform-origin:left bottom}to{transform-origin:left bottom;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{-webkit-animation-name:rotateOutUpLeft;animation-name:rotateOutUpLeft}@-webkit-keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}0%,to{-webkit-transform-origin:right bottom}to{transform-origin:right bottom;-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:0}}.rotateOutUpRight{-webkit-animation-name:rotateOutUpRight;animation-name:rotateOutUpRight}@-webkit-keyframes hinge{0%{transform-origin:top left}0%,20%,60%{-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}@keyframes hinge{0%{transform-origin:top left}0%,20%,60%{-webkit-transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}20%,60%{-webkit-transform:rotate(80deg);transform:rotate(80deg);transform-origin:top left}40%,80%{-webkit-transform:rotate(60deg);transform:rotate(60deg);-webkit-transform-origin:top left;transform-origin:top left;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1}to{-webkit-transform:translate3d(0,700px,0);transform:translate3d(0,700px,0);opacity:0}}.hinge{-webkit-animation-name:hinge;animation-name:hinge}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0) rotate(-120deg);transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;-webkit-transform:none;transform:none}}.rollIn{-webkit-animation-name:rollIn;animation-name:rollIn}@-webkit-keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}@keyframes rollOut{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(100%,0,0) rotate(120deg);transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{-webkit-animation-name:rollOut;animation-name:rollOut}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{-webkit-animation-name:zoomIn;animation-name:zoomIn}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(10px,0,0);transform:scale3d(.475,.475,.475) translate3d(10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInRight{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{-webkit-animation-name:zoomInRight;animation-name:zoomInRight}@-webkit-keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomInUp{0%{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{-webkit-animation-name:zoomInUp;animation-name:zoomInUp}@-webkit-keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%,to{opacity:0}}@keyframes zoomOut{0%{opacity:1}50%{-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}50%,to{opacity:0}}.zoomOut{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutDown{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{-webkit-animation-name:zoomOutDown;animation-name:zoomOutDown}@-webkit-keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}@keyframes zoomOutLeft{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(42px,0,0);transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(-2000px,0,0);transform:scale(.1) translate3d(-2000px,0,0);-webkit-transform-origin:left center;transform-origin:left center}}.zoomOutLeft{-webkit-animation-name:zoomOutLeft;animation-name:zoomOutLeft}@-webkit-keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}@keyframes zoomOutRight{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(-42px,0,0);transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;-webkit-transform:scale(.1) translate3d(2000px,0,0);transform:scale(.1) translate3d(2000px,0,0);-webkit-transform-origin:right center;transform-origin:right center}}.zoomOutRight{-webkit-animation-name:zoomOutRight;animation-name:zoomOutRight}@-webkit-keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}@keyframes zoomOutUp{40%{opacity:1;-webkit-transform:scale3d(.475,.475,.475) translate3d(0,60px,0);transform:scale3d(.475,.475,.475) translate3d(0,60px,0);-webkit-animation-timing-function:cubic-bezier(.55,.055,.675,.19);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;-webkit-transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{-webkit-animation-name:zoomOutUp;animation-name:zoomOutUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes slideOutDown{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.slideOutDown{-webkit-animation-name:slideOutDown;animation-name:slideOutDown}@-webkit-keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideOutLeft{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.slideOutLeft{-webkit-animation-name:slideOutLeft;animation-name:slideOutLeft}@-webkit-keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideOutRight{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slideOutRight{-webkit-animation-name:slideOutRight;animation-name:slideOutRight}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideOutUp{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}to{visibility:hidden;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideOutUp{-webkit-animation-name:slideOutUp;animation-name:slideOutUp} \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/vendor/flexboxgrid.6.3.1.min.css b/resources/[gameplay]/chat/html/vendor/flexboxgrid.6.3.1.min.css new file mode 100644 index 0000000..2f502c9 --- /dev/null +++ b/resources/[gameplay]/chat/html/vendor/flexboxgrid.6.3.1.min.css @@ -0,0 +1 @@ +.container,.container-fluid{margin-right:auto;margin-left:auto}.container-fluid{padding-right:2rem;padding-left:2rem}.row{box-sizing:border-box;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-.5rem;margin-left:-.5rem}.row.reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.col.reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.col-xs,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-offset-0,.col-xs-offset-1,.col-xs-offset-10,.col-xs-offset-11,.col-xs-offset-12,.col-xs-offset-2,.col-xs-offset-3,.col-xs-offset-4,.col-xs-offset-5,.col-xs-offset-6,.col-xs-offset-7,.col-xs-offset-8,.col-xs-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-right:.5rem;padding-left:.5rem}.col-xs{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-xs-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-xs-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-xs-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-xs-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-xs-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-xs-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-xs-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-xs-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-xs-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-xs-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-xs-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-xs-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.start-xs{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-xs{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-xs{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-xs{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-xs{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-xs{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-xs{-ms-flex-pack:distribute;justify-content:space-around}.between-xs{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-xs{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-xs{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}@media only screen and (min-width:48em){.container{width:49rem}.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-offset-0,.col-sm-offset-1,.col-sm-offset-10,.col-sm-offset-11,.col-sm-offset-12,.col-sm-offset-2,.col-sm-offset-3,.col-sm-offset-4,.col-sm-offset-5,.col-sm-offset-6,.col-sm-offset-7,.col-sm-offset-8,.col-sm-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-right:.5rem;padding-left:.5rem}.col-sm{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-sm-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-sm-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-sm-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-sm-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-sm-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-sm-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-sm-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-sm-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-sm-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-sm-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-sm-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-sm-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.start-sm{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-sm{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-sm{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-sm{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-sm{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-sm{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-sm{-ms-flex-pack:distribute;justify-content:space-around}.between-sm{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-sm{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-sm{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media only screen and (min-width:64em){.container{width:65rem}.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-offset-0,.col-md-offset-1,.col-md-offset-10,.col-md-offset-11,.col-md-offset-12,.col-md-offset-2,.col-md-offset-3,.col-md-offset-4,.col-md-offset-5,.col-md-offset-6,.col-md-offset-7,.col-md-offset-8,.col-md-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-right:.5rem;padding-left:.5rem}.col-md{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-md-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-md-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-md-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-md-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-md-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-md-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-md-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-md-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-md-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-md-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-md-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-md-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.start-md{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-md{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-md{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-md{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-md{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-md{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-md{-ms-flex-pack:distribute;justify-content:space-around}.between-md{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-md{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-md{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}}@media only screen and (min-width:75em){.container{width:76rem}.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-offset-0,.col-lg-offset-1,.col-lg-offset-10,.col-lg-offset-11,.col-lg-offset-12,.col-lg-offset-2,.col-lg-offset-3,.col-lg-offset-4,.col-lg-offset-5,.col-lg-offset-6,.col-lg-offset-7,.col-lg-offset-8,.col-lg-offset-9{box-sizing:border-box;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding-right:.5rem;padding-left:.5rem}.col-lg{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-ms-flex-preferred-size:0;flex-basis:0;max-width:100%}.col-lg-1{-ms-flex-preferred-size:8.33333333%;flex-basis:8.33333333%;max-width:8.33333333%}.col-lg-2{-ms-flex-preferred-size:16.66666667%;flex-basis:16.66666667%;max-width:16.66666667%}.col-lg-3{-ms-flex-preferred-size:25%;flex-basis:25%;max-width:25%}.col-lg-4{-ms-flex-preferred-size:33.33333333%;flex-basis:33.33333333%;max-width:33.33333333%}.col-lg-5{-ms-flex-preferred-size:41.66666667%;flex-basis:41.66666667%;max-width:41.66666667%}.col-lg-6{-ms-flex-preferred-size:50%;flex-basis:50%;max-width:50%}.col-lg-7{-ms-flex-preferred-size:58.33333333%;flex-basis:58.33333333%;max-width:58.33333333%}.col-lg-8{-ms-flex-preferred-size:66.66666667%;flex-basis:66.66666667%;max-width:66.66666667%}.col-lg-9{-ms-flex-preferred-size:75%;flex-basis:75%;max-width:75%}.col-lg-10{-ms-flex-preferred-size:83.33333333%;flex-basis:83.33333333%;max-width:83.33333333%}.col-lg-11{-ms-flex-preferred-size:91.66666667%;flex-basis:91.66666667%;max-width:91.66666667%}.col-lg-12{-ms-flex-preferred-size:100%;flex-basis:100%;max-width:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.start-lg{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;text-align:start}.center-lg{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;text-align:center}.end-lg{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;text-align:end}.top-lg{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.middle-lg{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.bottom-lg{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.around-lg{-ms-flex-pack:distribute;justify-content:space-around}.between-lg{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.first-lg{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.last-lg{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}} \ No newline at end of file diff --git a/resources/[gameplay]/chat/html/vendor/fonts/LatoBold.woff2 b/resources/[gameplay]/chat/html/vendor/fonts/LatoBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8ba37ada4ed5a417c8af93ed705c1eb787e02f78 GIT binary patch literal 5084 zcmV<26C><*Pew8T0RR9102AB*5C8xG04sO^026`$0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/resources/[gameplay]/chat/html/vendor/fonts/LatoBold2.woff2 b/resources/[gameplay]/chat/html/vendor/fonts/LatoBold2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..8dfc7fd63de6f5f0df002ef1a98de6163d8959cb GIT binary patch literal 22656 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 ZkXe~GW=-whF1}Ekx$9GXcV;pJ0085;&%FQu literal 0 HcmV?d00001 diff --git a/resources/[gameplay]/chat/html/vendor/fonts/LatoLight.woff2 b/resources/[gameplay]/chat/html/vendor/fonts/LatoLight.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2913c8cd8c846f9f1049d785856c9f34773f2d5d GIT binary patch literal 5364 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 AUjP6A literal 0 HcmV?d00001 diff --git a/resources/[gameplay]/chat/html/vendor/fonts/LatoLight2.woff2 b/resources/[gameplay]/chat/html/vendor/fonts/LatoLight2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f0611d5c9af9a64e2f63cd371abc993f3c3c5e9a GIT binary patch literal 23012 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 KZGCQs0RRBK!}Ey% literal 0 HcmV?d00001 diff --git a/resources/[gameplay]/chat/html/vendor/fonts/LatoRegular2.woff2 b/resources/[gameplay]/chat/html/vendor/fonts/LatoRegular2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..63ea29229a6b19c8ada1e2a11a78f6be11520dc2 GIT binary patch literal 23216 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�ShV(KVSB;$X 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 literal 0 HcmV?d00001 diff --git a/resources/[gameplay]/chat/html/vendor/latofonts.css b/resources/[gameplay]/chat/html/vendor/latofonts.css new file mode 100644 index 0000000..a715fc4 --- /dev/null +++ b/resources/[gameplay]/chat/html/vendor/latofonts.css @@ -0,0 +1,48 @@ +/* latin-ext */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 300; + src: local('Lato Light'), local('Lato-Light'), url(fonts/LatoLight.woff2); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 300; + src: local('Lato Light'), local('Lato-Light'), url(fonts/LatoLight2.woff2); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} +/* latin-ext */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url(fonts/LatoRegular.woff2); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local('Lato Regular'), local('Lato-Regular'), url(fonts/LatoRegular2.woff2); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} +/* latin-ext */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: local('Lato Bold'), local('Lato-Bold'), url(fonts/LatoBold.woff2); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 700; + src: local('Lato Bold'), local('Lato-Bold'), url(fonts/LatoBold2.woff2); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} diff --git a/resources/[gameplay]/chat/package.json b/resources/[gameplay]/chat/package.json new file mode 100644 index 0000000..037070b --- /dev/null +++ b/resources/[gameplay]/chat/package.json @@ -0,0 +1,24 @@ +{ + "name": "chat", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@types/vue": "^2.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.4.2", + "html-webpack-inline-source-plugin": "^0.0.10", + "html-webpack-plugin": "^3.2.0", + "ts-loader": "^6.2.1", + "typescript": "^3.8.3", + "vue": "^2.6.11", + "vue-loader": "^15.9.0", + "vue-template-compiler": "^2.6.11", + "webpack": "4" + }, + "devDependencies": { + "command-line-args": "^5.1.1", + "webpack-cli": "^3.3.11", + "webpack-dev-server": "^3.10.3" + } +} diff --git a/resources/[gameplay]/chat/sv_chat.lua b/resources/[gameplay]/chat/sv_chat.lua new file mode 100644 index 0000000..aa16c34 --- /dev/null +++ b/resources/[gameplay]/chat/sv_chat.lua @@ -0,0 +1,293 @@ +RegisterServerEvent('chat:init') +RegisterServerEvent('chat:addTemplate') +RegisterServerEvent('chat:addMessage') +RegisterServerEvent('chat:addSuggestion') +RegisterServerEvent('chat:removeSuggestion') +RegisterServerEvent('_chat:messageEntered') +RegisterServerEvent('chat:clear') +RegisterServerEvent('__cfx_internal:commandFallback') + +-- this is a built-in event, but somehow needs to be registered +RegisterNetEvent('playerJoining') + +exports('addMessage', function(target, message) + if not message then + message = target + target = -1 + end + + if not target or not message then return end + + TriggerClientEvent('chat:addMessage', target, message) +end) + +local hooks = {} +local hookIdx = 1 + +exports('registerMessageHook', function(hook) + local resource = GetInvokingResource() + hooks[hookIdx + 1] = { + fn = hook, + resource = resource + } + + hookIdx = hookIdx + 1 +end) + +local modes = {} + +local function getMatchingPlayers(seObject) + local players = GetPlayers() + local retval = {} + + for _, v in ipairs(players) do + if IsPlayerAceAllowed(v, seObject) then + retval[#retval + 1] = v + end + end + + return retval +end + +exports('registerMode', function(modeData) + if not modeData.name or not modeData.displayName or not modeData.cb then + return false + end + + local resource = GetInvokingResource() + + modes[modeData.name] = modeData + modes[modeData.name].resource = resource + + local clObj = { + name = modeData.name, + displayName = modeData.displayName, + color = modeData.color or '#fff', + isChannel = modeData.isChannel, + isGlobal = modeData.isGlobal, + } + + if not modeData.seObject then + TriggerClientEvent('chat:addMode', -1, clObj) + else + for _, v in ipairs(getMatchingPlayers(modeData.seObject)) do + TriggerClientEvent('chat:addMode', v, clObj) + end + end + + return true +end) + +local function unregisterHooks(resource) + local toRemove = {} + + for k, v in pairs(hooks) do + if v.resource == resource then + table.insert(toRemove, k) + end + end + + for _, v in ipairs(toRemove) do + hooks[v] = nil + end + + toRemove = {} + + for k, v in pairs(modes) do + if v.resource == resource then + table.insert(toRemove, k) + end + end + + for _, v in ipairs(toRemove) do + TriggerClientEvent('chat:removeMode', -1, { + name = v + }) + + modes[v] = nil + end +end + +local function routeMessage(source, author, message, mode, fromConsole) + if source >= 1 then + author = GetPlayerName(source) + end + + local outMessage = { + color = { 255, 255, 255 }, + multiline = true, + args = { message }, + mode = mode + } + + if author ~= "" then + outMessage.args = { author, message } + end + + if mode and modes[mode] then + local modeData = modes[mode] + + if modeData.seObject and not IsPlayerAceAllowed(source, modeData.seObject) then + return + end + end + + local messageCanceled = false + local routingTarget = -1 + + local hookRef = { + updateMessage = function(t) + -- shallow merge + for k, v in pairs(t) do + if k == 'template' then + outMessage['template'] = v:gsub('%{%}', outMessage['template'] or '@default') + elseif k == 'params' then + if not outMessage.params then + outMessage.params = {} + end + + for pk, pv in pairs(v) do + outMessage.params[pk] = pv + end + else + outMessage[k] = v + end + end + end, + + cancel = function() + messageCanceled = true + end, + + setSeObject = function(object) + routingTarget = getMatchingPlayers(object) + end, + + setRouting = function(target) + routingTarget = target + end + } + + for _, hook in pairs(hooks) do + if hook.fn then + hook.fn(source, outMessage, hookRef) + end + end + + if modes[mode] then + local m = modes[mode] + + m.cb(source, outMessage, hookRef) + end + + if messageCanceled then + return + end + + TriggerEvent('chatMessage', source, #outMessage.args > 1 and outMessage.args[1] or '', outMessage.args[#outMessage.args]) + + if not WasEventCanceled() then + if type(routingTarget) ~= 'table' then + TriggerClientEvent('chat:addMessage', routingTarget, outMessage) + else + for _, id in ipairs(routingTarget) do + TriggerClientEvent('chat:addMessage', id, outMessage) + end + end + end + + if not fromConsole then + print(author .. '^7' .. (modes[mode] and (' (' .. modes[mode].displayName .. ')') or '') .. ': ' .. message .. '^7') + end +end + +AddEventHandler('_chat:messageEntered', function(author, color, message, mode) + if not message or not author then + return + end + + local source = source + + routeMessage(source, author, message, mode) +end) + +AddEventHandler('__cfx_internal:commandFallback', function(command) + local name = GetPlayerName(source) + + -- route the message as if it were a /command + routeMessage(source, name, '/' .. command, nil, true) + + CancelEvent() +end) + +-- player join messages +AddEventHandler('playerJoining', function() + if GetConvarInt('chat_showJoins', 1) == 0 then + return + end + + TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) .. ' joined.') +end) + +AddEventHandler('playerDropped', function(reason) + if GetConvarInt('chat_showQuits', 1) == 0 then + return + end + + TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) ..' left (' .. reason .. ')') +end) + +RegisterCommand('say', function(source, args, rawCommand) + routeMessage(source, (source == 0) and 'console' or GetPlayerName(source), rawCommand:sub(5), nil, true) +end) + +-- command suggestions for clients +local function refreshCommands(player) + if GetRegisteredCommands then + local registeredCommands = GetRegisteredCommands() + + local suggestions = {} + + for _, command in ipairs(registeredCommands) do + if IsPlayerAceAllowed(player, ('command.%s'):format(command.name)) then + table.insert(suggestions, { + name = '/' .. command.name, + help = '' + }) + end + end + + TriggerClientEvent('chat:addSuggestions', player, suggestions) + end +end + +AddEventHandler('chat:init', function() + local source = source + refreshCommands(source) + + for _, modeData in pairs(modes) do + local clObj = { + name = modeData.name, + displayName = modeData.displayName, + color = modeData.color or '#fff', + isChannel = modeData.isChannel, + isGlobal = modeData.isGlobal, + } + + if not modeData.seObject or IsPlayerAceAllowed(source, modeData.seObject) then + TriggerClientEvent('chat:addMode', source, clObj) + end + end +end) + +AddEventHandler('onServerResourceStart', function(resName) + Wait(500) + + for _, player in ipairs(GetPlayers()) do + refreshCommands(player) + end +end) + +AddEventHandler('onResourceStop', function(resName) + unregisterHooks(resName) +end) \ No newline at end of file diff --git a/resources/[gameplay]/chat/webpack.config.js b/resources/[gameplay]/chat/webpack.config.js new file mode 100644 index 0000000..530d9d5 --- /dev/null +++ b/resources/[gameplay]/chat/webpack.config.js @@ -0,0 +1,45 @@ +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin'); +const VueLoaderPlugin = require('vue-loader/lib/plugin'); +const CopyPlugin = require('copy-webpack-plugin'); + +module.exports = { + mode: 'production', + entry: './html/main.ts', + module: { + rules: [ + { + test: /\.ts$/, + loader: 'ts-loader', + exclude: /node_modules/, + options: { + appendTsSuffixTo: [/\.vue$/], + } + }, + { + test: /\.vue$/, + loader: 'vue-loader' + }, + ] + }, + plugins: [ + new VueLoaderPlugin(), + new HtmlWebpackPlugin({ + inlineSource: '.(js|css)$', + template: './html/index.html', + filename: 'ui.html' + }), + new HtmlWebpackInlineSourcePlugin(), + new CopyPlugin([ + { from: 'html/index.css', to: 'index.css' } + ]), + ], + resolve: { + extensions: [ '.ts', '.js' ] + }, + output: { + filename: 'chat.js', + path: __dirname + '/dist/' + }, + //devtool: 'inline-source-map' +}; \ No newline at end of file diff --git a/resources/[gameplay]/chat/yarn.lock b/resources/[gameplay]/chat/yarn.lock new file mode 100644 index 0000000..4a578f1 --- /dev/null +++ b/resources/[gameplay]/chat/yarn.lock @@ -0,0 +1,4549 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*": + version "13.11.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7" + integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g== + +"@types/vue@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/vue/-/vue-2.0.0.tgz#ec77b3d89591deb9ca5cb052368aa9c32be088e7" + integrity sha1-7Hez2JWR3rnKXLBSNoqpwyvgiOc= + dependencies: + vue "*" + +"@vue/component-compiler-utils@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575" + integrity sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw== + dependencies: + consolidate "^0.15.1" + hash-sum "^1.0.2" + lru-cache "^4.1.2" + merge-source-map "^1.1.0" + postcss "^7.0.14" + postcss-selector-parser "^6.0.2" + prettier "^1.18.2" + source-map "~0.6.1" + vue-template-es2015-compiler "^1.9.0" + +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== + dependencies: + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== + +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== + +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== + +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== + dependencies: + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== + +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== + dependencies: + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" + +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== + +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" + +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" + +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn@^6.2.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2: + version "6.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" + integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-back@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.1.1, bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^12.0.2: + version "12.0.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" + integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cacache@^12.0.3: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@2.4.2, chalk@^2.3.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.0.2, chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clean-css@4.2.x: + version "4.2.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" + integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== + dependencies: + source-map "~0.6.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +command-line-args@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" + integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== + dependencies: + array-back "^3.0.1" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +commander@2.17.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@~2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +consolidate@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" + integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== + dependencies: + bluebird "^3.1.1" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-webpack-plugin@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88" + integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg== + dependencies: + cacache "^12.0.3" + find-cache-dir "^2.1.0" + glob-parent "^3.1.0" + globby "^7.1.1" + is-glob "^4.0.1" + loader-utils "^1.2.3" + minimatch "^3.0.4" + normalize-path "^3.0.0" + p-limit "^2.2.1" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + webpack-log "^2.0.0" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-loader@^3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" + integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + dependencies: + camelcase "^5.3.1" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^1.2.3" + normalize-path "^3.0.0" + postcss "^7.0.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-select@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" + integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.0.0, debug@^3.1.1, debug@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1, domelementtype@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" + integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +elliptic@^6.0.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" + integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +es-abstract@^1.17.0-next.1: + version "1.17.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" + integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.1: + version "0.11.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" + integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + dependencies: + websocket-driver ">=0.5.1" + +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== + dependencies: + debug "^3.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash-sum@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" + integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.x, he@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + +html-minifier@^3.2.3: + version "3.5.21" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" + integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== + dependencies: + camel-case "3.0.x" + clean-css "4.2.x" + commander "2.17.x" + he "1.2.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.4.x" + +html-webpack-inline-source-plugin@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/html-webpack-inline-source-plugin/-/html-webpack-inline-source-plugin-0.0.10.tgz#89bd5f761e4f16902aa76a44476eb52831c9f7f0" + integrity sha512-0ZNU57u7283vrXSF5a4VDnVOMWiSwypKIp1z/XfXWoVHLA1r3Xmyxx5+Lz+mnthz/UvxL1OAf41w5UIF68Jngw== + dependencies: + escape-string-regexp "^1.0.5" + slash "^1.0.0" + source-map-url "^0.4.0" + +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@^3.3.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +"http-parser-js@>=0.4.0 <0.4.11": + version "0.4.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" + integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q= + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + +import-local@2.0.0, import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.0.4, is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json3@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^0.2.16: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.3: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loglevel@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" + integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= + +lru-cache@^4.1.2: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@~2.1.17, mime-types@~2.1.24: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-is@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" + integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.0.0, os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc= + dependencies: + no-case "^2.2.0" + +parse-asn1@^5.0.0: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pbkdf2@^3.0.3: + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.5: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +portfinder@^1.0.25: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-local-by-default@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" + integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.16" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.0" + +postcss-modules-scope@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" + integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" + integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + +postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" + integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +prettier@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" + integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== + +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" + integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6, readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexp.prototype.flags@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" + integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" + integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c" + integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^2.1.2" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.6.6" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.6.tgz#da2382e6cafbdf86205e82fb9a115bd664d54863" + integrity sha512-4lYPyeNmstjIIESr/ysHg2vUPRGf2tzF9z2yYwnowXVuVzLEamPN1Gfrz7f8I9uEPuHcbFlW4PLIAsJoxXyJ1g== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + +ts-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.1.tgz#67939d5772e8a8c6bdaf6277ca023a4812da02ef" + integrity sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + +tslib@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" + integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript@^3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" + integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +uglify-js@3.4.x: + version "3.4.10" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" + integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw== + dependencies: + commander "~2.19.0" + source-map "~0.6.1" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse@^1.4.3: + version "1.4.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" + integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.0.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +vue-hot-reload-api@^2.3.0: + version "2.3.4" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== + +vue-loader@^15.9.0: + version "15.9.0" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.0.tgz#5d4b0378a4606188fc83e587ed23c94bc3a10998" + integrity sha512-FeDHvTSpwyLeF7LIV1PYkvqUQgTJ8UmOxhSlCyRSxaXCKk+M6NF4tDQsLsPPNeDPyR7TfRQ8MLg6v+8PsDV9xQ== + dependencies: + "@vue/component-compiler-utils" "^3.1.0" + hash-sum "^1.0.2" + loader-utils "^1.1.0" + vue-hot-reload-api "^2.3.0" + vue-style-loader "^4.1.0" + +vue-style-loader@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" + integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ== + dependencies: + hash-sum "^1.0.2" + loader-utils "^1.0.2" + +vue-template-compiler@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" + integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== + dependencies: + de-indent "^1.0.2" + he "^1.1.0" + +vue-template-es2015-compiler@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" + integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== + +vue@*, vue@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz#76594d877d4b12234406e84e35275c6d514125c5" + integrity sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ== + +watchpack@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + dependencies: + chokidar "^2.0.2" + graceful-fs "^4.1.2" + neo-async "^2.5.0" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-server@^3.10.3: + version "3.10.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" + integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.6" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.25" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4: + version "4.42.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.0.tgz#b901635dd6179391d90740a63c93f76f39883eb8" + integrity sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.2.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.1" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.0" + webpack-sources "^1.4.1" + +websocket-driver@>=0.5.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" + integrity sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg== + dependencies: + http-parser-js ">=0.4.0 <0.4.11" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" + integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + dependencies: + async-limiter "~1.0.0" + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^13.1.0: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@12.0.5: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" diff --git a/resources/[gameplay]/player-data/fxmanifest.lua b/resources/[gameplay]/player-data/fxmanifest.lua new file mode 100644 index 0000000..1188255 --- /dev/null +++ b/resources/[gameplay]/player-data/fxmanifest.lua @@ -0,0 +1,16 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +description 'A basic resource for storing player identifiers.' +author 'Cfx.re ' +repository 'https://github.com/citizenfx/cfx-server-data' + +fx_version 'bodacious' +game 'common' + +server_script 'server.lua' + +provides { + 'cfx.re/playerData.v1alpha1' +} diff --git a/resources/[gameplay]/player-data/server.lua b/resources/[gameplay]/player-data/server.lua new file mode 100644 index 0000000..a262281 --- /dev/null +++ b/resources/[gameplay]/player-data/server.lua @@ -0,0 +1,222 @@ +--- player-data is a basic resource to showcase player identifier storage +-- +-- it works in a fairly simple way: a set of identifiers is assigned to an account ID, and said +-- account ID is then returned/added as state bag +-- +-- it also implements the `cfx.re/playerData.v1alpha1` spec, which is exposed through the following: +-- - getPlayerId(source: string) +-- - getPlayerById(dbId: string) +-- - getPlayerIdFromIdentifier(identifier: string) +-- - setting `cfx.re/playerData@id` state bag field on the player + +-- identifiers that we'll ignore (e.g. IP) as they're low-trust/high-variance +local identifierBlocklist = { + ip = true +} + +-- function to check if the identifier is blocked +local function isIdentifierBlocked(identifier) + -- Lua pattern to correctly split + local idType = identifier:match('([^:]+):') + + -- ensure it's a boolean + return identifierBlocklist[idType] or false +end + +-- our database schema, in hierarchical KVS syntax: +-- player: +-- : +-- identifier: +-- : 'true' +-- identifier: +-- : + +-- list of player indices to data +local players = {} + +-- list of player DBIDs to player indices +local playersById = {} + +-- a sequence field using KVS +local function incrementId() + local nextId = GetResourceKvpInt('nextId') + nextId = nextId + 1 + SetResourceKvpInt('nextId', nextId) + + return nextId +end + +-- gets the ID tied to an identifier in the schema, or nil +local function getPlayerIdFromIdentifier(identifier) + local str = GetResourceKvpString(('identifier:%s'):format(identifier)) + + if not str then + return nil + end + + return msgpack.unpack(str).id +end + +-- stores the identifier + adds to a logging list +local function setPlayerIdFromIdentifier(identifier, id) + local str = ('identifier:%s'):format(identifier) + SetResourceKvp(str, msgpack.pack({ id = id })) + SetResourceKvp(('player:%s:identifier:%s'):format(id, identifier), 'true') +end + +-- stores any new identifiers for this player ID +local function storeIdentifiers(playerIdx, newId) + for _, identifier in ipairs(GetPlayerIdentifiers(playerIdx)) do + if not isIdentifierBlocked(identifier) then + -- TODO: check if the player already has an identifier of this type + setPlayerIdFromIdentifier(identifier, newId) + end + end +end + +-- registers a new player (increments sequence, stores data, returns ID) +local function registerPlayer(playerIdx) + local newId = incrementId() + storeIdentifiers(playerIdx, newId) + + return newId +end + +-- initializes a player's data set +local function setupPlayer(playerIdx) + -- try getting the oldest-known identity from all the player's identifiers + local defaultId = 0xFFFFFFFFFF + local lowestId = defaultId + + for _, identifier in ipairs(GetPlayerIdentifiers(playerIdx)) do + if not isIdentifierBlocked(identifier) then + local dbId = getPlayerIdFromIdentifier(identifier) + + if dbId then + if dbId < lowestId then + lowestId = dbId + end + end + end + end + + -- if this is the default ID, register. if not, update + local playerId + + if lowestId == defaultId then + playerId = registerPlayer(playerIdx) + else + storeIdentifiers(playerIdx, lowestId) + playerId = lowestId + end + + -- add state bag field + if Player then + Player(playerIdx).state['cfx.re/playerData@id'] = playerId + end + + -- and add to our caching tables + players[playerIdx] = { + dbId = playerId + } + + playersById[tostring(playerId)] = playerIdx +end + +-- we want to add a player pretty early +AddEventHandler('playerConnecting', function() + local playerIdx = tostring(source) + setupPlayer(playerIdx) +end) + +-- and migrate them to a 'joining' ID where possible +RegisterNetEvent('playerJoining') + +AddEventHandler('playerJoining', function(oldIdx) + -- resource restart race condition + local oldPlayer = players[tostring(oldIdx)] + + if oldPlayer then + players[tostring(source)] = oldPlayer + players[tostring(oldIdx)] = nil + else + setupPlayer(tostring(source)) + end +end) + +-- remove them if they're dropped +AddEventHandler('playerDropped', function() + local player = players[tostring(source)] + + if player then + playersById[tostring(player.dbId)] = nil + end + + players[tostring(source)] = nil +end) + +-- and when the resource is restarted, set up all players that are on right now +for _, player in ipairs(GetPlayers()) do + setupPlayer(player) +end + +-- also a quick command to get the current state +RegisterCommand('playerData', function(source, args) + if not args[1] then + print('Usage:') + print('\tplayerData getId : gets identifiers for ID') + print('\tplayerData getIdentifier : gets ID for identifier') + + return + end + + if args[1] == 'getId' then + local prefix = ('player:%s:identifier:'):format(args[2]) + local handle = StartFindKvp(prefix) + local key + + repeat + key = FindKvp(handle) + + if key then + print('result:', key:sub(#prefix + 1)) + end + until not key + + EndFindKvp(handle) + elseif args[1] == 'getIdentifier' then + print('result:', getPlayerIdFromIdentifier(args[2])) + end +end, true) + +-- COMPATIBILITY for server versions that don't export provide +local function getExportEventName(resource, name) + return string.format('__cfx_export_%s_%s', resource, name) +end + +function AddExport(name, fn) + if not Citizen.Traits or not Citizen.Traits.ProvidesExports then + AddEventHandler(getExportEventName('cfx.re/playerData.v1alpha1', name), function(setCB) + setCB(fn) + end) + end + + exports(name, fn) +end + +-- exports +AddExport('getPlayerIdFromIdentifier', getPlayerIdFromIdentifier) + +AddExport('getPlayerId', function(playerIdx) + local player = players[tostring(playerIdx)] + + if not player then + return nil + end + + return player.dbId +end) + +AddExport('getPlayerById', function(playerId) + return playersById[tostring(playerId)] +end) \ No newline at end of file diff --git a/resources/[gameplay]/playernames/fxmanifest.lua b/resources/[gameplay]/playernames/fxmanifest.lua new file mode 100644 index 0000000..547afc1 --- /dev/null +++ b/resources/[gameplay]/playernames/fxmanifest.lua @@ -0,0 +1,36 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'A basic resource for displaying player names.' +repository 'https://github.com/citizenfx/cfx-server-data' + +-- add scripts +client_script 'playernames_api.lua' +server_script 'playernames_api.lua' + +client_script 'playernames_cl.lua' +server_script 'playernames_sv.lua' + +-- make exports +local exportList = { + 'setComponentColor', + 'setComponentAlpha', + 'setComponentVisibility', + 'setWantedLevel', + 'setHealthBarColor', + 'setNameTemplate' +} + +exports(exportList) +server_exports(exportList) + +-- add files +files { + 'template/template.lua' +} + +-- support the latest resource manifest +fx_version 'adamant' +game 'gta5' diff --git a/resources/[gameplay]/playernames/playernames_api.lua b/resources/[gameplay]/playernames/playernames_api.lua new file mode 100644 index 0000000..e592946 --- /dev/null +++ b/resources/[gameplay]/playernames/playernames_api.lua @@ -0,0 +1,80 @@ +local ids = {} + +local function getTriggerFunction(key) + return function(id, ...) + -- if on the client, it's easy + if not IsDuplicityVersion() then + TriggerEvent('playernames:configure', GetPlayerServerId(id), key, ...) + else + -- if on the server, save configuration + if not ids[id] then + ids[id] = {} + end + + -- save the setting + ids[id][key] = table.pack(...) + + -- broadcast to clients + TriggerClientEvent('playernames:configure', -1, id, key, ...) + end + end +end + +if IsDuplicityVersion() then + function reconfigure(source) + for id, data in pairs(ids) do + for key, args in pairs(data) do + TriggerClientEvent('playernames:configure', source, id, key, table.unpack(args)) + end + end + end + + AddEventHandler('playerDropped', function() + ids[source] = nil + end) +end + +setComponentColor = getTriggerFunction('setc') +setComponentAlpha = getTriggerFunction('seta') +setComponentVisibility = getTriggerFunction('tglc') +setWantedLevel = getTriggerFunction('setw') +setHealthBarColor = getTriggerFunction('sehc') +setNameTemplate = getTriggerFunction('tpl') +setName = getTriggerFunction('name') + +if not io then + io = { write = nil, open = nil } +end + +local template = load(LoadResourceFile(GetCurrentResourceName(), 'template/template.lua'))() + +function formatPlayerNameTag(i, templateStr) + --return ('%s <%d>'):format(GetPlayerName(i), GetPlayerServerId(i)) + local str = '' + + template.print = function(txt) + str = str .. txt + end + + local context = { + name = GetPlayerName(i), + i = i, + global = _G + } + + if IsDuplicityVersion() then + context.id = i + else + context.id = GetPlayerServerId(i) + end + + TriggerEvent('playernames:extendContext', i, function(k, v) + context[k] = v + end) + + template.render(templateStr, context, nil, true) + + template.print = print + + return str +end \ No newline at end of file diff --git a/resources/[gameplay]/playernames/playernames_cl.lua b/resources/[gameplay]/playernames/playernames_cl.lua new file mode 100644 index 0000000..b39737a --- /dev/null +++ b/resources/[gameplay]/playernames/playernames_cl.lua @@ -0,0 +1,191 @@ +local mpGamerTags = {} +local mpGamerTagSettings = {} + +local gtComponent = { + GAMER_NAME = 0, + CREW_TAG = 1, + healthArmour = 2, + BIG_TEXT = 3, + AUDIO_ICON = 4, + MP_USING_MENU = 5, + MP_PASSIVE_MODE = 6, + WANTED_STARS = 7, + MP_DRIVER = 8, + MP_CO_DRIVER = 9, + MP_TAGGED = 10, + GAMER_NAME_NEARBY = 11, + ARROW = 12, + MP_PACKAGES = 13, + INV_IF_PED_FOLLOWING = 14, + RANK_TEXT = 15, + MP_TYPING = 16 +} + +local function makeSettings() + return { + alphas = {}, + colors = {}, + healthColor = false, + toggles = {}, + wantedLevel = false + } +end + +local templateStr + +function updatePlayerNames() + -- re-run this function the next frame + SetTimeout(0, updatePlayerNames) + + -- return if no template string is set + if not templateStr then + return + end + + -- get local coordinates to compare to + local localCoords = GetEntityCoords(PlayerPedId()) + + -- for each valid player index + for _, i in ipairs(GetActivePlayers()) do + -- if the player exists + if i ~= PlayerId() then + -- get their ped + local ped = GetPlayerPed(i) + local pedCoords = GetEntityCoords(ped) + + -- make a new settings list if needed + if not mpGamerTagSettings[i] then + mpGamerTagSettings[i] = makeSettings() + end + + -- check the ped, because changing player models may recreate the ped + -- also check gamer tag activity in case the game deleted the gamer tag + if not mpGamerTags[i] or mpGamerTags[i].ped ~= ped or not IsMpGamerTagActive(mpGamerTags[i].tag) then + local nameTag = formatPlayerNameTag(i, templateStr) + + -- remove any existing tag + if mpGamerTags[i] then + RemoveMpGamerTag(mpGamerTags[i].tag) + end + + -- store the new tag + mpGamerTags[i] = { + tag = CreateMpGamerTag(GetPlayerPed(i), nameTag, false, false, '', 0), + ped = ped + } + end + + -- store the tag in a local + local tag = mpGamerTags[i].tag + + -- should the player be renamed? this is set by events + if mpGamerTagSettings[i].rename then + SetMpGamerTagName(tag, formatPlayerNameTag(i, templateStr)) + mpGamerTagSettings[i].rename = nil + end + + -- check distance + local distance = #(pedCoords - localCoords) + + -- show/hide based on nearbyness/line-of-sight + -- nearby checks are primarily to prevent a lot of LOS checks + if distance < 250 and HasEntityClearLosToEntity(PlayerPedId(), ped, 17) then + SetMpGamerTagVisibility(tag, gtComponent.GAMER_NAME, true) + SetMpGamerTagVisibility(tag, gtComponent.healthArmour, IsPlayerTargettingEntity(PlayerId(), ped)) + SetMpGamerTagVisibility(tag, gtComponent.AUDIO_ICON, NetworkIsPlayerTalking(i)) + + SetMpGamerTagAlpha(tag, gtComponent.AUDIO_ICON, 255) + SetMpGamerTagAlpha(tag, gtComponent.healthArmour, 255) + + -- override settings + local settings = mpGamerTagSettings[i] + + for k, v in pairs(settings.toggles) do + SetMpGamerTagVisibility(tag, gtComponent[k], v) + end + + for k, v in pairs(settings.alphas) do + SetMpGamerTagAlpha(tag, gtComponent[k], v) + end + + for k, v in pairs(settings.colors) do + SetMpGamerTagColour(tag, gtComponent[k], v) + end + + if settings.wantedLevel then + SetMpGamerTagWantedLevel(tag, settings.wantedLevel) + end + + if settings.healthColor then + SetMpGamerTagHealthBarColour(tag, settings.healthColor) + end + else + SetMpGamerTagVisibility(tag, gtComponent.GAMER_NAME, false) + SetMpGamerTagVisibility(tag, gtComponent.healthArmour, false) + SetMpGamerTagVisibility(tag, gtComponent.AUDIO_ICON, false) + end + elseif mpGamerTags[i] then + RemoveMpGamerTag(mpGamerTags[i].tag) + + mpGamerTags[i] = nil + end + end +end + +local function getSettings(id) + local i = GetPlayerFromServerId(tonumber(id)) + + if not mpGamerTagSettings[i] then + mpGamerTagSettings[i] = makeSettings() + end + + return mpGamerTagSettings[i] +end + +RegisterNetEvent('playernames:configure') + +AddEventHandler('playernames:configure', function(id, key, ...) + local args = table.pack(...) + + if key == 'tglc' then + getSettings(id).toggles[args[1]] = args[2] + elseif key == 'seta' then + getSettings(id).alphas[args[1]] = args[2] + elseif key == 'setc' then + getSettings(id).colors[args[1]] = args[2] + elseif key == 'setw' then + getSettings(id).wantedLevel = args[1] + elseif key == 'sehc' then + getSettings(id).healthColor = args[1] + elseif key == 'rnme' then + getSettings(id).rename = true + elseif key == 'name' then + getSettings(id).serverName = args[1] + getSettings(id).rename = true + elseif key == 'tpl' then + for _, v in pairs(mpGamerTagSettings) do + v.rename = true + end + + templateStr = args[1] + end +end) + +AddEventHandler('playernames:extendContext', function(i, cb) + cb('serverName', getSettings(GetPlayerServerId(i)).serverName) +end) + +AddEventHandler('onResourceStop', function(name) + if name == GetCurrentResourceName() then + for _, v in pairs(mpGamerTags) do + RemoveMpGamerTag(v.tag) + end + end +end) + +SetTimeout(0, function() + TriggerServerEvent('playernames:init') +end) + +-- run this function every frame +SetTimeout(0, updatePlayerNames) diff --git a/resources/[gameplay]/playernames/playernames_sv.lua b/resources/[gameplay]/playernames/playernames_sv.lua new file mode 100644 index 0000000..4677e39 --- /dev/null +++ b/resources/[gameplay]/playernames/playernames_sv.lua @@ -0,0 +1,46 @@ +local curTemplate +local curTags = {} + +local activePlayers = {} + +local function detectUpdates() + SetTimeout(500, detectUpdates) + + local template = GetConvar('playerNames_template', '[{{id}}] {{name}}') + + if curTemplate ~= template then + setNameTemplate(-1, template) + + curTemplate = template + end + + template = GetConvar('playerNames_svTemplate', '[{{id}}] {{name}}') + + for v, _ in pairs(activePlayers) do + local newTag = formatPlayerNameTag(v, template) + if newTag ~= curTags[v] then + setName(v, newTag) + + curTags[v] = newTag + end + end + + for i, tag in pairs(curTags) do + if not activePlayers[i] then + curTags[i] = nil -- in case curTags doesnt get cleared when the player left, clear it now. + end + end +end + +AddEventHandler('playerDropped', function() + curTags[source] = nil + activePlayers[source] = nil +end) + +RegisterNetEvent('playernames:init') +AddEventHandler('playernames:init', function() + reconfigure(source) + activePlayers[source] = true +end) + +detectUpdates() diff --git a/resources/[gameplay]/playernames/template/LICENSE b/resources/[gameplay]/playernames/template/LICENSE new file mode 100644 index 0000000..f0e57b1 --- /dev/null +++ b/resources/[gameplay]/playernames/template/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2014 - 2017 Aapo Talvensaari +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of the {organization} nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/resources/[gameplay]/playernames/template/template.lua b/resources/[gameplay]/playernames/template/template.lua new file mode 100644 index 0000000..0de71bd --- /dev/null +++ b/resources/[gameplay]/playernames/template/template.lua @@ -0,0 +1,478 @@ +local setmetatable = setmetatable +local loadstring = loadstring +local loadchunk +local tostring = tostring +local setfenv = setfenv +local require = require +local capture +local concat = table.concat +local assert = assert +local prefix +local write = io.write +local pcall = pcall +local phase +local open = io.open +local load = load +local type = type +local dump = string.dump +local find = string.find +local gsub = string.gsub +local byte = string.byte +local null +local sub = string.sub +local ngx = ngx +local jit = jit +local var + +local _VERSION = _VERSION +local _ENV = _ENV +local _G = _G + +local HTML_ENTITIES = { + ["&"] = "&", + ["<"] = "<", + [">"] = ">", + ['"'] = """, + ["'"] = "'", + ["/"] = "/" +} + +local CODE_ENTITIES = { + ["{"] = "{", + ["}"] = "}", + ["&"] = "&", + ["<"] = "<", + [">"] = ">", + ['"'] = """, + ["'"] = "'", + ["/"] = "/" +} + +local VAR_PHASES + +local ok, newtab = pcall(require, "table.new") +if not ok then newtab = function() return {} end end + +local caching = true +local template = newtab(0, 12) + +template._VERSION = "1.9" +template.cache = {} + +local function enabled(val) + if val == nil then return true end + return val == true or (val == "1" or val == "true" or val == "on") +end + +local function trim(s) + return gsub(gsub(s, "^%s+", ""), "%s+$", "") +end + +local function rpos(view, s) + while s > 0 do + local c = sub(view, s, s) + if c == " " or c == "\t" or c == "\0" or c == "\x0B" then + s = s - 1 + else + break + end + end + return s +end + +local function escaped(view, s) + if s > 1 and sub(view, s - 1, s - 1) == "\\" then + if s > 2 and sub(view, s - 2, s - 2) == "\\" then + return false, 1 + else + return true, 1 + end + end + return false, 0 +end + +local function readfile(path) + local file = open(path, "rb") + if not file then return nil end + local content = file:read "*a" + file:close() + return content +end + +local function loadlua(path) + return readfile(path) or path +end + +local function loadngx(path) + local vars = VAR_PHASES[phase()] + local file, location = path, vars and var.template_location + if sub(file, 1) == "/" then file = sub(file, 2) end + if location and location ~= "" then + if sub(location, -1) == "/" then location = sub(location, 1, -2) end + local res = capture(concat{ location, '/', file}) + if res.status == 200 then return res.body end + end + local root = vars and (var.template_root or var.document_root) or prefix + if sub(root, -1) == "/" then root = sub(root, 1, -2) end + return readfile(concat{ root, "/", file }) or path +end + +do + if ngx then + VAR_PHASES = { + set = true, + rewrite = true, + access = true, + content = true, + header_filter = true, + body_filter = true, + log = true + } + template.print = ngx.print or write + template.load = loadngx + prefix, var, capture, null, phase = ngx.config.prefix(), ngx.var, ngx.location.capture, ngx.null, ngx.get_phase + if VAR_PHASES[phase()] then + caching = enabled(var.template_cache) + end + else + template.print = write + template.load = loadlua + end + if _VERSION == "Lua 5.1" then + local context = { __index = function(t, k) + return t.context[k] or t.template[k] or _G[k] + end } + if jit then + loadchunk = function(view) + return assert(load(view, nil, nil, setmetatable({ template = template }, context))) + end + else + loadchunk = function(view) + local func = assert(loadstring(view)) + setfenv(func, setmetatable({ template = template }, context)) + return func + end + end + else + local context = { __index = function(t, k) + return t.context[k] or t.template[k] or _ENV[k] + end } + loadchunk = function(view) + return assert(load(view, nil, nil, setmetatable({ template = template }, context))) + end + end +end + +function template.caching(enable) + if enable ~= nil then caching = enable == true end + return caching +end + +function template.output(s) + if s == nil or s == null then return "" end + if type(s) == "function" then return template.output(s()) end + return tostring(s) +end + +function template.escape(s, c) + if type(s) == "string" then + if c then return gsub(s, "[}{\">/<'&]", CODE_ENTITIES) end + return gsub(s, "[\">/<'&]", HTML_ENTITIES) + end + return template.output(s) +end + +function template.new(view, layout) + assert(view, "view was not provided for template.new(view, layout).") + local render, compile = template.render, template.compile + if layout then + if type(layout) == "table" then + return setmetatable({ render = function(self, context) + local context = context or self + context.blocks = context.blocks or {} + context.view = compile(view)(context) + layout.blocks = context.blocks or {} + layout.view = context.view or "" + return layout:render() + end }, { __tostring = function(self) + local context = self + context.blocks = context.blocks or {} + context.view = compile(view)(context) + layout.blocks = context.blocks or {} + layout.view = context.view + return tostring(layout) + end }) + else + return setmetatable({ render = function(self, context) + local context = context or self + context.blocks = context.blocks or {} + context.view = compile(view)(context) + return render(layout, context) + end }, { __tostring = function(self) + local context = self + context.blocks = context.blocks or {} + context.view = compile(view)(context) + return compile(layout)(context) + end }) + end + end + return setmetatable({ render = function(self, context) + return render(view, context or self) + end }, { __tostring = function(self) + return compile(view)(self) + end }) +end + +function template.precompile(view, path, strip) + local chunk = dump(template.compile(view), strip ~= false) + if path then + local file = open(path, "wb") + file:write(chunk) + file:close() + end + return chunk +end + +function template.compile(view, key, plain) + assert(view, "view was not provided for template.compile(view, key, plain).") + if key == "no-cache" then + return loadchunk(template.parse(view, plain)), false + end + key = key or view + local cache = template.cache + if cache[key] then return cache[key], true end + local func = loadchunk(template.parse(view, plain)) + if caching then cache[key] = func end + return func, false +end + +function template.parse(view, plain) + assert(view, "view was not provided for template.parse(view, plain).") + if not plain then + view = template.load(view) + if byte(view, 1, 1) == 27 then return view end + end + local j = 2 + local c = {[[ +context=... or {} +local function include(v, c) return template.compile(v)(c or context) end +local ___,blocks,layout={},blocks or {} +]] } + local i, s = 1, find(view, "{", 1, true) + while s do + local t, p = sub(view, s + 1, s + 1), s + 2 + if t == "{" then + local e = find(view, "}}", p, true) + if e then + local z, w = escaped(view, s) + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + if z then + i = s + else + c[j] = "___[#___+1]=template.escape(" + c[j+1] = trim(sub(view, p, e - 1)) + c[j+2] = ")\n" + j=j+3 + s, i = e + 1, e + 2 + end + end + elseif t == "*" then + local e = find(view, "*}", p, true) + if e then + local z, w = escaped(view, s) + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + if z then + i = s + else + c[j] = "___[#___+1]=template.output(" + c[j+1] = trim(sub(view, p, e - 1)) + c[j+2] = ")\n" + j=j+3 + s, i = e + 1, e + 2 + end + end + elseif t == "%" then + local e = find(view, "%}", p, true) + if e then + local z, w = escaped(view, s) + if z then + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + i = s + else + local n = e + 2 + if sub(view, n, n) == "\n" then + n = n + 1 + end + local r = rpos(view, s - 1) + if i <= r then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, r) + c[j+2] = "]=]\n" + j=j+3 + end + c[j] = trim(sub(view, p, e - 1)) + c[j+1] = "\n" + j=j+2 + s, i = n - 1, n + end + end + elseif t == "(" then + local e = find(view, ")}", p, true) + if e then + local z, w = escaped(view, s) + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + if z then + i = s + else + local f = sub(view, p, e - 1) + local x = find(f, ",", 2, true) + if x then + c[j] = "___[#___+1]=include([=[" + c[j+1] = trim(sub(f, 1, x - 1)) + c[j+2] = "]=]," + c[j+3] = trim(sub(f, x + 1)) + c[j+4] = ")\n" + j=j+5 + else + c[j] = "___[#___+1]=include([=[" + c[j+1] = trim(f) + c[j+2] = "]=])\n" + j=j+3 + end + s, i = e + 1, e + 2 + end + end + elseif t == "[" then + local e = find(view, "]}", p, true) + if e then + local z, w = escaped(view, s) + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + if z then + i = s + else + c[j] = "___[#___+1]=include(" + c[j+1] = trim(sub(view, p, e - 1)) + c[j+2] = ")\n" + j=j+3 + s, i = e + 1, e + 2 + end + end + elseif t == "-" then + local e = find(view, "-}", p, true) + if e then + local x, y = find(view, sub(view, s, e + 1), e + 2, true) + if x then + local z, w = escaped(view, s) + if z then + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + i = s + else + y = y + 1 + x = x - 1 + if sub(view, y, y) == "\n" then + y = y + 1 + end + local b = trim(sub(view, p, e - 1)) + if b == "verbatim" or b == "raw" then + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + c[j] = "___[#___+1]=[=[" + c[j+1] = sub(view, e + 2, x) + c[j+2] = "]=]\n" + j=j+3 + else + if sub(view, x, x) == "\n" then + x = x - 1 + end + local r = rpos(view, s - 1) + if i <= r then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, r) + c[j+2] = "]=]\n" + j=j+3 + end + c[j] = 'blocks["' + c[j+1] = b + c[j+2] = '"]=include[=[' + c[j+3] = sub(view, e + 2, x) + c[j+4] = "]=]\n" + j=j+5 + end + s, i = y - 1, y + end + end + end + elseif t == "#" then + local e = find(view, "#}", p, true) + if e then + local z, w = escaped(view, s) + if i < s - w then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = sub(view, i, s - 1 - w) + c[j+2] = "]=]\n" + j=j+3 + end + if z then + i = s + else + e = e + 2 + if sub(view, e, e) == "\n" then + e = e + 1 + end + s, i = e - 1, e + end + end + end + s = find(view, "{", s + 1, true) + end + s = sub(view, i) + if s and s ~= "" then + c[j] = "___[#___+1]=[=[\n" + c[j+1] = s + c[j+2] = "]=]\n" + j=j+3 + end + c[j] = "return layout and include(layout,setmetatable({view=table.concat(___),blocks=blocks},{__index=context})) or table.concat(___)" + return concat(c) +end + +function template.render(view, context, key, plain) + assert(view, "view was not provided for template.render(view, context, key, plain).") + return template.print(template.compile(view, key, plain)(context)) +end + +return template diff --git a/resources/[local]/.gitkeep b/resources/[local]/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/resources/[managers]/mapmanager/fxmanifest.lua b/resources/[managers]/mapmanager/fxmanifest.lua new file mode 100644 index 0000000..9e89921 --- /dev/null +++ b/resources/[managers]/mapmanager/fxmanifest.lua @@ -0,0 +1,30 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'A flexible handler for game type/map association.' +repository 'https://github.com/citizenfx/cfx-server-data' + +client_scripts { + "mapmanager_shared.lua", + "mapmanager_client.lua" +} + +server_scripts { + "mapmanager_shared.lua", + "mapmanager_server.lua" +} + +fx_version 'adamant' +games { 'gta5', 'rdr3' } + +server_export "getCurrentGameType" +server_export "getCurrentMap" +server_export "changeGameType" +server_export "changeMap" +server_export "doesMapSupportGameType" +server_export "getMaps" +server_export "roundEnded" + +rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' diff --git a/resources/[managers]/mapmanager/mapmanager_client.lua b/resources/[managers]/mapmanager/mapmanager_client.lua new file mode 100644 index 0000000..510c24e --- /dev/null +++ b/resources/[managers]/mapmanager/mapmanager_client.lua @@ -0,0 +1,108 @@ +local maps = {} +local gametypes = {} + +AddEventHandler('onClientResourceStart', function(res) + -- parse metadata for this resource + + -- map files + local num = GetNumResourceMetadata(res, 'map') + + if num > 0 then + for i = 0, num-1 do + local file = GetResourceMetadata(res, 'map', i) + + if file then + addMap(file, res) + end + end + end + + -- resource type data + local type = GetResourceMetadata(res, 'resource_type', 0) + + if type then + local extraData = GetResourceMetadata(res, 'resource_type_extra', 0) + + if extraData then + extraData = json.decode(extraData) + else + extraData = {} + end + + if type == 'map' then + maps[res] = extraData + elseif type == 'gametype' then + gametypes[res] = extraData + end + end + + -- handle starting + loadMap(res) + + -- defer this to the next game tick to work around a lack of dependencies + Citizen.CreateThread(function() + Citizen.Wait(15) + + if maps[res] then + TriggerEvent('onClientMapStart', res) + elseif gametypes[res] then + TriggerEvent('onClientGameTypeStart', res) + end + end) +end) + +AddEventHandler('onResourceStop', function(res) + if maps[res] then + TriggerEvent('onClientMapStop', res) + elseif gametypes[res] then + TriggerEvent('onClientGameTypeStop', res) + end + + unloadMap(res) +end) + +AddEventHandler('getMapDirectives', function(add) + if not CreateScriptVehicleGenerator then + return + end + + add('vehicle_generator', function(state, name) + return function(opts) + local x, y, z, heading + local color1, color2 + + if opts.x then + x = opts.x + y = opts.y + z = opts.z + else + x = opts[1] + y = opts[2] + z = opts[3] + end + + heading = opts.heading or 1.0 + color1 = opts.color1 or -1 + color2 = opts.color2 or -1 + + CreateThread(function() + local hash = GetHashKey(name) + RequestModel(hash) + + while not HasModelLoaded(hash) do + Wait(0) + end + + local carGen = CreateScriptVehicleGenerator(x, y, z, heading, 5.0, 3.0, hash, color1, color2, -1, -1, true, false, false, true, true, -1) + SetScriptVehicleGenerator(carGen, true) + SetAllVehicleGeneratorsActive(true) + + state.add('cargen', carGen) + end) + end + end, function(state, arg) + Citizen.Trace("deleting car gen " .. tostring(state.cargen) .. "\n") + + DeleteScriptVehicleGenerator(state.cargen) + end) +end) diff --git a/resources/[managers]/mapmanager/mapmanager_server.lua b/resources/[managers]/mapmanager/mapmanager_server.lua new file mode 100644 index 0000000..3f2cf70 --- /dev/null +++ b/resources/[managers]/mapmanager/mapmanager_server.lua @@ -0,0 +1,331 @@ +-- loosely based on MTA's https://code.google.com/p/mtasa-resources/source/browse/trunk/%5Bmanagers%5D/mapmanager/mapmanager_main.lua + +local maps = {} +local gametypes = {} + +local function refreshResources() + local numResources = GetNumResources() + + for i = 0, numResources - 1 do + local resource = GetResourceByFindIndex(i) + + if GetNumResourceMetadata(resource, 'resource_type') > 0 then + local type = GetResourceMetadata(resource, 'resource_type', 0) + local params = json.decode(GetResourceMetadata(resource, 'resource_type_extra', 0)) + + local valid = false + + local games = GetNumResourceMetadata(resource, 'game') + if games > 0 then + for j = 0, games - 1 do + local game = GetResourceMetadata(resource, 'game', j) + + if game == GetConvar('gamename', 'gta5') or game == 'common' then + valid = true + end + end + end + + if valid then + if type == 'map' then + maps[resource] = params + elseif type == 'gametype' then + gametypes[resource] = params + end + end + end + end +end + +AddEventHandler('onResourceListRefresh', function() + refreshResources() +end) + +refreshResources() + +AddEventHandler('onResourceStarting', function(resource) + local num = GetNumResourceMetadata(resource, 'map') + + if num then + for i = 0, num-1 do + local file = GetResourceMetadata(resource, 'map', i) + + if file then + addMap(file, resource) + end + end + end + + if maps[resource] then + if getCurrentMap() and getCurrentMap() ~= resource then + if doesMapSupportGameType(getCurrentGameType(), resource) then + print("Changing map from " .. getCurrentMap() .. " to " .. resource) + + changeMap(resource) + else + -- check if there's only one possible game type for the map + local map = maps[resource] + local count = 0 + local gt + + for type, flag in pairs(map.gameTypes) do + if flag then + count = count + 1 + gt = type + end + end + + if count == 1 then + print("Changing map from " .. getCurrentMap() .. " to " .. resource .. " (gt " .. gt .. ")") + + changeGameType(gt) + changeMap(resource) + end + end + + CancelEvent() + end + elseif gametypes[resource] then + if getCurrentGameType() and getCurrentGameType() ~= resource then + print("Changing gametype from " .. getCurrentGameType() .. " to " .. resource) + + changeGameType(resource) + + CancelEvent() + end + end +end) + +math.randomseed(GetInstanceId()) + +local currentGameType = nil +local currentMap = nil + +AddEventHandler('onResourceStart', function(resource) + if maps[resource] then + if not getCurrentGameType() then + for gt, _ in pairs(maps[resource].gameTypes) do + changeGameType(gt) + break + end + end + + if getCurrentGameType() and not getCurrentMap() then + if doesMapSupportGameType(currentGameType, resource) then + if TriggerEvent('onMapStart', resource, maps[resource]) then + if maps[resource].name then + print('Started map ' .. maps[resource].name) + SetMapName(maps[resource].name) + else + print('Started map ' .. resource) + SetMapName(resource) + end + + currentMap = resource + else + currentMap = nil + end + end + end + elseif gametypes[resource] then + if not getCurrentGameType() then + if TriggerEvent('onGameTypeStart', resource, gametypes[resource]) then + currentGameType = resource + + local gtName = gametypes[resource].name or resource + + SetGameType(gtName) + + print('Started gametype ' .. gtName) + + SetTimeout(50, function() + if not currentMap then + local possibleMaps = {} + + for map, data in pairs(maps) do + if data.gameTypes[currentGameType] then + table.insert(possibleMaps, map) + end + end + + if #possibleMaps > 0 then + local rnd = math.random(#possibleMaps) + changeMap(possibleMaps[rnd]) + end + end + end) + else + currentGameType = nil + end + end + end + + -- handle starting + loadMap(resource) +end) + +local function handleRoundEnd() + local possibleMaps = {} + + for map, data in pairs(maps) do + if data.gameTypes[currentGameType] then + table.insert(possibleMaps, map) + end + end + + if #possibleMaps > 1 then + local mapname = currentMap + + while mapname == currentMap do + local rnd = math.random(#possibleMaps) + mapname = possibleMaps[rnd] + end + + changeMap(mapname) + elseif #possibleMaps > 0 then + local rnd = math.random(#possibleMaps) + changeMap(possibleMaps[rnd]) + end +end + +AddEventHandler('mapmanager:roundEnded', function() + -- set a timeout as we don't want to return to a dead environment + SetTimeout(50, handleRoundEnd) -- not a closure as to work around some issue in neolua? +end) + +function roundEnded() + SetTimeout(50, handleRoundEnd) +end + +AddEventHandler('onResourceStop', function(resource) + if resource == currentGameType then + TriggerEvent('onGameTypeStop', resource) + + currentGameType = nil + + if currentMap then + StopResource(currentMap) + end + elseif resource == currentMap then + TriggerEvent('onMapStop', resource) + + currentMap = nil + end + + -- unload the map + unloadMap(resource) +end) + +AddEventHandler('rconCommand', function(commandName, args) + if commandName == 'map' then + if #args ~= 1 then + RconPrint("usage: map [mapname]\n") + end + + if not maps[args[1]] then + RconPrint('no such map ' .. args[1] .. "\n") + CancelEvent() + + return + end + + if currentGameType == nil or not doesMapSupportGameType(currentGameType, args[1]) then + local map = maps[args[1]] + local count = 0 + local gt + + for type, flag in pairs(map.gameTypes) do + if flag then + count = count + 1 + gt = type + end + end + + if count == 1 then + print("Changing map from " .. getCurrentMap() .. " to " .. args[1] .. " (gt " .. gt .. ")") + + changeGameType(gt) + changeMap(args[1]) + + RconPrint('map ' .. args[1] .. "\n") + else + RconPrint('map ' .. args[1] .. ' does not support ' .. currentGameType .. "\n") + end + + CancelEvent() + + return + end + + changeMap(args[1]) + + RconPrint('map ' .. args[1] .. "\n") + + CancelEvent() + elseif commandName == 'gametype' then + if #args ~= 1 then + RconPrint("usage: gametype [name]\n") + end + + if not gametypes[args[1]] then + RconPrint('no such gametype ' .. args[1] .. "\n") + CancelEvent() + + return + end + + changeGameType(args[1]) + + RconPrint('gametype ' .. args[1] .. "\n") + + CancelEvent() + end +end) + +function getCurrentGameType() + return currentGameType +end + +function getCurrentMap() + return currentMap +end + +function getMaps() + return maps +end + +function changeGameType(gameType) + if currentMap and not doesMapSupportGameType(gameType, currentMap) then + StopResource(currentMap) + end + + if currentGameType then + StopResource(currentGameType) + end + + StartResource(gameType) +end + +function changeMap(map) + if currentMap then + StopResource(currentMap) + end + + StartResource(map) +end + +function doesMapSupportGameType(gameType, map) + if not gametypes[gameType] then + return false + end + + if not maps[map] then + return false + end + + if not maps[map].gameTypes then + return true + end + + return maps[map].gameTypes[gameType] +end diff --git a/resources/[managers]/mapmanager/mapmanager_shared.lua b/resources/[managers]/mapmanager/mapmanager_shared.lua new file mode 100644 index 0000000..cac5b6c --- /dev/null +++ b/resources/[managers]/mapmanager/mapmanager_shared.lua @@ -0,0 +1,87 @@ +-- shared logic file for map manager - don't call any subsystem-specific functions here +mapFiles = {} + +function addMap(file, owningResource) + if not mapFiles[owningResource] then + mapFiles[owningResource] = {} + end + + table.insert(mapFiles[owningResource], file) +end + +undoCallbacks = {} + +function loadMap(res) + if mapFiles[res] then + for _, file in ipairs(mapFiles[res]) do + parseMap(file, res) + end + end +end + +function unloadMap(res) + if undoCallbacks[res] then + for _, cb in ipairs(undoCallbacks[res]) do + cb() + end + + undoCallbacks[res] = nil + mapFiles[res] = nil + end +end + +function parseMap(file, owningResource) + if not undoCallbacks[owningResource] then + undoCallbacks[owningResource] = {} + end + + local env = { + math = math, pairs = pairs, ipairs = ipairs, next = next, tonumber = tonumber, tostring = tostring, + type = type, table = table, string = string, _G = env, + vector3 = vector3, quat = quat, vec = vec, vector2 = vector2 + } + + TriggerEvent('getMapDirectives', function(key, cb, undocb) + env[key] = function(...) + local state = {} + + state.add = function(k, v) + state[k] = v + end + + local result = cb(state, ...) + local args = table.pack(...) + + table.insert(undoCallbacks[owningResource], function() + undocb(state) + end) + + return result + end + end) + + local mt = { + __index = function(t, k) + if rawget(t, k) ~= nil then return rawget(t, k) end + + -- as we're not going to return nothing here (to allow unknown directives to be ignored) + local f = function() + return f + end + + return function() return f end + end + } + + setmetatable(env, mt) + + local fileData = LoadResourceFile(owningResource, file) + local mapFunction, err = load(fileData, file, 't', env) + + if not mapFunction then + Citizen.Trace("Couldn't load map " .. file .. ": " .. err .. " (type of fileData: " .. type(fileData) .. ")\n") + return + end + + mapFunction() +end \ No newline at end of file diff --git a/resources/[managers]/spawnmanager/fxmanifest.lua b/resources/[managers]/spawnmanager/fxmanifest.lua new file mode 100644 index 0000000..13eb96b --- /dev/null +++ b/resources/[managers]/spawnmanager/fxmanifest.lua @@ -0,0 +1,14 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Handles spawning a player in a unified fashion to prevent resources from having to implement custom spawn logic.' +repository 'https://github.com/citizenfx/cfx-server-data' + +client_script 'spawnmanager.lua' + +fx_version 'adamant' +games { 'rdr3', 'gta5' } + +rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' diff --git a/resources/[managers]/spawnmanager/spawnmanager.lua b/resources/[managers]/spawnmanager/spawnmanager.lua new file mode 100644 index 0000000..9e940d8 --- /dev/null +++ b/resources/[managers]/spawnmanager/spawnmanager.lua @@ -0,0 +1,386 @@ +-- in-memory spawnpoint array for this script execution instance +local spawnPoints = {} + +-- auto-spawn enabled flag +local autoSpawnEnabled = false +local autoSpawnCallback + +-- support for mapmanager maps +AddEventHandler('getMapDirectives', function(add) + -- call the remote callback + add('spawnpoint', function(state, model) + -- return another callback to pass coordinates and so on (as such syntax would be [spawnpoint 'model' { options/coords }]) + return function(opts) + local x, y, z, heading + + local s, e = pcall(function() + -- is this a map or an array? + if opts.x then + x = opts.x + y = opts.y + z = opts.z + else + x = opts[1] + y = opts[2] + z = opts[3] + end + + x = x + 0.0001 + y = y + 0.0001 + z = z + 0.0001 + + -- get a heading and force it to a float, or just default to null + heading = opts.heading and (opts.heading + 0.01) or 0 + + -- add the spawnpoint + addSpawnPoint({ + x = x, y = y, z = z, + heading = heading, + model = model + }) + + -- recalculate the model for storage + if not tonumber(model) then + model = GetHashKey(model, _r) + end + + -- store the spawn data in the state so we can erase it later on + state.add('xyz', { x, y, z }) + state.add('model', model) + end) + + if not s then + Citizen.Trace(e .. "\n") + end + end + -- delete callback follows on the next line + end, function(state, arg) + -- loop through all spawn points to find one with our state + for i, sp in ipairs(spawnPoints) do + -- if it matches... + if sp.x == state.xyz[1] and sp.y == state.xyz[2] and sp.z == state.xyz[3] and sp.model == state.model then + -- remove it. + table.remove(spawnPoints, i) + return + end + end + end) +end) + + +-- loads a set of spawn points from a JSON string +function loadSpawns(spawnString) + -- decode the JSON string + local data = json.decode(spawnString) + + -- do we have a 'spawns' field? + if not data.spawns then + error("no 'spawns' in JSON data") + end + + -- loop through the spawns + for i, spawn in ipairs(data.spawns) do + -- and add it to the list (validating as we go) + addSpawnPoint(spawn) + end +end + +local spawnNum = 1 + +function addSpawnPoint(spawn) + -- validate the spawn (position) + if not tonumber(spawn.x) or not tonumber(spawn.y) or not tonumber(spawn.z) then + error("invalid spawn position") + end + + -- heading + if not tonumber(spawn.heading) then + error("invalid spawn heading") + end + + -- model (try integer first, if not, hash it) + local model = spawn.model + + if not tonumber(spawn.model) then + model = GetHashKey(spawn.model) + end + + -- is the model actually a model? + if not IsModelInCdimage(model) then + error("invalid spawn model") + end + + -- is is even a ped? + -- not in V? + --[[if not IsThisModelAPed(model) then + error("this model ain't a ped!") + end]] + + -- overwrite the model in case we hashed it + spawn.model = model + + -- add an index + spawn.idx = spawnNum + spawnNum = spawnNum + 1 + + -- all OK, add the spawn entry to the list + table.insert(spawnPoints, spawn) + + return spawn.idx +end + +-- removes a spawn point +function removeSpawnPoint(spawn) + for i = 1, #spawnPoints do + if spawnPoints[i].idx == spawn then + table.remove(spawnPoints, i) + return + end + end +end + +-- changes the auto-spawn flag +function setAutoSpawn(enabled) + autoSpawnEnabled = enabled +end + +-- sets a callback to execute instead of 'native' spawning when trying to auto-spawn +function setAutoSpawnCallback(cb) + autoSpawnCallback = cb + autoSpawnEnabled = true +end + +-- function as existing in original R* scripts +local function freezePlayer(id, freeze) + local player = id + SetPlayerControl(player, not freeze, false) + + local ped = GetPlayerPed(player) + + if not freeze then + if not IsEntityVisible(ped) then + SetEntityVisible(ped, true) + end + + if not IsPedInAnyVehicle(ped) then + SetEntityCollision(ped, true) + end + + FreezeEntityPosition(ped, false) + --SetCharNeverTargetted(ped, false) + SetPlayerInvincible(player, false) + else + if IsEntityVisible(ped) then + SetEntityVisible(ped, false) + end + + SetEntityCollision(ped, false) + FreezeEntityPosition(ped, true) + --SetCharNeverTargetted(ped, true) + SetPlayerInvincible(player, true) + --RemovePtfxFromPed(ped) + + if not IsPedFatallyInjured(ped) then + ClearPedTasksImmediately(ped) + end + end +end + +function loadScene(x, y, z) + if not NewLoadSceneStart then + return + end + + NewLoadSceneStart(x, y, z, 0.0, 0.0, 0.0, 20.0, 0) + + while IsNewLoadSceneActive() do + networkTimer = GetNetworkTimer() + + NetworkUpdateLoadScene() + end +end + +-- to prevent trying to spawn multiple times +local spawnLock = false + +-- spawns the current player at a certain spawn point index (or a random one, for that matter) +function spawnPlayer(spawnIdx, cb) + if spawnLock then + return + end + + spawnLock = true + + Citizen.CreateThread(function() + -- if the spawn isn't set, select a random one + if not spawnIdx then + spawnIdx = GetRandomIntInRange(1, #spawnPoints + 1) + end + + -- get the spawn from the array + local spawn + + if type(spawnIdx) == 'table' then + spawn = spawnIdx + + -- prevent errors when passing spawn table + spawn.x = spawn.x + 0.00 + spawn.y = spawn.y + 0.00 + spawn.z = spawn.z + 0.00 + + spawn.heading = spawn.heading and (spawn.heading + 0.00) or 0 + else + spawn = spawnPoints[spawnIdx] + end + + if not spawn.skipFade then + DoScreenFadeOut(500) + + while not IsScreenFadedOut() do + Citizen.Wait(0) + end + end + + -- validate the index + if not spawn then + Citizen.Trace("tried to spawn at an invalid spawn index\n") + + spawnLock = false + + return + end + + -- freeze the local player + freezePlayer(PlayerId(), true) + + -- if the spawn has a model set + if spawn.model then + RequestModel(spawn.model) + + -- load the model for this spawn + while not HasModelLoaded(spawn.model) do + RequestModel(spawn.model) + + Wait(0) + end + + -- change the player model + SetPlayerModel(PlayerId(), spawn.model) + + -- release the player model + SetModelAsNoLongerNeeded(spawn.model) + + -- RDR3 player model bits + if N_0x283978a15512b2fe then + N_0x283978a15512b2fe(PlayerPedId(), true) + end + end + + -- preload collisions for the spawnpoint + RequestCollisionAtCoord(spawn.x, spawn.y, spawn.z) + + -- spawn the player + local ped = PlayerPedId() + + -- V requires setting coords as well + SetEntityCoordsNoOffset(ped, spawn.x, spawn.y, spawn.z, false, false, false, true) + + NetworkResurrectLocalPlayer(spawn.x, spawn.y, spawn.z, spawn.heading, true, true, false) + + -- gamelogic-style cleanup stuff + ClearPedTasksImmediately(ped) + --SetEntityHealth(ped, 300) -- TODO: allow configuration of this? + RemoveAllPedWeapons(ped) -- TODO: make configurable (V behavior?) + ClearPlayerWantedLevel(PlayerId()) + + -- why is this even a flag? + --SetCharWillFlyThroughWindscreen(ped, false) + + -- set primary camera heading + --SetGameCamHeading(spawn.heading) + --CamRestoreJumpcut(GetGameCam()) + + -- load the scene; streaming expects us to do it + --ForceLoadingScreen(true) + --loadScene(spawn.x, spawn.y, spawn.z) + --ForceLoadingScreen(false) + + local time = GetGameTimer() + + while (not HasCollisionLoadedAroundEntity(ped) and (GetGameTimer() - time) < 5000) do + Citizen.Wait(0) + end + + ShutdownLoadingScreen() + + if IsScreenFadedOut() then + DoScreenFadeIn(500) + + while not IsScreenFadedIn() do + Citizen.Wait(0) + end + end + + -- and unfreeze the player + freezePlayer(PlayerId(), false) + + TriggerEvent('playerSpawned', spawn) + + if cb then + cb(spawn) + end + + spawnLock = false + end) +end + +-- automatic spawning monitor thread, too +local respawnForced +local diedAt + +Citizen.CreateThread(function() + -- main loop thing + while true do + Citizen.Wait(50) + + local playerPed = PlayerPedId() + + if playerPed and playerPed ~= -1 then + -- check if we want to autospawn + if autoSpawnEnabled then + if NetworkIsPlayerActive(PlayerId()) then + if (diedAt and (math.abs(GetTimeDifference(GetGameTimer(), diedAt)) > 2000)) or respawnForced then + if autoSpawnCallback then + autoSpawnCallback() + else + spawnPlayer() + end + + respawnForced = false + end + end + end + + if IsEntityDead(playerPed) then + if not diedAt then + diedAt = GetGameTimer() + end + else + diedAt = nil + end + end + end +end) + +function forceRespawn() + spawnLock = false + respawnForced = true +end + +exports('spawnPlayer', spawnPlayer) +exports('addSpawnPoint', addSpawnPoint) +exports('removeSpawnPoint', removeSpawnPoint) +exports('loadSpawns', loadSpawns) +exports('setAutoSpawn', setAutoSpawn) +exports('setAutoSpawnCallback', setAutoSpawnCallback) +exports('forceRespawn', forceRespawn) diff --git a/resources/[system]/[builders]/webpack/.gitignore b/resources/[system]/[builders]/webpack/.gitignore new file mode 100644 index 0000000..b5e9127 --- /dev/null +++ b/resources/[system]/[builders]/webpack/.gitignore @@ -0,0 +1,2 @@ +.yarn.installed +node_modules/ \ No newline at end of file diff --git a/resources/[system]/[builders]/webpack/fxmanifest.lua b/resources/[system]/[builders]/webpack/fxmanifest.lua new file mode 100644 index 0000000..b8b8a4b --- /dev/null +++ b/resources/[system]/[builders]/webpack/fxmanifest.lua @@ -0,0 +1,13 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Builds resources with webpack. To learn more: https://webpack.js.org' +repository 'https://github.com/citizenfx/cfx-server-data' + +dependency 'yarn' +server_script 'webpack_builder.js' + +fx_version 'adamant' +game 'common' diff --git a/resources/[system]/[builders]/webpack/package.json b/resources/[system]/[builders]/webpack/package.json new file mode 100644 index 0000000..45b2438 --- /dev/null +++ b/resources/[system]/[builders]/webpack/package.json @@ -0,0 +1,16 @@ +{ + "name": "webpack-builder", + "version": "1.0.1", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "async": "^3.1.0", + "webpack": "^4.41.2", + "worker-farm": "^1.7.0" + } +} diff --git a/resources/[system]/[builders]/webpack/webpack_builder.js b/resources/[system]/[builders]/webpack/webpack_builder.js new file mode 100644 index 0000000..b487e13 --- /dev/null +++ b/resources/[system]/[builders]/webpack/webpack_builder.js @@ -0,0 +1,173 @@ +const fs = require('fs'); +const path = require('path'); +const workerFarm = require('worker-farm'); +const async = require('async'); +let buildingInProgress = false; +let currentBuildingModule = ''; + +// some modules will not like the custom stack trace logic +const ops = Error.prepareStackTrace; +Error.prepareStackTrace = undefined; + +const webpackBuildTask = { + shouldBuild(resourceName) { + const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config'); + + if (numMetaData > 0) { + for (let i = 0; i < numMetaData; i++) { + const configName = GetResourceMetadata(resourceName, 'webpack_config'); + + if (shouldBuild(configName)) { + return true; + } + } + } + + return false; + + function loadCache(config) { + const cachePath = `cache/${resourceName}/${config.replace(/\//g, '_')}.json`; + + try { + return JSON.parse(fs.readFileSync(cachePath, {encoding: 'utf8'})); + } catch { + return null; + } + } + + function shouldBuild(config) { + const cache = loadCache(config); + + if (!cache) { + return true; + } + + for (const file of cache) { + const stats = getStat(file.name); + + if (!stats || + stats.mtime !== file.stats.mtime || + stats.size !== file.stats.size || + stats.inode !== file.stats.inode) { + return true; + } + } + + return false; + } + + function getStat(path) { + try { + const stat = fs.statSync(path); + + return stat ? { + mtime: stat.mtimeMs, + size: stat.size, + inode: stat.ino, + } : null; + } catch { + return null; + } + } + }, + + build(resourceName, cb) { + let buildWebpack = async () => { + let error = null; + const configs = []; + const promises = []; + const numMetaData = GetNumResourceMetadata(resourceName, 'webpack_config'); + + for (let i = 0; i < numMetaData; i++) { + configs.push(GetResourceMetadata(resourceName, 'webpack_config', i)); + } + + for (const configName of configs) { + const configPath = GetResourcePath(resourceName) + '/' + configName; + + const cachePath = `cache/${resourceName}/${configName.replace(/\//g, '_')}.json`; + + try { + fs.mkdirSync(path.dirname(cachePath)); + } catch { + } + + const config = require(configPath); + + const workers = workerFarm(require.resolve('./webpack_runner')); + + if (config) { + const resourcePath = path.resolve(GetResourcePath(resourceName)); + + while (buildingInProgress) { + console.log(`webpack is busy: we are waiting to compile ${resourceName} (${configName})`); + await sleep(3000); + } + + console.log(`${resourceName}: started building ${configName}`); + + buildingInProgress = true; + currentBuildingModule = resourceName; + + promises.push(new Promise((resolve, reject) => { + workers({ + configPath, + resourcePath, + cachePath + }, (err, outp) => { + workerFarm.end(workers); + + if (err) { + console.error(err.stack || err); + if (err.details) { + console.error(err.details); + } + + buildingInProgress = false; + currentBuildingModule = ''; + currentBuildingScript = ''; + reject("worker farm webpack errored out"); + return; + } + + if (outp.errors) { + for (const error of outp.errors) { + console.log(error); + } + buildingInProgress = false; + currentBuildingModule = ''; + currentBuildingScript = ''; + reject("webpack got an error"); + return; + } + + console.log(`${resourceName}: built ${configName}`); + buildingInProgress = false; + resolve(); + }); + })); + } + } + + try { + await Promise.all(promises); + } catch (e) { + error = e.toString(); + } + + buildingInProgress = false; + currentBuildingModule = ''; + + if (error) { + cb(false, error); + } else cb(true); + }; + buildWebpack().then(); + } +}; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +RegisterResourceBuildTaskFactory('z_webpack', () => webpackBuildTask); diff --git a/resources/[system]/[builders]/webpack/webpack_runner.js b/resources/[system]/[builders]/webpack/webpack_runner.js new file mode 100644 index 0000000..1c48687 --- /dev/null +++ b/resources/[system]/[builders]/webpack/webpack_runner.js @@ -0,0 +1,75 @@ +const webpack = require('webpack'); +const path = require('path'); +const fs = require('fs'); + +function getStat(path) { + try { + const stat = fs.statSync(path); + + return stat ? { + mtime: stat.mtimeMs, + size: stat.size, + inode: stat.ino, + } : null; + } catch { + return null; + } +} + +class SaveStatePlugin { + constructor(inp) { + this.cache = []; + this.cachePath = inp.cachePath; + } + + apply(compiler) { + compiler.hooks.afterCompile.tap('SaveStatePlugin', (compilation) => { + for (const file of compilation.fileDependencies) { + this.cache.push({ + name: file, + stats: getStat(file) + }); + } + }); + + compiler.hooks.done.tap('SaveStatePlugin', (stats) => { + if (stats.hasErrors()) { + return; + } + + fs.writeFile(this.cachePath, JSON.stringify(this.cache), () => { + + }); + }); + } +} + +module.exports = (inp, callback) => { + const config = require(inp.configPath); + + config.context = inp.resourcePath; + + if (config.output && config.output.path) { + config.output.path = path.resolve(inp.resourcePath, config.output.path); + } + + if (!config.plugins) { + config.plugins = []; + } + + config.plugins.push(new SaveStatePlugin(inp)); + + webpack(config, (err, stats) => { + if (err) { + callback(err); + return; + } + + if (stats.hasErrors()) { + callback(null, stats.toJson()); + return; + } + + callback(null, {}); + }); +}; \ No newline at end of file diff --git a/resources/[system]/[builders]/webpack/yarn.lock b/resources/[system]/[builders]/webpack/yarn.lock new file mode 100644 index 0000000..89058da --- /dev/null +++ b/resources/[system]/[builders]/webpack/yarn.lock @@ -0,0 +1,2325 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.1.0, ajv@^6.10.2: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" + integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.0.tgz#458a4816a415e9d3b3caa4faec2b96a6935a9e65" + integrity sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.5.0" + optionalDependencies: + fsevents "~2.3.1" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +elliptic@^6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +events@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.1.tgz#b209ab14c61012636c8863507edf7fb68cc54e9f" + integrity sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nan@^2.12.1: + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + dependencies: + picomatch "^2.2.1" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +safer-buffer@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.41.2: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.5.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/resources/[system]/[builders]/yarn/fxmanifest.lua b/resources/[system]/[builders]/yarn/fxmanifest.lua new file mode 100644 index 0000000..24aeba8 --- /dev/null +++ b/resources/[system]/[builders]/yarn/fxmanifest.lua @@ -0,0 +1,12 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Builds resources with yarn. To learn more: https://classic.yarnpkg.com' +repository 'https://github.com/citizenfx/cfx-server-data' + +fx_version 'adamant' +game 'common' + +server_script 'yarn_builder.js' diff --git a/resources/[system]/[builders]/yarn/yarn_builder.js b/resources/[system]/[builders]/yarn/yarn_builder.js new file mode 100644 index 0000000..002a8d0 --- /dev/null +++ b/resources/[system]/[builders]/yarn/yarn_builder.js @@ -0,0 +1,81 @@ +const path = require('path'); +const fs = require('fs'); +const child_process = require('child_process'); +let buildingInProgress = false; +let currentBuildingModule = ''; + +const initCwd = process.cwd(); +const trimOutput = (data) => { + return `[yarn]\t` + data.toString().replace(/\s+$/, ''); +} + +const yarnBuildTask = { + shouldBuild(resourceName) { + try { + const resourcePath = GetResourcePath(resourceName); + + const packageJson = path.resolve(resourcePath, 'package.json'); + const yarnLock = path.resolve(resourcePath, '.yarn.installed'); + + const packageStat = fs.statSync(packageJson); + + try { + const yarnStat = fs.statSync(yarnLock); + + if (packageStat.mtimeMs > yarnStat.mtimeMs) { + return true; + } + } catch (e) { + // no yarn.installed, but package.json - install time! + return true; + } + } catch (e) { + + } + + return false; + }, + + build(resourceName, cb) { + (async () => { + while (buildingInProgress && currentBuildingModule !== resourceName) { + console.log(`yarn is currently busy: we are waiting to compile ${resourceName}`); + await sleep(3000); + } + buildingInProgress = true; + currentBuildingModule = resourceName; + const proc = child_process.fork( + require.resolve('./yarn_cli.js'), + ['install', '--ignore-scripts', '--cache-folder', path.join(initCwd, 'cache', 'yarn-cache'), '--mutex', 'file:' + path.join(initCwd, 'cache', 'yarn-mutex')], + { + cwd: path.resolve(GetResourcePath(resourceName)), + stdio: 'pipe', + }); + proc.stdout.on('data', (data) => console.log(trimOutput(data))); + proc.stderr.on('data', (data) => console.error(trimOutput(data))); + proc.on('exit', (code, signal) => { + setImmediate(() => { + if (code != 0 || signal) { + buildingInProgress = false; + currentBuildingModule = ''; + cb(false, 'yarn failed!'); + return; + } + + const resourcePath = GetResourcePath(resourceName); + const yarnLock = path.resolve(resourcePath, '.yarn.installed'); + fs.writeFileSync(yarnLock, ''); + + buildingInProgress = false; + currentBuildingModule = ''; + cb(true); + }); + }); + })(); + } +}; + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} +RegisterResourceBuildTaskFactory('yarn', () => yarnBuildTask); diff --git a/resources/[system]/[builders]/yarn/yarn_cli.js b/resources/[system]/[builders]/yarn/yarn_cli.js new file mode 100644 index 0000000..d31be0b --- /dev/null +++ b/resources/[system]/[builders]/yarn/yarn_cli.js @@ -0,0 +1,147392 @@ +#!/usr/bin/env node +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 549); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = require("path"); + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = __extends; +/* unused harmony export __assign */ +/* unused harmony export __rest */ +/* unused harmony export __decorate */ +/* unused harmony export __param */ +/* unused harmony export __metadata */ +/* unused harmony export __awaiter */ +/* unused harmony export __generator */ +/* unused harmony export __exportStar */ +/* unused harmony export __values */ +/* unused harmony export __read */ +/* unused harmony export __spread */ +/* unused harmony export __await */ +/* unused harmony export __asyncGenerator */ +/* unused harmony export __asyncDelegator */ +/* unused harmony export __asyncValues */ +/* unused harmony export __makeTemplateObject */ +/* unused harmony export __importStar */ +/* unused harmony export __importDefault */ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __exportStar(m, exports) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +var _promise = __webpack_require__(227); + +var _promise2 = _interopRequireDefault(_promise); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = function (fn) { + return function () { + var gen = fn.apply(this, arguments); + return new _promise2.default(function (resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + return _promise2.default.resolve(value).then(function (value) { + step("next", value); + }, function (err) { + step("throw", err); + }); + } + } + + return step("next"); + }); + }; +}; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +module.exports = require("util"); + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getFirstSuitableFolder = exports.readFirstAvailableStream = exports.makeTempDir = exports.hardlinksWork = exports.writeFilePreservingEol = exports.getFileSizeOnDisk = exports.walk = exports.symlink = exports.find = exports.readJsonAndFile = exports.readJson = exports.readFileAny = exports.hardlinkBulk = exports.copyBulk = exports.unlink = exports.glob = exports.link = exports.chmod = exports.lstat = exports.exists = exports.mkdirp = exports.stat = exports.access = exports.rename = exports.readdir = exports.realpath = exports.readlink = exports.writeFile = exports.open = exports.readFileBuffer = exports.lockQueue = exports.constants = undefined; + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +let buildActionsForCopy = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + + // + let build = (() => { + var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, + dest = data.dest, + type = data.type; + + const onFresh = data.onFresh || noop; + const onDone = data.onDone || noop; + + // TODO https://github.com/yarnpkg/yarn/issues/3751 + // related to bundled dependencies handling + if (files.has(dest.toLowerCase())) { + reporter.verbose(`The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`); + } else { + files.add(dest.toLowerCase()); + } + + if (type === 'symlink') { + yield mkdirp((_path || _load_path()).default.dirname(dest)); + onFresh(); + actions.symlink.push({ + dest, + linkname: src + }); + onDone(); + return; + } + + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + // ignored file + return; + } + + const srcStat = yield lstat(src); + let srcFiles; + + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + + let destStat; + try { + // try accessing the destination + destStat = yield lstat(dest); + } catch (e) { + // proceed if destination doesn't exist, otherwise error + if (e.code !== 'ENOENT') { + throw e; + } + } + + // if destination exists + if (destStat) { + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + + // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving + // us modes that aren't valid. investigate this, it's generally safe to proceed. + + /* if (srcStat.mode !== destStat.mode) { + try { + await access(dest, srcStat.mode); + } catch (err) {} + } */ + + if (bothFiles && artifactFiles.has(dest)) { + // this file gets changed during build, likely by a custom install script. Don't bother checking it. + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); + return; + } + + if (bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)(srcStat.mtime, destStat.mtime)) { + // we can safely assume this is the same file + onDone(); + reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.size, +srcStat.mtime)); + return; + } + + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + // if both symlinks are the same then we can continue on + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); + return; + } + } + + if (bothFolders) { + // mark files that aren't in this folder as possibly extraneous + const destFiles = yield readdir(dest); + invariant(srcFiles, 'src files not initialised'); + + for (var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref6; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref6 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref6 = _i4.value; + } + + const file = _ref6; + + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref7; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref7 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref7 = _i5.value; + } + + const file = _ref7; + + possibleExtraneous.add((_path || _load_path()).default.join(loc, file)); + } + } + } + } + } + } + + if (destStat && destStat.isSymbolicLink()) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + destStat = null; + } + + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + if (!destStat) { + reporter.verbose(reporter.lang('verboseFileFolder', dest)); + yield mkdirp(dest); + } + + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + + // push all files to queue + invariant(srcFiles, 'src files not initialised'); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref8; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref8 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref8 = _i6.value; + } + + const file = _ref8; + + queue.push({ + dest: (_path || _load_path()).default.join(dest, file), + onFresh, + onDone: function (_onDone) { + function onDone() { + return _onDone.apply(this, arguments); + } + + onDone.toString = function () { + return _onDone.toString(); + }; + + return onDone; + }(function () { + if (--remaining === 0) { + onDone(); + } + }), + src: (_path || _load_path()).default.join(src, file) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.file.push({ + src, + dest, + atime: srcStat.atime, + mtime: srcStat.mtime, + mode: srcStat.mode + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + + return function build(_x5) { + return _ref5.apply(this, arguments); + }; + })(); + + const artifactFiles = new Set(events.artifactFiles || []); + const files = new Set(); + + // initialise events + for (var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref2; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref2 = _i.value; + } + + const item = _ref2; + + const onDone = item.onDone; + item.onDone = function () { + events.onProgress(item.dest); + if (onDone) { + onDone(); + } + }; + } + events.onStart(queue.length); + + // start building actions + const actions = { + file: [], + symlink: [], + link: [] + }; + + // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items + // at a time due to the requirement to push items onto the queue + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + + // simulate the existence of some files to prevent considering them extraneous + for (var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref3; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref3 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref3 = _i2.value; + } + + const file = _ref3; + + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); + possibleExtraneous.delete(file); + } + } + + for (var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref4; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref4 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref4 = _i3.value; + } + + const loc = _ref4; + + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + + return actions; + }); + + return function buildActionsForCopy(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; +})(); + +let buildActionsForHardlink = (() => { + var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + + // + let build = (() => { + var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, + dest = data.dest; + + const onFresh = data.onFresh || noop; + const onDone = data.onDone || noop; + if (files.has(dest.toLowerCase())) { + // Fixes issue https://github.com/yarnpkg/yarn/issues/2734 + // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1, + // package-linker passes that modules A1 and B1 need to be hardlinked, + // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case + // an exception. + onDone(); + return; + } + files.add(dest.toLowerCase()); + + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + // ignored file + return; + } + + const srcStat = yield lstat(src); + let srcFiles; + + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + + const destExists = yield exists(dest); + if (destExists) { + const destStat = yield lstat(dest); + + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + + if (srcStat.mode !== destStat.mode) { + try { + yield access(dest, srcStat.mode); + } catch (err) { + // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving + // us modes that aren't valid. investigate this, it's generally safe to proceed. + reporter.verbose(err); + } + } + + if (bothFiles && artifactFiles.has(dest)) { + // this file gets changed during build, likely by a custom install script. Don't bother checking it. + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); + return; + } + + // correct hardlink + if (bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino) { + onDone(); + reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.ino)); + return; + } + + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + // if both symlinks are the same then we can continue on + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); + return; + } + } + + if (bothFolders) { + // mark files that aren't in this folder as possibly extraneous + const destFiles = yield readdir(dest); + invariant(srcFiles, 'src files not initialised'); + + for (var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref14; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref14 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref14 = _i10.value; + } + + const file = _ref14; + + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref15; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref15 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref15 = _i11.value; + } + + const file = _ref15; + + possibleExtraneous.add((_path || _load_path()).default.join(loc, file)); + } + } + } + } + } + } + + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + reporter.verbose(reporter.lang('verboseFileFolder', dest)); + yield mkdirp(dest); + + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + + // push all files to queue + invariant(srcFiles, 'src files not initialised'); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref16; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref16 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref16 = _i12.value; + } + + const file = _ref16; + + queue.push({ + onFresh, + src: (_path || _load_path()).default.join(src, file), + dest: (_path || _load_path()).default.join(dest, file), + onDone: function (_onDone2) { + function onDone() { + return _onDone2.apply(this, arguments); + } + + onDone.toString = function () { + return _onDone2.toString(); + }; + + return onDone; + }(function () { + if (--remaining === 0) { + onDone(); + } + }) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.link.push({ + src, + dest, + removeDest: destExists + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + + return function build(_x10) { + return _ref13.apply(this, arguments); + }; + })(); + + const artifactFiles = new Set(events.artifactFiles || []); + const files = new Set(); + + // initialise events + for (var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref10; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref10 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref10 = _i7.value; + } + + const item = _ref10; + + const onDone = item.onDone || noop; + item.onDone = function () { + events.onProgress(item.dest); + onDone(); + }; + } + events.onStart(queue.length); + + // start building actions + const actions = { + file: [], + symlink: [], + link: [] + }; + + // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items + // at a time due to the requirement to push items onto the queue + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + + // simulate the existence of some files to prevent considering them extraneous + for (var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref11; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref11 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref11 = _i8.value; + } + + const file = _ref11; + + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); + possibleExtraneous.delete(file); + } + } + + for (var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref12; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref12 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref12 = _i9.value; + } + + const loc = _ref12; + + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + + return actions; + }); + + return function buildActionsForHardlink(_x6, _x7, _x8, _x9) { + return _ref9.apply(this, arguments); + }; +})(); + +let copyBulk = exports.copyBulk = (() => { + var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop, + onProgress: _events && _events.onProgress || noop, + possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), + ignoreBasenames: _events && _events.ignoreBasenames || [], + artifactFiles: _events && _events.artifactFiles || [] + }; + + const actions = yield buildActionsForCopy(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + + const fileActions = actions.file; + + const currentlyWriting = new Map(); + + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + let writePromise; + while (writePromise = currentlyWriting.get(data.dest)) { + yield writePromise; + } + + reporter.verbose(reporter.lang('verboseFileCopy', data.src, data.dest)); + const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)(data, function () { + return currentlyWriting.delete(data.dest); + }); + currentlyWriting.set(data.dest, copier); + events.onProgress(data.dest); + return copier; + }); + + return function (_x14) { + return _ref18.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + + // we need to copy symlinks last as they could reference files we were copying + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function (data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + + return function copyBulk(_x11, _x12, _x13) { + return _ref17.apply(this, arguments); + }; +})(); + +let hardlinkBulk = exports.hardlinkBulk = (() => { + var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop, + onProgress: _events && _events.onProgress || noop, + possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), + artifactFiles: _events && _events.artifactFiles || [], + ignoreBasenames: [] + }; + + const actions = yield buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + + const fileActions = actions.link; + + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + reporter.verbose(reporter.lang('verboseFileLink', data.src, data.dest)); + if (data.removeDest) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(data.dest); + } + yield link(data.src, data.dest); + }); + + return function (_x18) { + return _ref20.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + + // we need to copy symlinks last as they could reference files we were copying + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function (data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + + return function hardlinkBulk(_x15, _x16, _x17) { + return _ref19.apply(this, arguments); + }; +})(); + +let readFileAny = exports.readFileAny = (() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (files) { + for (var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref22; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref22 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref22 = _i13.value; + } + + const file = _ref22; + + if (yield exists(file)) { + return readFile(file); + } + } + return null; + }); + + return function readFileAny(_x19) { + return _ref21.apply(this, arguments); + }; +})(); + +let readJson = exports.readJson = (() => { + var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + return (yield readJsonAndFile(loc)).object; + }); + + return function readJson(_x20) { + return _ref23.apply(this, arguments); + }; +})(); + +let readJsonAndFile = exports.readJsonAndFile = (() => { + var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const file = yield readFile(loc); + try { + return { + object: (0, (_map || _load_map()).default)(JSON.parse(stripBOM(file))), + content: file + }; + } catch (err) { + err.message = `${loc}: ${err.message}`; + throw err; + } + }); + + return function readJsonAndFile(_x21) { + return _ref24.apply(this, arguments); + }; +})(); + +let find = exports.find = (() => { + var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (filename, dir) { + const parts = dir.split((_path || _load_path()).default.sep); + + while (parts.length) { + const loc = parts.concat(filename).join((_path || _load_path()).default.sep); + + if (yield exists(loc)) { + return loc; + } else { + parts.pop(); + } + } + + return false; + }); + + return function find(_x22, _x23) { + return _ref25.apply(this, arguments); + }; +})(); + +let symlink = exports.symlink = (() => { + var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) { + if (process.platform !== 'win32') { + // use relative paths otherwise which will be retained if the directory is moved + src = (_path || _load_path()).default.relative((_path || _load_path()).default.dirname(dest), src); + // When path.relative returns an empty string for the current directory, we should instead use + // '.', which is a valid fs.symlink target. + src = src || '.'; + } + + try { + const stats = yield lstat(dest); + if (stats.isSymbolicLink()) { + const resolved = dest; + if (resolved === src) { + return; + } + } + } catch (err) { + if (err.code !== 'ENOENT') { + throw err; + } + } + + // We use rimraf for unlink which never throws an ENOENT on missing target + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + + if (process.platform === 'win32') { + // use directory junctions if possible on win32, this requires absolute paths + yield fsSymlink(src, dest, 'junction'); + } else { + yield fsSymlink(src, dest); + } + }); + + return function symlink(_x24, _x25) { + return _ref26.apply(this, arguments); + }; +})(); + +let walk = exports.walk = (() => { + var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir, relativeDir, ignoreBasenames = new Set()) { + let files = []; + + let filenames = yield readdir(dir); + if (ignoreBasenames.size) { + filenames = filenames.filter(function (name) { + return !ignoreBasenames.has(name); + }); + } + + for (var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref28; + + if (_isArray14) { + if (_i14 >= _iterator14.length) break; + _ref28 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) break; + _ref28 = _i14.value; + } + + const name = _ref28; + + const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name; + const loc = (_path || _load_path()).default.join(dir, name); + const stat = yield lstat(loc); + + files.push({ + relative, + basename: name, + absolute: loc, + mtime: +stat.mtime + }); + + if (stat.isDirectory()) { + files = files.concat((yield walk(loc, relative, ignoreBasenames))); + } + } + + return files; + }); + + return function walk(_x26, _x27) { + return _ref27.apply(this, arguments); + }; +})(); + +let getFileSizeOnDisk = exports.getFileSizeOnDisk = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const stat = yield lstat(loc); + const size = stat.size, + blockSize = stat.blksize; + + + return Math.ceil(size / blockSize) * blockSize; + }); + + return function getFileSizeOnDisk(_x28) { + return _ref29.apply(this, arguments); + }; +})(); + +let getEolFromFile = (() => { + var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path) { + if (!(yield exists(path))) { + return undefined; + } + + const buffer = yield readFileBuffer(path); + + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] === cr) { + return '\r\n'; + } + if (buffer[i] === lf) { + return '\n'; + } + } + return undefined; + }); + + return function getEolFromFile(_x29) { + return _ref30.apply(this, arguments); + }; +})(); + +let writeFilePreservingEol = exports.writeFilePreservingEol = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path, data) { + const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; + if (eol !== '\n') { + data = data.replace(/\n/g, eol); + } + yield writeFile(path, data); + }); + + return function writeFilePreservingEol(_x30, _x31) { + return _ref31.apply(this, arguments); + }; +})(); + +let hardlinksWork = exports.hardlinksWork = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) { + const filename = 'test-file' + Math.random(); + const file = (_path || _load_path()).default.join(dir, filename); + const fileLink = (_path || _load_path()).default.join(dir, filename + '-link'); + try { + yield writeFile(file, 'test'); + yield link(file, fileLink); + } catch (err) { + return false; + } finally { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); + } + return true; + }); + + return function hardlinksWork(_x32) { + return _ref32.apply(this, arguments); + }; +})(); + +// not a strict polyfill for Node's fs.mkdtemp + + +let makeTempDir = exports.makeTempDir = (() => { + var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (prefix) { + const dir = (_path || _load_path()).default.join((_os || _load_os()).default.tmpdir(), `yarn-${prefix || ''}-${Date.now()}-${Math.random()}`); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); + yield mkdirp(dir); + return dir; + }); + + return function makeTempDir(_x33) { + return _ref33.apply(this, arguments); + }; +})(); + +let readFirstAvailableStream = exports.readFirstAvailableStream = (() => { + var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths) { + for (var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref35; + + if (_isArray15) { + if (_i15 >= _iterator15.length) break; + _ref35 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) break; + _ref35 = _i15.value; + } + + const path = _ref35; + + try { + const fd = yield open(path, 'r'); + return (_fs || _load_fs()).default.createReadStream(path, { fd }); + } catch (err) { + // Try the next one + } + } + return null; + }); + + return function readFirstAvailableStream(_x34) { + return _ref34.apply(this, arguments); + }; +})(); + +let getFirstSuitableFolder = exports.getFirstSuitableFolder = (() => { + var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths, mode = constants.W_OK | constants.X_OK) { + const result = { + skipped: [], + folder: null + }; + + for (var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { + var _ref37; + + if (_isArray16) { + if (_i16 >= _iterator16.length) break; + _ref37 = _iterator16[_i16++]; + } else { + _i16 = _iterator16.next(); + if (_i16.done) break; + _ref37 = _i16.value; + } + + const folder = _ref37; + + try { + yield mkdirp(folder); + yield access(folder, mode); + + result.folder = folder; + + return result; + } catch (error) { + result.skipped.push({ + error, + folder + }); + } + } + return result; + }); + + return function getFirstSuitableFolder(_x35) { + return _ref36.apply(this, arguments); + }; +})(); + +exports.copy = copy; +exports.readFile = readFile; +exports.readFileRaw = readFileRaw; +exports.normalizeOS = normalizeOS; + +var _fs; + +function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(5)); +} + +var _glob; + +function _load_glob() { + return _glob = _interopRequireDefault(__webpack_require__(99)); +} + +var _os; + +function _load_os() { + return _os = _interopRequireDefault(__webpack_require__(46)); +} + +var _path; + +function _load_path() { + return _path = _interopRequireDefault(__webpack_require__(0)); +} + +var _blockingQueue; + +function _load_blockingQueue() { + return _blockingQueue = _interopRequireDefault(__webpack_require__(110)); +} + +var _promise; + +function _load_promise() { + return _promise = _interopRequireWildcard(__webpack_require__(50)); +} + +var _promise2; + +function _load_promise2() { + return _promise2 = __webpack_require__(50); +} + +var _map; + +function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(29)); +} + +var _fsNormalized; + +function _load_fsNormalized() { + return _fsNormalized = __webpack_require__(218); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const constants = exports.constants = typeof (_fs || _load_fs()).default.constants !== 'undefined' ? (_fs || _load_fs()).default.constants : { + R_OK: (_fs || _load_fs()).default.R_OK, + W_OK: (_fs || _load_fs()).default.W_OK, + X_OK: (_fs || _load_fs()).default.X_OK +}; + +const lockQueue = exports.lockQueue = new (_blockingQueue || _load_blockingQueue()).default('fs lock'); + +const readFileBuffer = exports.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readFile); +const open = exports.open = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.open); +const writeFile = exports.writeFile = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.writeFile); +const readlink = exports.readlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readlink); +const realpath = exports.realpath = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.realpath); +const readdir = exports.readdir = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readdir); +const rename = exports.rename = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.rename); +const access = exports.access = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.access); +const stat = exports.stat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.stat); +const mkdirp = exports.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(145)); +const exists = exports.exists = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.exists, true); +const lstat = exports.lstat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.lstat); +const chmod = exports.chmod = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.chmod); +const link = exports.link = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.link); +const glob = exports.glob = (0, (_promise2 || _load_promise2()).promisify)((_glob || _load_glob()).default); +exports.unlink = (_fsNormalized || _load_fsNormalized()).unlink; + +// fs.copyFile uses the native file copying instructions on the system, performing much better +// than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the +// concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD. + +const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4; + +const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.symlink); +const invariant = __webpack_require__(9); +const stripBOM = __webpack_require__(160); + +const noop = () => {}; + +function copy(src, dest, reporter) { + return copyBulk([{ src, dest }], reporter); +} + +function _readFile(loc, encoding) { + return new Promise((resolve, reject) => { + (_fs || _load_fs()).default.readFile(loc, encoding, function (err, content) { + if (err) { + reject(err); + } else { + resolve(content); + } + }); + }); +} + +function readFile(loc) { + return _readFile(loc, 'utf8').then(normalizeOS); +} + +function readFileRaw(loc) { + return _readFile(loc, 'binary'); +} + +function normalizeOS(body) { + return body.replace(/\r\n/g, '\n'); +} + +const cr = '\r'.charCodeAt(0); +const lf = '\n'.charCodeAt(0); + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +class MessageError extends Error { + constructor(msg, code) { + super(msg); + this.code = code; + } + +} + +exports.MessageError = MessageError; +class ProcessSpawnError extends MessageError { + constructor(msg, code, process) { + super(msg, code); + this.process = process; + } + +} + +exports.ProcessSpawnError = ProcessSpawnError; +class SecurityError extends MessageError {} + +exports.SecurityError = SecurityError; +class ProcessTermError extends MessageError {} + +exports.ProcessTermError = ProcessTermError; +class ResponseError extends Error { + constructor(msg, responseCode) { + super(msg); + this.responseCode = responseCode; + } + +} + +exports.ResponseError = ResponseError; +class OneTimePasswordError extends Error {} +exports.OneTimePasswordError = OneTimePasswordError; + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subscriber; }); +/* unused harmony export SafeSubscriber */ +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isFunction__ = __webpack_require__(154); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = __webpack_require__(321); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(185); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = __webpack_require__(323); +/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ + + + + + + + +var Subscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](Subscriber, _super); + function Subscriber(destinationOrNext, error, complete) { + var _this = _super.call(this) || this; + _this.syncErrorValue = null; + _this.syncErrorThrown = false; + _this.syncErrorThrowable = false; + _this.isStopped = false; + _this._parentSubscription = null; + switch (arguments.length) { + case 0: + _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]; + break; + case 1: + if (!destinationOrNext) { + _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]; + break; + } + if (typeof destinationOrNext === 'object') { + if (destinationOrNext instanceof Subscriber) { + _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; + _this.destination = destinationOrNext; + destinationOrNext.add(_this); + } + else { + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext); + } + break; + } + default: + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); + break; + } + return _this; + } + Subscriber.prototype[__WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__["a" /* rxSubscriber */]] = function () { return this; }; + Subscriber.create = function (next, error, complete) { + var subscriber = new Subscriber(next, error, complete); + subscriber.syncErrorThrowable = false; + return subscriber; + }; + Subscriber.prototype.next = function (value) { + if (!this.isStopped) { + this._next(value); + } + }; + Subscriber.prototype.error = function (err) { + if (!this.isStopped) { + this.isStopped = true; + this._error(err); + } + }; + Subscriber.prototype.complete = function () { + if (!this.isStopped) { + this.isStopped = true; + this._complete(); + } + }; + Subscriber.prototype.unsubscribe = function () { + if (this.closed) { + return; + } + this.isStopped = true; + _super.prototype.unsubscribe.call(this); + }; + Subscriber.prototype._next = function (value) { + this.destination.next(value); + }; + Subscriber.prototype._error = function (err) { + this.destination.error(err); + this.unsubscribe(); + }; + Subscriber.prototype._complete = function () { + this.destination.complete(); + this.unsubscribe(); + }; + Subscriber.prototype._unsubscribeAndRecycle = function () { + var _a = this, _parent = _a._parent, _parents = _a._parents; + this._parent = null; + this._parents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parent = _parent; + this._parents = _parents; + this._parentSubscription = null; + return this; + }; + return Subscriber; +}(__WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */])); + +var SafeSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](SafeSubscriber, _super); + function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { + var _this = _super.call(this) || this; + _this._parentSubscriber = _parentSubscriber; + var next; + var context = _this; + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__["a" /* isFunction */])(observerOrNext)) { + next = observerOrNext; + } + else if (observerOrNext) { + next = observerOrNext.next; + error = observerOrNext.error; + complete = observerOrNext.complete; + if (observerOrNext !== __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]) { + context = Object.create(observerOrNext); + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__["a" /* isFunction */])(context.unsubscribe)) { + _this.add(context.unsubscribe.bind(context)); + } + context.unsubscribe = _this.unsubscribe.bind(_this); + } + } + _this._context = context; + _this._next = next; + _this._error = error; + _this._complete = complete; + return _this; + } + SafeSubscriber.prototype.next = function (value) { + if (!this.isStopped && this._next) { + var _parentSubscriber = this._parentSubscriber; + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._next, value); + } + else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + var useDeprecatedSynchronousErrorHandling = __WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling; + if (this._error) { + if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._error, err); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, this._error, err); + this.unsubscribe(); + } + } + else if (!_parentSubscriber.syncErrorThrowable) { + this.unsubscribe(); + if (useDeprecatedSynchronousErrorHandling) { + throw err; + } + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + else { + if (useDeprecatedSynchronousErrorHandling) { + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.complete = function () { + var _this = this; + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + if (this._complete) { + var wrappedComplete = function () { return _this._complete.call(_this._context); }; + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(wrappedComplete); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, wrappedComplete); + this.unsubscribe(); + } + } + else { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { + try { + fn.call(this._context, value); + } + catch (err) { + this.unsubscribe(); + if (__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + } + }; + SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + throw new Error('bad call'); + } + try { + fn.call(this._context, value); + } + catch (err) { + if (__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + parent.syncErrorValue = err; + parent.syncErrorThrown = true; + return true; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + return true; + } + } + return false; + }; + SafeSubscriber.prototype._unsubscribe = function () { + var _parentSubscriber = this._parentSubscriber; + this._context = null; + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); + }; + return SafeSubscriber; +}(Subscriber)); + +//# sourceMappingURL=Subscriber.js.map + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getPathKey = getPathKey; +const os = __webpack_require__(46); +const path = __webpack_require__(0); +const userHome = __webpack_require__(67).default; + +var _require = __webpack_require__(225); + +const getCacheDir = _require.getCacheDir, + getConfigDir = _require.getConfigDir, + getDataDir = _require.getDataDir; + +const isWebpackBundle = __webpack_require__(278); + +const DEPENDENCY_TYPES = exports.DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies', 'peerDependencies']; +const OWNED_DEPENDENCY_TYPES = exports.OWNED_DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies']; + +const RESOLUTIONS = exports.RESOLUTIONS = 'resolutions'; +const MANIFEST_FIELDS = exports.MANIFEST_FIELDS = [RESOLUTIONS, ...DEPENDENCY_TYPES]; + +const SUPPORTED_NODE_VERSIONS = exports.SUPPORTED_NODE_VERSIONS = '^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0'; + +const YARN_REGISTRY = exports.YARN_REGISTRY = 'https://registry.yarnpkg.com'; +const NPM_REGISTRY_RE = exports.NPM_REGISTRY_RE = /https?:\/\/registry\.npmjs\.org/g; + +const YARN_DOCS = exports.YARN_DOCS = 'https://yarnpkg.com/en/docs/cli/'; +const YARN_INSTALLER_SH = exports.YARN_INSTALLER_SH = 'https://yarnpkg.com/install.sh'; +const YARN_INSTALLER_MSI = exports.YARN_INSTALLER_MSI = 'https://yarnpkg.com/latest.msi'; + +const SELF_UPDATE_VERSION_URL = exports.SELF_UPDATE_VERSION_URL = 'https://yarnpkg.com/latest-version'; + +// cache version, bump whenever we make backwards incompatible changes +const CACHE_VERSION = exports.CACHE_VERSION = 6; + +// lockfile version, bump whenever we make backwards incompatible changes +const LOCKFILE_VERSION = exports.LOCKFILE_VERSION = 1; + +// max amount of network requests to perform concurrently +const NETWORK_CONCURRENCY = exports.NETWORK_CONCURRENCY = 8; + +// HTTP timeout used when downloading packages +const NETWORK_TIMEOUT = exports.NETWORK_TIMEOUT = 30 * 1000; // in milliseconds + +// max amount of child processes to execute concurrently +const CHILD_CONCURRENCY = exports.CHILD_CONCURRENCY = 5; + +const REQUIRED_PACKAGE_KEYS = exports.REQUIRED_PACKAGE_KEYS = ['name', 'version', '_uid']; + +function getPreferredCacheDirectories() { + const preferredCacheDirectories = [getCacheDir()]; + + if (process.getuid) { + // $FlowFixMe: process.getuid exists, dammit + preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache-${process.getuid()}`)); + } + + preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache`)); + + return preferredCacheDirectories; +} + +const PREFERRED_MODULE_CACHE_DIRECTORIES = exports.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories(); +const CONFIG_DIRECTORY = exports.CONFIG_DIRECTORY = getConfigDir(); +const DATA_DIRECTORY = exports.DATA_DIRECTORY = getDataDir(); +const LINK_REGISTRY_DIRECTORY = exports.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, 'link'); +const GLOBAL_MODULE_DIRECTORY = exports.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, 'global'); + +const NODE_BIN_PATH = exports.NODE_BIN_PATH = process.execPath; +const YARN_BIN_PATH = exports.YARN_BIN_PATH = getYarnBinPath(); + +// Webpack needs to be configured with node.__dirname/__filename = false +function getYarnBinPath() { + if (isWebpackBundle) { + return __filename; + } else { + return path.join(__dirname, '..', 'bin', 'yarn.js'); + } +} + +const NODE_MODULES_FOLDER = exports.NODE_MODULES_FOLDER = 'node_modules'; +const NODE_PACKAGE_JSON = exports.NODE_PACKAGE_JSON = 'package.json'; + +const PNP_FILENAME = exports.PNP_FILENAME = '.pnp.js'; + +const POSIX_GLOBAL_PREFIX = exports.POSIX_GLOBAL_PREFIX = `${process.env.DESTDIR || ''}/usr/local`; +const FALLBACK_GLOBAL_PREFIX = exports.FALLBACK_GLOBAL_PREFIX = path.join(userHome, '.yarn'); + +const META_FOLDER = exports.META_FOLDER = '.yarn-meta'; +const INTEGRITY_FILENAME = exports.INTEGRITY_FILENAME = '.yarn-integrity'; +const LOCKFILE_FILENAME = exports.LOCKFILE_FILENAME = 'yarn.lock'; +const METADATA_FILENAME = exports.METADATA_FILENAME = '.yarn-metadata.json'; +const TARBALL_FILENAME = exports.TARBALL_FILENAME = '.yarn-tarball.tgz'; +const CLEAN_FILENAME = exports.CLEAN_FILENAME = '.yarnclean'; + +const NPM_LOCK_FILENAME = exports.NPM_LOCK_FILENAME = 'package-lock.json'; +const NPM_SHRINKWRAP_FILENAME = exports.NPM_SHRINKWRAP_FILENAME = 'npm-shrinkwrap.json'; + +const DEFAULT_INDENT = exports.DEFAULT_INDENT = ' '; +const SINGLE_INSTANCE_PORT = exports.SINGLE_INSTANCE_PORT = 31997; +const SINGLE_INSTANCE_FILENAME = exports.SINGLE_INSTANCE_FILENAME = '.yarn-single-instance'; + +const ENV_PATH_KEY = exports.ENV_PATH_KEY = getPathKey(process.platform, process.env); + +function getPathKey(platform, env) { + let pathKey = 'PATH'; + + // windows calls its path "Path" usually, but this is not guaranteed. + if (platform === 'win32') { + pathKey = 'Path'; + + for (const key in env) { + if (key.toLowerCase() === 'path') { + pathKey = key; + } + } + } + + return pathKey; +} + +const VERSION_COLOR_SCHEME = exports.VERSION_COLOR_SCHEME = { + major: 'red', + premajor: 'red', + minor: 'yellow', + preminor: 'yellow', + patch: 'green', + prepatch: 'green', + prerelease: 'red', + unchanged: 'white', + unknown: 'red' +}; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var NODE_ENV = process.env.NODE_ENV; + +var invariant = function(condition, format, a, b, c, d, e, f) { + if (NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var YAMLException = __webpack_require__(54); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'defaultStyle', + 'styleAliases' +]; + +var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' +]; + +function compileStyleAliases(map) { + var result = {}; + + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + + return result; +} + +function Type(tag, options) { + options = options || {}; + + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + + // TODO: Add tag format check. + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} + +module.exports = Type; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports) { + +module.exports = require("crypto"); + +/***/ }), +/* 12 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Observable; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = __webpack_require__(322); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = __webpack_require__(932); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(117); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(324); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(185); +/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ + + + + + +var Observable = /*@__PURE__*/ (function () { + function Observable(subscribe) { + this._isScalar = false; + if (subscribe) { + this._subscribe = subscribe; + } + } + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; + }; + Observable.prototype.subscribe = function (observerOrNext, error, complete) { + var operator = this.operator; + var sink = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__["a" /* toSubscriber */])(observerOrNext, error, complete); + if (operator) { + operator.call(sink, this.source); + } + else { + sink.add(this.source || (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? + this._subscribe(sink) : + this._trySubscribe(sink)); + } + if (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + if (sink.syncErrorThrowable) { + sink.syncErrorThrowable = false; + if (sink.syncErrorThrown) { + throw sink.syncErrorValue; + } + } + } + return sink; + }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + if (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_canReportError__["a" /* canReportError */])(sink)) { + sink.error(err); + } + else { + console.warn(err); + } + } + }; + Observable.prototype.forEach = function (next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var subscription; + subscription = _this.subscribe(function (value) { + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, reject, resolve); + }); + }; + Observable.prototype._subscribe = function (subscriber) { + var source = this.source; + return source && source.subscribe(subscriber); + }; + Observable.prototype[__WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__["a" /* observable */]] = function () { + return this; + }; + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; + } + if (operations.length === 0) { + return this; + } + return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_pipe__["b" /* pipeFromArray */])(operations)(this); + }; + Observable.prototype.toPromise = function (promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); + }; + Observable.create = function (subscribe) { + return new Observable(subscribe); + }; + return Observable; +}()); + +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = __WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} +//# sourceMappingURL=Observable.js.map + + +/***/ }), +/* 13 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return OuterSubscriber; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +var OuterSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](OuterSubscriber, _super); + function OuterSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); + }; + OuterSubscriber.prototype.notifyComplete = function (innerSub) { + this.destination.complete(); + }; + return OuterSubscriber; +}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__["a" /* Subscriber */])); + +//# sourceMappingURL=OuterSubscriber.js.map + + +/***/ }), +/* 14 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = subscribeToResult; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__ = __webpack_require__(84); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeTo__ = __webpack_require__(446); +/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo PURE_IMPORTS_END */ + + +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { + destination = new __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__["a" /* InnerSubscriber */](outerSubscriber, outerValue, outerIndex); + } + if (destination.closed) { + return; + } + return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__subscribeTo__["a" /* subscribeTo */])(result)(destination); +} +//# sourceMappingURL=subscribeToResult.js.map + + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* eslint-disable node/no-deprecated-api */ + + + +var buffer = __webpack_require__(64) +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer + + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright (c) 2012, Mark Cavage. All rights reserved. +// Copyright 2015 Joyent, Inc. + +var assert = __webpack_require__(28); +var Stream = __webpack_require__(23).Stream; +var util = __webpack_require__(3); + + +///--- Globals + +/* JSSTYLED */ +var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; + + +///--- Internal + +function _capitalize(str) { + return (str.charAt(0).toUpperCase() + str.slice(1)); +} + +function _toss(name, expected, oper, arg, actual) { + throw new assert.AssertionError({ + message: util.format('%s (%s) is required', name, expected), + actual: (actual === undefined) ? typeof (arg) : actual(arg), + expected: expected, + operator: oper || '===', + stackStartFunction: _toss.caller + }); +} + +function _getClass(arg) { + return (Object.prototype.toString.call(arg).slice(8, -1)); +} + +function noop() { + // Why even bother with asserts? +} + + +///--- Exports + +var types = { + bool: { + check: function (arg) { return typeof (arg) === 'boolean'; } + }, + func: { + check: function (arg) { return typeof (arg) === 'function'; } + }, + string: { + check: function (arg) { return typeof (arg) === 'string'; } + }, + object: { + check: function (arg) { + return typeof (arg) === 'object' && arg !== null; + } + }, + number: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg); + } + }, + finite: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + } + }, + buffer: { + check: function (arg) { return Buffer.isBuffer(arg); }, + operator: 'Buffer.isBuffer' + }, + array: { + check: function (arg) { return Array.isArray(arg); }, + operator: 'Array.isArray' + }, + stream: { + check: function (arg) { return arg instanceof Stream; }, + operator: 'instanceof', + actual: _getClass + }, + date: { + check: function (arg) { return arg instanceof Date; }, + operator: 'instanceof', + actual: _getClass + }, + regexp: { + check: function (arg) { return arg instanceof RegExp; }, + operator: 'instanceof', + actual: _getClass + }, + uuid: { + check: function (arg) { + return typeof (arg) === 'string' && UUID_REGEXP.test(arg); + }, + operator: 'isUUID' + } +}; + +function _setExports(ndebug) { + var keys = Object.keys(types); + var out; + + /* re-export standard assert */ + if (process.env.NODE_NDEBUG) { + out = noop; + } else { + out = function (arg, msg) { + if (!arg) { + _toss(msg, 'true', arg); + } + }; + } + + /* standard checks */ + keys.forEach(function (k) { + if (ndebug) { + out[k] = noop; + return; + } + var type = types[k]; + out[k] = function (arg, msg) { + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* optional checks */ + keys.forEach(function (k) { + var name = 'optional' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* arrayOf checks */ + keys.forEach(function (k) { + var name = 'arrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* optionalArrayOf checks */ + keys.forEach(function (k) { + var name = 'optionalArrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* re-export built-in assertions */ + Object.keys(assert).forEach(function (k) { + if (k === 'AssertionError') { + out[k] = assert[k]; + return; + } + if (ndebug) { + out[k] = noop; + return; + } + out[k] = assert[k]; + }); + + /* export ourselves (for unit tests _only_) */ + out._setExports = _setExports; + + return out; +} + +module.exports = _setExports(process.env.NODE_NDEBUG); + + +/***/ }), +/* 17 */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.sortAlpha = sortAlpha; +exports.sortOptionsByFlags = sortOptionsByFlags; +exports.entries = entries; +exports.removePrefix = removePrefix; +exports.removeSuffix = removeSuffix; +exports.addSuffix = addSuffix; +exports.hyphenate = hyphenate; +exports.camelCase = camelCase; +exports.compareSortedArrays = compareSortedArrays; +exports.sleep = sleep; +const _camelCase = __webpack_require__(230); + +function sortAlpha(a, b) { + // sort alphabetically in a deterministic way + const shortLen = Math.min(a.length, b.length); + for (let i = 0; i < shortLen; i++) { + const aChar = a.charCodeAt(i); + const bChar = b.charCodeAt(i); + if (aChar !== bChar) { + return aChar - bChar; + } + } + return a.length - b.length; +} + +function sortOptionsByFlags(a, b) { + const aOpt = a.flags.replace(/-/g, ''); + const bOpt = b.flags.replace(/-/g, ''); + return sortAlpha(aOpt, bOpt); +} + +function entries(obj) { + const entries = []; + if (obj) { + for (const key in obj) { + entries.push([key, obj[key]]); + } + } + return entries; +} + +function removePrefix(pattern, prefix) { + if (pattern.startsWith(prefix)) { + pattern = pattern.slice(prefix.length); + } + + return pattern; +} + +function removeSuffix(pattern, suffix) { + if (pattern.endsWith(suffix)) { + return pattern.slice(0, -suffix.length); + } + + return pattern; +} + +function addSuffix(pattern, suffix) { + if (!pattern.endsWith(suffix)) { + return pattern + suffix; + } + + return pattern; +} + +function hyphenate(str) { + return str.replace(/[A-Z]/g, match => { + return '-' + match.charAt(0).toLowerCase(); + }); +} + +function camelCase(str) { + if (/[A-Z]/.test(str)) { + return null; + } else { + return _camelCase(str); + } +} + +function compareSortedArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (let i = 0, len = array1.length; i < len; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; +} + +function sleep(ms) { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +} + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.stringify = exports.parse = undefined; + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +var _parse; + +function _load_parse() { + return _parse = __webpack_require__(105); +} + +Object.defineProperty(exports, 'parse', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_parse || _load_parse()).default; + } +}); + +var _stringify; + +function _load_stringify() { + return _stringify = __webpack_require__(199); +} + +Object.defineProperty(exports, 'stringify', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_stringify || _load_stringify()).default; + } +}); +exports.implodeEntry = implodeEntry; +exports.explodeEntry = explodeEntry; + +var _misc; + +function _load_misc() { + return _misc = __webpack_require__(18); +} + +var _normalizePattern; + +function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(37); +} + +var _parse2; + +function _load_parse2() { + return _parse2 = _interopRequireDefault(__webpack_require__(105)); +} + +var _constants; + +function _load_constants() { + return _constants = __webpack_require__(8); +} + +var _fs; + +function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(4)); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const invariant = __webpack_require__(9); + +const path = __webpack_require__(0); +const ssri = __webpack_require__(65); + +function getName(pattern) { + return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern).name; +} + +function blankObjectUndefined(obj) { + return obj && Object.keys(obj).length ? obj : undefined; +} + +function keyForRemote(remote) { + return remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null); +} + +function serializeIntegrity(integrity) { + // We need this because `Integrity.toString()` does not use sorting to ensure a stable string output + // See https://git.io/vx2Hy + return integrity.toString().split(' ').sort().join(' '); +} + +function implodeEntry(pattern, obj) { + const inferredName = getName(pattern); + const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : ''; + const imploded = { + name: inferredName === obj.name ? undefined : obj.name, + version: obj.version, + uid: obj.uid === obj.version ? undefined : obj.uid, + resolved: obj.resolved, + registry: obj.registry === 'npm' ? undefined : obj.registry, + dependencies: blankObjectUndefined(obj.dependencies), + optionalDependencies: blankObjectUndefined(obj.optionalDependencies), + permissions: blankObjectUndefined(obj.permissions), + prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants) + }; + if (integrity) { + imploded.integrity = integrity; + } + return imploded; +} + +function explodeEntry(pattern, obj) { + obj.optionalDependencies = obj.optionalDependencies || {}; + obj.dependencies = obj.dependencies || {}; + obj.uid = obj.uid || obj.version; + obj.permissions = obj.permissions || {}; + obj.registry = obj.registry || 'npm'; + obj.name = obj.name || getName(pattern); + const integrity = obj.integrity; + if (integrity && integrity.isIntegrity) { + obj.integrity = ssri.parse(integrity); + } + return obj; +} + +class Lockfile { + constructor({ cache, source, parseResultType } = {}) { + this.source = source || ''; + this.cache = cache; + this.parseResultType = parseResultType; + } + + // source string if the `cache` was parsed + + + // if true, we're parsing an old yarn file and need to update integrity fields + hasEntriesExistWithoutIntegrity() { + if (!this.cache) { + return false; + } + + for (const key in this.cache) { + // $FlowFixMe - `this.cache` is clearly defined at this point + if (!/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity) { + return true; + } + } + + return false; + } + + static fromDirectory(dir, reporter) { + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // read the manifest in this directory + const lockfileLoc = path.join(dir, (_constants || _load_constants()).LOCKFILE_FILENAME); + + let lockfile; + let rawLockfile = ''; + let parseResult; + + if (yield (_fs || _load_fs()).exists(lockfileLoc)) { + rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); + parseResult = (0, (_parse2 || _load_parse2()).default)(rawLockfile, lockfileLoc); + + if (reporter) { + if (parseResult.type === 'merge') { + reporter.info(reporter.lang('lockfileMerged')); + } else if (parseResult.type === 'conflict') { + reporter.warn(reporter.lang('lockfileConflict')); + } + } + + lockfile = parseResult.object; + } else if (reporter) { + reporter.info(reporter.lang('noLockfileFound')); + } + + if (lockfile && lockfile.__metadata) { + const lockfilev2 = lockfile; + lockfile = {}; + } + + return new Lockfile({ cache: lockfile, source: rawLockfile, parseResultType: parseResult && parseResult.type }); + })(); + } + + getLocked(pattern) { + const cache = this.cache; + if (!cache) { + return undefined; + } + + const shrunk = pattern in cache && cache[pattern]; + + if (typeof shrunk === 'string') { + return this.getLocked(shrunk); + } else if (shrunk) { + explodeEntry(pattern, shrunk); + return shrunk; + } + + return undefined; + } + + removePattern(pattern) { + const cache = this.cache; + if (!cache) { + return; + } + delete cache[pattern]; + } + + getLockfile(patterns) { + const lockfile = {}; + const seen = new Map(); + + // order by name so that lockfile manifest is assigned to the first dependency with this manifest + // the others that have the same remoteKey will just refer to the first + // ordering allows for consistency in lockfile when it is serialized + const sortedPatternsKeys = Object.keys(patterns).sort((_misc || _load_misc()).sortAlpha); + + for (var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const pattern = _ref; + + const pkg = patterns[pattern]; + const remote = pkg._remote, + ref = pkg._reference; + + invariant(ref, 'Package is missing a reference'); + invariant(remote, 'Package is missing a remote'); + + const remoteKey = keyForRemote(remote); + const seenPattern = remoteKey && seen.get(remoteKey); + if (seenPattern) { + // no point in duplicating it + lockfile[pattern] = seenPattern; + + // if we're relying on our name being inferred and two of the patterns have + // different inferred names then we need to set it + if (!seenPattern.name && getName(pattern) !== pkg.name) { + seenPattern.name = pkg.name; + } + continue; + } + const obj = implodeEntry(pattern, { + name: pkg.name, + version: pkg.version, + uid: pkg._uid, + resolved: remote.resolved, + integrity: remote.integrity, + registry: remote.registry, + dependencies: pkg.dependencies, + peerDependencies: pkg.peerDependencies, + optionalDependencies: pkg.optionalDependencies, + permissions: ref.permissions, + prebuiltVariants: pkg.prebuiltVariants + }); + + lockfile[pattern] = obj; + + if (remoteKey) { + seen.set(remoteKey, obj); + } + } + + return lockfile; + } +} +exports.default = Lockfile; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(133)('wks'); +var uid = __webpack_require__(137); +var Symbol = __webpack_require__(17).Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +var _assign = __webpack_require__(591); + +var _assign2 = _interopRequireDefault(_assign); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _assign2.default || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/***/ }), +/* 22 */ +/***/ (function(module, exports) { + +exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +var MAX_LENGTH = 256; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++; +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + if (version.length > MAX_LENGTH) + return null; + + var r = loose ? re[LOOSE] : re[FULL]; + if (!r.test(version)) + return null; + + try { + return new SemVer(version, loose); + } catch (er) { + return null; + } +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (version.length > MAX_LENGTH) + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) + throw new TypeError('Invalid major version') + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) + throw new TypeError('Invalid minor version') + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) + throw new TypeError('Invalid patch version') + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) + return num; + } + return id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break; + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) + this.prerelease = [identifier, 0]; + } else + this.prerelease = [identifier, 0]; + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + this.raw = this.version; + return this; +}; + +exports.inc = inc; +function inc(version, release, loose, identifier) { + if (typeof(loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version; + } catch (er) { + return null; + } +} + +exports.diff = diff; +function diff(version1, version2) { + if (eq(version1, version2)) { + return null; + } else { + var v1 = parse(version1); + var v2 = parse(version2); + if (v1.prerelease.length || v2.prerelease.length) { + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return 'pre'+key; + } + } + } + return 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return key; + } + } + } + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.major = major; +function major(a, loose) { + return new SemVer(a, loose).major; +} + +exports.minor = minor; +function minor(a, loose) { + return new SemVer(a, loose).minor; +} + +exports.patch = patch; +function patch(a, loose) { + return new SemVer(a, loose).patch; +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; + + debug('comp', this); +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else + this.semver = new SemVer(m[2], this.loose); +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); +}; + +Comparator.prototype.intersects = function(comp, loose) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required'); + } + + var rangeTmp; + + if (this.operator === '') { + rangeTmp = new Range(comp.value, loose); + return satisfies(this.value, rangeTmp, loose); + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, loose); + return satisfies(comp.semver, rangeTmp, loose); + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>'); + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<'); + var sameSemVer = this.semver.version === comp.semver.version; + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<='); + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, loose) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')); + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, loose) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')); + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; +}; + + +exports.Range = Range; +function Range(range, loose) { + if (range instanceof Range) { + if (range.loose === loose) { + return range; + } else { + return new Range(range.raw, loose); + } + } + + if (range instanceof Comparator) { + return new Range(range.value, loose); + } + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +Range.prototype.intersects = function(range, loose) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required'); + } + + return this.set.some(function(thisComparators) { + return thisComparators.every(function(thisComparator) { + return range.set.some(function(rangeComparators) { + return rangeComparators.every(function(rangeComparator) { + return thisComparator.intersects(rangeComparator, loose); + }); + }); + }); + }); +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + debug('caret', comp, loose); + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } else if (pr) { + debug('replaceCaret pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0'; + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // replace X with 0 + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) + M = +M + 1; + else + m = +m + 1; + } + + ret = gtlt + M + '.' + m + '.' + p; + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + continue; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + var max = null; + var maxSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) + max = v; + maxSV = new SemVer(max, loose); + } + } + }) + return max; +} + +exports.minSatisfying = minSatisfying; +function minSatisfying(versions, range, loose) { + var min = null; + var minSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!min || minSV.compare(v) === 1) { // compare(min, v, true) + min = v; + minSV = new SemVer(min, loose); + } + } + }) + return min; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +exports.prerelease = prerelease; +function prerelease(version, loose) { + var parsed = parse(version, loose); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; +} + +exports.intersects = intersects; +function intersects(r1, r2, loose) { + r1 = new Range(r1, loose) + r2 = new Range(r2, loose) + return r1.intersects(r2) +} + +exports.coerce = coerce; +function coerce(version) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + var match = version.match(re[COERCE]); + + if (match == null) + return null; + + return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); +} + + +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + +module.exports = require("stream"); + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 25 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subscription; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = __webpack_require__(444); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(154); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(56); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = __webpack_require__(441); +/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */ + + + + + + +var Subscription = /*@__PURE__*/ (function () { + function Subscription(unsubscribe) { + this.closed = false; + this._parent = null; + this._parents = null; + this._subscriptions = null; + if (unsubscribe) { + this._unsubscribe = unsubscribe; + } + } + Subscription.prototype.unsubscribe = function () { + var hasErrors = false; + var errors; + if (this.closed) { + return; + } + var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this.closed = true; + this._parent = null; + this._parents = null; + this._subscriptions = null; + var index = -1; + var len = _parents ? _parents.length : 0; + while (_parent) { + _parent.remove(this); + _parent = ++index < len && _parents[index] || null; + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isFunction__["a" /* isFunction */])(_unsubscribe)) { + var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__["a" /* tryCatch */])(_unsubscribe).call(this); + if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */]) { + hasErrors = true; + errors = errors || (__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */] ? + flattenUnsubscriptionErrors(__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e.errors) : [__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e]); + } + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isArray__["a" /* isArray */])(_subscriptions)) { + index = -1; + len = _subscriptions.length; + while (++index < len) { + var sub = _subscriptions[index]; + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isObject__["a" /* isObject */])(sub)) { + var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__["a" /* tryCatch */])(sub.unsubscribe).call(sub); + if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */]) { + hasErrors = true; + errors = errors || []; + var err = __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e; + if (err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */]) { + errors = errors.concat(flattenUnsubscriptionErrors(err.errors)); + } + else { + errors.push(err); + } + } + } + } + } + if (hasErrors) { + throw new __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */](errors); + } + }; + Subscription.prototype.add = function (teardown) { + if (!teardown || (teardown === Subscription.EMPTY)) { + return Subscription.EMPTY; + } + if (teardown === this) { + return this; + } + var subscription = teardown; + switch (typeof teardown) { + case 'function': + subscription = new Subscription(teardown); + case 'object': + if (subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; + } + else if (this.closed) { + subscription.unsubscribe(); + return subscription; + } + else if (typeof subscription._addParent !== 'function') { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; + } + break; + default: + throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); + } + var subscriptions = this._subscriptions || (this._subscriptions = []); + subscriptions.push(subscription); + subscription._addParent(this); + return subscription; + }; + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } + } + }; + Subscription.prototype._addParent = function (parent) { + var _a = this, _parent = _a._parent, _parents = _a._parents; + if (!_parent || _parent === parent) { + this._parent = parent; + } + else if (!_parents) { + this._parents = [parent]; + } + else if (_parents.indexOf(parent) === -1) { + _parents.push(parent); + } + }; + Subscription.EMPTY = (function (empty) { + empty.closed = true; + return empty; + }(new Subscription())); + return Subscription; +}()); + +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */]) ? err.errors : err); }, []); +} +//# sourceMappingURL=Subscription.js.map + + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2015 Joyent, Inc. + +module.exports = { + bufferSplit: bufferSplit, + addRSAMissing: addRSAMissing, + calculateDSAPublic: calculateDSAPublic, + calculateED25519Public: calculateED25519Public, + calculateX25519Public: calculateX25519Public, + mpNormalize: mpNormalize, + mpDenormalize: mpDenormalize, + ecNormalize: ecNormalize, + countZeros: countZeros, + assertCompatible: assertCompatible, + isCompatible: isCompatible, + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo, + publicFromPrivateECDSA: publicFromPrivateECDSA, + zeroPadToLength: zeroPadToLength, + writeBitString: writeBitString, + readBitString: readBitString +}; + +var assert = __webpack_require__(16); +var Buffer = __webpack_require__(15).Buffer; +var PrivateKey = __webpack_require__(33); +var Key = __webpack_require__(27); +var crypto = __webpack_require__(11); +var algs = __webpack_require__(32); +var asn1 = __webpack_require__(66); + +var ec, jsbn; +var nacl; + +var MAX_CLASS_DEPTH = 3; + +function isCompatible(obj, klass, needVer) { + if (obj === null || typeof (obj) !== 'object') + return (false); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return (true); + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + if (!proto || ++depth > MAX_CLASS_DEPTH) + return (false); + } + if (proto.constructor.name !== klass.name) + return (false); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + if (ver[0] != needVer[0] || ver[1] < needVer[1]) + return (false); + return (true); +} + +function assertCompatible(obj, klass, needVer, name) { + if (name === undefined) + name = 'object'; + assert.ok(obj, name + ' must not be null'); + assert.object(obj, name + ' must be an object'); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return; + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, + name + ' must be a ' + klass.name + ' instance'); + } + assert.strictEqual(proto.constructor.name, klass.name, + name + ' must be a ' + klass.name + ' instance'); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], + name + ' must be compatible with ' + klass.name + ' klass ' + + 'version ' + needVer[0] + '.' + needVer[1]); +} + +var CIPHER_LEN = { + 'des-ede3-cbc': { key: 7, iv: 8 }, + 'aes-128-cbc': { key: 16, iv: 16 } +}; +var PKCS5_SALT_LEN = 8; + +function opensslKeyDeriv(cipher, salt, passphrase, count) { + assert.buffer(salt, 'salt'); + assert.buffer(passphrase, 'passphrase'); + assert.number(count, 'iteration count'); + + var clen = CIPHER_LEN[cipher]; + assert.object(clen, 'supported cipher'); + + salt = salt.slice(0, PKCS5_SALT_LEN); + + var D, D_prev, bufs; + var material = Buffer.alloc(0); + while (material.length < clen.key + clen.iv) { + bufs = []; + if (D_prev) + bufs.push(D_prev); + bufs.push(passphrase); + bufs.push(salt); + D = Buffer.concat(bufs); + for (var j = 0; j < count; ++j) + D = crypto.createHash('md5').update(D).digest(); + material = Buffer.concat([material, D]); + D_prev = D; + } + + return ({ + key: material.slice(0, clen.key), + iv: material.slice(clen.key, clen.key + clen.iv) + }); +} + +/* Count leading zero bits on a buffer */ +function countZeros(buf) { + var o = 0, obit = 8; + while (o < buf.length) { + var mask = (1 << obit); + if ((buf[o] & mask) === mask) + break; + obit--; + if (obit < 0) { + o++; + obit = 8; + } + } + return (o*8 + (8 - obit) - 1); +} + +function bufferSplit(buf, chr) { + assert.buffer(buf); + assert.string(chr); + + var parts = []; + var lastPart = 0; + var matches = 0; + for (var i = 0; i < buf.length; ++i) { + if (buf[i] === chr.charCodeAt(matches)) + ++matches; + else if (buf[i] === chr.charCodeAt(0)) + matches = 1; + else + matches = 0; + + if (matches >= chr.length) { + var newPart = i + 1; + parts.push(buf.slice(lastPart, newPart - matches)); + lastPart = newPart; + matches = 0; + } + } + if (lastPart <= buf.length) + parts.push(buf.slice(lastPart, buf.length)); + + return (parts); +} + +function ecNormalize(buf, addZero) { + assert.buffer(buf); + if (buf[0] === 0x00 && buf[1] === 0x04) { + if (addZero) + return (buf); + return (buf.slice(1)); + } else if (buf[0] === 0x04) { + if (!addZero) + return (buf); + } else { + while (buf[0] === 0x00) + buf = buf.slice(1); + if (buf[0] === 0x02 || buf[0] === 0x03) + throw (new Error('Compressed elliptic curve points ' + + 'are not supported')); + if (buf[0] !== 0x04) + throw (new Error('Not a valid elliptic curve point')); + if (!addZero) + return (buf); + } + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x0; + buf.copy(b, 1); + return (b); +} + +function readBitString(der, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var buf = der.readString(tag, true); + assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + + 'not supported (0x' + buf[0].toString(16) + ')'); + return (buf.slice(1)); +} + +function writeBitString(der, buf, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + der.writeBuffer(b, tag); +} + +function mpNormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) + buf = buf.slice(1); + if ((buf[0] & 0x80) === 0x80) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function mpDenormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00) + buf = buf.slice(1); + return (buf); +} + +function zeroPadToLength(buf, len) { + assert.buffer(buf); + assert.number(len); + while (buf.length > len) { + assert.equal(buf[0], 0x00); + buf = buf.slice(1); + } + while (buf.length < len) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function bigintToMpBuf(bigint) { + var buf = Buffer.from(bigint.toByteArray()); + buf = mpNormalize(buf); + return (buf); +} + +function calculateDSAPublic(g, p, x) { + assert.buffer(g); + assert.buffer(p); + assert.buffer(x); + try { + var bigInt = __webpack_require__(81).BigInteger; + } catch (e) { + throw (new Error('To load a PKCS#8 format DSA private key, ' + + 'the node jsbn library is required.')); + } + g = new bigInt(g); + p = new bigInt(p); + x = new bigInt(x); + var y = g.modPow(x, p); + var ybuf = bigintToMpBuf(y); + return (ybuf); +} + +function calculateED25519Public(k) { + assert.buffer(k); + + if (nacl === undefined) + nacl = __webpack_require__(76); + + var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function calculateX25519Public(k) { + assert.buffer(k); + + if (nacl === undefined) + nacl = __webpack_require__(76); + + var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function addRSAMissing(key) { + assert.object(key); + assertCompatible(key, PrivateKey, [1, 1]); + try { + var bigInt = __webpack_require__(81).BigInteger; + } catch (e) { + throw (new Error('To write a PEM private key from ' + + 'this source, the node jsbn lib is required.')); + } + + var d = new bigInt(key.part.d.data); + var buf; + + if (!key.part.dmodp) { + var p = new bigInt(key.part.p.data); + var dmodp = d.mod(p.subtract(1)); + + buf = bigintToMpBuf(dmodp); + key.part.dmodp = {name: 'dmodp', data: buf}; + key.parts.push(key.part.dmodp); + } + if (!key.part.dmodq) { + var q = new bigInt(key.part.q.data); + var dmodq = d.mod(q.subtract(1)); + + buf = bigintToMpBuf(dmodq); + key.part.dmodq = {name: 'dmodq', data: buf}; + key.parts.push(key.part.dmodq); + } +} + +function publicFromPrivateECDSA(curveName, priv) { + assert.string(curveName, 'curveName'); + assert.buffer(priv); + if (ec === undefined) + ec = __webpack_require__(139); + if (jsbn === undefined) + jsbn = __webpack_require__(81).BigInteger; + var params = algs.curves[curveName]; + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + var d = new jsbn(mpNormalize(priv)); + var pub = G.multiply(d); + pub = Buffer.from(curve.encodePointHex(pub), 'hex'); + + var parts = []; + parts.push({name: 'curve', data: Buffer.from(curveName)}); + parts.push({name: 'Q', data: pub}); + + var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); + return (key); +} + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} + + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2017 Joyent, Inc. + +module.exports = Key; + +var assert = __webpack_require__(16); +var algs = __webpack_require__(32); +var crypto = __webpack_require__(11); +var Fingerprint = __webpack_require__(156); +var Signature = __webpack_require__(75); +var DiffieHellman = __webpack_require__(325).DiffieHellman; +var errs = __webpack_require__(74); +var utils = __webpack_require__(26); +var PrivateKey = __webpack_require__(33); +var edCompat; + +try { + edCompat = __webpack_require__(454); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; + +var formats = {}; +formats['auto'] = __webpack_require__(455); +formats['pem'] = __webpack_require__(86); +formats['pkcs1'] = __webpack_require__(327); +formats['pkcs8'] = __webpack_require__(157); +formats['rfc4253'] = __webpack_require__(103); +formats['ssh'] = __webpack_require__(456); +formats['ssh-private'] = __webpack_require__(192); +formats['openssh'] = formats['ssh-private']; +formats['dnssec'] = __webpack_require__(326); + +function Key(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + assert.optionalString(opts.comment, 'options.comment'); + + var algInfo = algs.info[opts.type]; + if (typeof (algInfo) !== 'object') + throw (new InvalidAlgorithmError(opts.type)); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.parts = opts.parts; + this.part = partLookup; + this.comment = undefined; + this.source = opts.source; + + /* for speeding up hashing/fingerprint operations */ + this._rfc4253Cache = opts._rfc4253Cache; + this._hashCache = {}; + + var sz; + this.curve = undefined; + if (this.type === 'ecdsa') { + var curve = this.part.curve.data.toString(); + this.curve = curve; + sz = algs.curves[curve].size; + } else if (this.type === 'ed25519' || this.type === 'curve25519') { + sz = 256; + this.curve = 'curve25519'; + } else { + var szPart = this.part[algInfo.sizePart]; + sz = szPart.data.length; + sz = sz * 8 - utils.countZeros(szPart.data); + } + this.size = sz; +} + +Key.formats = formats; + +Key.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'ssh'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + if (format === 'rfc4253') { + if (this._rfc4253Cache === undefined) + this._rfc4253Cache = formats['rfc4253'].write(this); + return (this._rfc4253Cache); + } + + return (formats[format].write(this, options)); +}; + +Key.prototype.toString = function (format, options) { + return (this.toBuffer(format, options).toString()); +}; + +Key.prototype.hash = function (algo) { + assert.string(algo, 'algorithm'); + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + if (this._hashCache[algo]) + return (this._hashCache[algo]); + var hash = crypto.createHash(algo). + update(this.toBuffer('rfc4253')).digest(); + this._hashCache[algo] = hash; + return (hash); +}; + +Key.prototype.fingerprint = function (algo) { + if (algo === undefined) + algo = 'sha256'; + assert.string(algo, 'algorithm'); + var opts = { + type: 'key', + hash: this.hash(algo), + algorithm: algo + }; + return (new Fingerprint(opts)); +}; + +Key.prototype.defaultHashAlgorithm = function () { + var hashAlgo = 'sha1'; + if (this.type === 'rsa') + hashAlgo = 'sha256'; + if (this.type === 'dsa' && this.size > 1024) + hashAlgo = 'sha256'; + if (this.type === 'ed25519') + hashAlgo = 'sha512'; + if (this.type === 'ecdsa') { + if (this.size <= 256) + hashAlgo = 'sha256'; + else if (this.size <= 384) + hashAlgo = 'sha384'; + else + hashAlgo = 'sha512'; + } + return (hashAlgo); +}; + +Key.prototype.createVerify = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Verifier(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldVerify = v.verify.bind(v); + var key = this.toBuffer('pkcs8'); + var curve = this.curve; + var self = this; + v.verify = function (signature, fmt) { + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== self.type) + return (false); + if (signature.hashAlgorithm && + signature.hashAlgorithm !== hashAlgo) + return (false); + if (signature.curve && self.type === 'ecdsa' && + signature.curve !== curve) + return (false); + return (oldVerify(key, signature.toBuffer('asn1'))); + + } else if (typeof (signature) === 'string' || + Buffer.isBuffer(signature)) { + return (oldVerify(key, signature, fmt)); + + /* + * Avoid doing this on valid arguments, walking the prototype + * chain can be quite slow. + */ + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + + } else { + throw (new TypeError('signature must be a string, ' + + 'Buffer, or Signature object')); + } + }; + return (v); +}; + +Key.prototype.createDiffieHellman = function () { + if (this.type === 'rsa') + throw (new Error('RSA keys do not support Diffie-Hellman')); + + return (new DiffieHellman(this)); +}; +Key.prototype.createDH = Key.prototype.createDiffieHellman; + +Key.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + if (k instanceof PrivateKey) + k = k.toPublic(); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +Key.isKey = function (obj, ver) { + return (utils.isCompatible(obj, Key, ver)); +}; + +/* + * API versions for Key: + * [1,0] -- initial ver, may take Signature for createVerify or may not + * [1,1] -- added pkcs1, pkcs8 formats + * [1,2] -- added auto, ssh-private, openssh formats + * [1,3] -- added defaultHashAlgorithm + * [1,4] -- added ed support, createDH + * [1,5] -- first explicitly tagged version + * [1,6] -- changed ed25519 part names + */ +Key.prototype._sshpkApiVersion = [1, 6]; + +Key._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + assert.func(obj.fingerprint); + if (obj.createDH) + return ([1, 4]); + if (obj.defaultHashAlgorithm) + return ([1, 3]); + if (obj.formats['auto']) + return ([1, 2]); + if (obj.formats['pkcs1']) + return ([1, 1]); + return ([1, 0]); +}; + + +/***/ }), +/* 28 */ +/***/ (function(module, exports) { + +module.exports = require("assert"); + +/***/ }), +/* 29 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = nullify; +function nullify(obj = {}) { + if (Array.isArray(obj)) { + for (var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const item = _ref; + + nullify(item); + } + } else if (obj !== null && typeof obj === 'object' || typeof obj === 'function') { + Object.setPrototypeOf(obj, null); + + // for..in can only be applied to 'object', not 'function' + if (typeof obj === 'object') { + for (const key in obj) { + nullify(obj[key]); + } + } + } + + return obj; +} + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const escapeStringRegexp = __webpack_require__(388); +const ansiStyles = __webpack_require__(506); +const stdoutColor = __webpack_require__(598).stdout; + +const template = __webpack_require__(599); + +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); + +const styles = Object.create(null); + +function applyOptions(obj, options) { + options = options || {}; + + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} + +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + + chalk.template.constructor = Chalk; + + return chalk.template; + } + + applyOptions(this, options); +} + +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} + +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; + +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, styles); + +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + + builder._styles = _styles; + builder._empty = _empty; + + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; +} + +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; + } + + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; + + return str; +} + +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript + + +/***/ }), +/* 31 */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.5.7' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2015 Joyent, Inc. + +var Buffer = __webpack_require__(15).Buffer; + +var algInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y'], + sizePart: 'p' + }, + 'rsa': { + parts: ['e', 'n'], + sizePart: 'n' + }, + 'ecdsa': { + parts: ['curve', 'Q'], + sizePart: 'Q' + }, + 'ed25519': { + parts: ['A'], + sizePart: 'A' + } +}; +algInfo['curve25519'] = algInfo['ed25519']; + +var algPrivInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y', 'x'] + }, + 'rsa': { + parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] + }, + 'ecdsa': { + parts: ['curve', 'Q', 'd'] + }, + 'ed25519': { + parts: ['A', 'k'] + } +}; +algPrivInfo['curve25519'] = algPrivInfo['ed25519']; + +var hashAlgs = { + 'md5': true, + 'sha1': true, + 'sha256': true, + 'sha384': true, + 'sha512': true +}; + +/* + * Taken from + * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf + */ +var curves = { + 'nistp256': { + size: 256, + pkcs8oid: '1.2.840.10045.3.1.7', + p: Buffer.from(('00' + + 'ffffffff 00000001 00000000 00000000' + + '00000000 ffffffff ffffffff ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF 00000001 00000000 00000000' + + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + + '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'c49d3608 86e70493 6a6678e1 139d26b7' + + '819f7e90'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff 00000000 ffffffff ffffffff' + + 'bce6faad a7179e84 f3b9cac2 fc632551'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + + '77037d81 2deb33a0 f4a13945 d898c296' + + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + + '2bce3357 6b315ece cbb64068 37bf51f5'). + replace(/ /g, ''), 'hex') + }, + 'nistp384': { + size: 384, + pkcs8oid: '1.3.132.0.34', + p: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffe' + + 'ffffffff 00000000 00000000 ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + + 'FFFFFFFF 00000000 00000000 FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + 'b3312fa7 e23ee7e4 988e056b e3f82d19' + + '181d9c6e fe814112 0314088f 5013875a' + + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'a335926a a319a27a 1d00896a 6773a482' + + '7acdac73'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff c7634d81 f4372ddf' + + '581a0db2 48b0a77a ecec196a ccc52973'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + + '6e1d3b62 8ba79b98 59f741e0 82542a38' + + '5502f25d bf55296c 3a545e38 72760ab7' + + '3617de4a 96262c6f 5d9e98bf 9292dc29' + + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). + replace(/ /g, ''), 'hex') + }, + 'nistp521': { + size: 521, + pkcs8oid: '1.3.132.0.35', + p: Buffer.from(( + '01ffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffff').replace(/ /g, ''), 'hex'), + a: Buffer.from(('01FF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(('51' + + '953eb961 8e1c9a1f 929a21a0 b68540ee' + + 'a2da725b 99b315f3 b8b48991 8ef109e1' + + '56193951 ec7e937b 1652c0bd 3bb1bf07' + + '3573df88 3d2c34f1 ef451fd4 6b503f00'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'd09e8800 291cb853 96cc6717 393284aa' + + 'a0da64ba').replace(/ /g, ''), 'hex'), + n: Buffer.from(('01ff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffa' + + '51868783 bf2f966b 7fcc0148 f709a5d0' + + '3bb5c9b8 899c47ae bb6fb71e 91386409'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + + '9c648139 053fb521 f828af60 6b4d3dba' + + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + + '3348b3c1 856a429b f97e7e31 c2e5bd66' + + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + + '98f54449 579b4468 17afbd17 273e662c' + + '97ee7299 5ef42640 c550b901 3fad0761' + + '353c7086 a272c240 88be9476 9fd16650'). + replace(/ /g, ''), 'hex') + } +}; + +module.exports = { + info: algInfo, + privInfo: algPrivInfo, + hashAlgs: hashAlgs, + curves: curves +}; + + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2017 Joyent, Inc. + +module.exports = PrivateKey; + +var assert = __webpack_require__(16); +var Buffer = __webpack_require__(15).Buffer; +var algs = __webpack_require__(32); +var crypto = __webpack_require__(11); +var Fingerprint = __webpack_require__(156); +var Signature = __webpack_require__(75); +var errs = __webpack_require__(74); +var util = __webpack_require__(3); +var utils = __webpack_require__(26); +var dhe = __webpack_require__(325); +var generateECDSA = dhe.generateECDSA; +var generateED25519 = dhe.generateED25519; +var edCompat; +var nacl; + +try { + edCompat = __webpack_require__(454); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var Key = __webpack_require__(27); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; +var KeyEncryptedError = errs.KeyEncryptedError; + +var formats = {}; +formats['auto'] = __webpack_require__(455); +formats['pem'] = __webpack_require__(86); +formats['pkcs1'] = __webpack_require__(327); +formats['pkcs8'] = __webpack_require__(157); +formats['rfc4253'] = __webpack_require__(103); +formats['ssh-private'] = __webpack_require__(192); +formats['openssh'] = formats['ssh-private']; +formats['ssh'] = formats['ssh-private']; +formats['dnssec'] = __webpack_require__(326); + +function PrivateKey(opts) { + assert.object(opts, 'options'); + Key.call(this, opts); + + this._pubCache = undefined; +} +util.inherits(PrivateKey, Key); + +PrivateKey.formats = formats; + +PrivateKey.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'pkcs1'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +PrivateKey.prototype.hash = function (algo) { + return (this.toPublic().hash(algo)); +}; + +PrivateKey.prototype.toPublic = function () { + if (this._pubCache) + return (this._pubCache); + + var algInfo = algs.info[this.type]; + var pubParts = []; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = algInfo.parts[i]; + pubParts.push(this.part[p]); + } + + this._pubCache = new Key({ + type: this.type, + source: this, + parts: pubParts + }); + if (this.comment) + this._pubCache.comment = this.comment; + return (this._pubCache); +}; + +PrivateKey.prototype.derive = function (newType) { + assert.string(newType, 'type'); + var priv, pub, pair; + + if (this.type === 'ed25519' && newType === 'curve25519') { + if (nacl === undefined) + nacl = __webpack_require__(76); + + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'curve25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } else if (this.type === 'curve25519' && newType === 'ed25519') { + if (nacl === undefined) + nacl = __webpack_require__(76); + + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'ed25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } + throw (new Error('Key derivation not supported from ' + this.type + + ' to ' + newType)); +}; + +PrivateKey.prototype.createVerify = function (hashAlgo) { + return (this.toPublic().createVerify(hashAlgo)); +}; + +PrivateKey.prototype.createSign = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Signer(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldSign = v.sign.bind(v); + var key = this.toBuffer('pkcs1'); + var type = this.type; + var curve = this.curve; + v.sign = function () { + var sig = oldSign(key); + if (typeof (sig) === 'string') + sig = Buffer.from(sig, 'binary'); + sig = Signature.parse(sig, type, 'asn1'); + sig.hashAlgorithm = hashAlgo; + sig.curve = curve; + return (sig); + }; + return (v); +}; + +PrivateKey.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + assert.ok(k instanceof PrivateKey, 'key is not a private key'); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +PrivateKey.isPrivateKey = function (obj, ver) { + return (utils.isCompatible(obj, PrivateKey, ver)); +}; + +PrivateKey.generate = function (type, options) { + if (options === undefined) + options = {}; + assert.object(options, 'options'); + + switch (type) { + case 'ecdsa': + if (options.curve === undefined) + options.curve = 'nistp256'; + assert.string(options.curve, 'options.curve'); + return (generateECDSA(options.curve)); + case 'ed25519': + return (generateED25519()); + default: + throw (new Error('Key generation not supported with key ' + + 'type "' + type + '"')); + } +}; + +/* + * API versions for PrivateKey: + * [1,0] -- initial ver + * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats + * [1,2] -- added defaultHashAlgorithm + * [1,3] -- added derive, ed, createDH + * [1,4] -- first tagged version + * [1,5] -- changed ed25519 part names and format + */ +PrivateKey.prototype._sshpkApiVersion = [1, 5]; + +PrivateKey._oldVersionDetect = function (obj) { + assert.func(obj.toPublic); + assert.func(obj.createSign); + if (obj.derive) + return ([1, 3]); + if (obj.defaultHashAlgorithm) + return ([1, 2]); + if (obj.formats['auto']) + return ([1, 1]); + return ([1, 0]); +}; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.wrapLifecycle = exports.run = exports.install = exports.Install = undefined; + +var _extends2; + +function _load_extends() { + return _extends2 = _interopRequireDefault(__webpack_require__(21)); +} + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +let install = exports.install = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, lockfile) { + yield wrapLifecycle(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const install = new Install(flags, config, reporter, lockfile); + yield install.init(); + })); + }); + + return function install(_x7, _x8, _x9, _x10) { + return _ref29.apply(this, arguments); + }; +})(); + +let run = exports.run = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) { + let lockfile; + let error = 'installCommandRenamed'; + if (flags.lockfile === false) { + lockfile = new (_lockfile || _load_lockfile()).default(); + } else { + lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter); + } + + if (args.length) { + const exampleArgs = args.slice(); + + if (flags.saveDev) { + exampleArgs.push('--dev'); + } + if (flags.savePeer) { + exampleArgs.push('--peer'); + } + if (flags.saveOptional) { + exampleArgs.push('--optional'); + } + if (flags.saveExact) { + exampleArgs.push('--exact'); + } + if (flags.saveTilde) { + exampleArgs.push('--tilde'); + } + let command = 'add'; + if (flags.global) { + error = 'globalFlagRemoved'; + command = 'global add'; + } + throw new (_errors || _load_errors()).MessageError(reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`)); + } + + yield install(config, reporter, flags, lockfile); + }); + + return function run(_x11, _x12, _x13, _x14) { + return _ref31.apply(this, arguments); + }; +})(); + +let wrapLifecycle = exports.wrapLifecycle = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags, factory) { + yield config.executeLifecycleScript('preinstall'); + + yield factory(); + + // npm behaviour, seems kinda funky but yay compatibility + yield config.executeLifecycleScript('install'); + yield config.executeLifecycleScript('postinstall'); + + if (!config.production) { + if (!config.disablePrepublish) { + yield config.executeLifecycleScript('prepublish'); + } + yield config.executeLifecycleScript('prepare'); + } + }); + + return function wrapLifecycle(_x15, _x16, _x17) { + return _ref32.apply(this, arguments); + }; +})(); + +exports.hasWrapper = hasWrapper; +exports.setFlags = setFlags; + +var _objectPath; + +function _load_objectPath() { + return _objectPath = _interopRequireDefault(__webpack_require__(304)); +} + +var _hooks; + +function _load_hooks() { + return _hooks = __webpack_require__(374); +} + +var _index; + +function _load_index() { + return _index = _interopRequireDefault(__webpack_require__(220)); +} + +var _errors; + +function _load_errors() { + return _errors = __webpack_require__(6); +} + +var _integrityChecker; + +function _load_integrityChecker() { + return _integrityChecker = _interopRequireDefault(__webpack_require__(208)); +} + +var _lockfile; + +function _load_lockfile() { + return _lockfile = _interopRequireDefault(__webpack_require__(19)); +} + +var _lockfile2; + +function _load_lockfile2() { + return _lockfile2 = __webpack_require__(19); +} + +var _packageFetcher; + +function _load_packageFetcher() { + return _packageFetcher = _interopRequireWildcard(__webpack_require__(210)); +} + +var _packageInstallScripts; + +function _load_packageInstallScripts() { + return _packageInstallScripts = _interopRequireDefault(__webpack_require__(557)); +} + +var _packageCompatibility; + +function _load_packageCompatibility() { + return _packageCompatibility = _interopRequireWildcard(__webpack_require__(209)); +} + +var _packageResolver; + +function _load_packageResolver() { + return _packageResolver = _interopRequireDefault(__webpack_require__(366)); +} + +var _packageLinker; + +function _load_packageLinker() { + return _packageLinker = _interopRequireDefault(__webpack_require__(211)); +} + +var _index2; + +function _load_index2() { + return _index2 = __webpack_require__(57); +} + +var _index3; + +function _load_index3() { + return _index3 = __webpack_require__(78); +} + +var _autoclean; + +function _load_autoclean() { + return _autoclean = __webpack_require__(354); +} + +var _constants; + +function _load_constants() { + return _constants = _interopRequireWildcard(__webpack_require__(8)); +} + +var _normalizePattern; + +function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(37); +} + +var _fs; + +function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(4)); +} + +var _map; + +function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(29)); +} + +var _yarnVersion; + +function _load_yarnVersion() { + return _yarnVersion = __webpack_require__(120); +} + +var _generatePnpMap; + +function _load_generatePnpMap() { + return _generatePnpMap = __webpack_require__(579); +} + +var _workspaceLayout; + +function _load_workspaceLayout() { + return _workspaceLayout = _interopRequireDefault(__webpack_require__(90)); +} + +var _resolutionMap; + +function _load_resolutionMap() { + return _resolutionMap = _interopRequireDefault(__webpack_require__(214)); +} + +var _guessName; + +function _load_guessName() { + return _guessName = _interopRequireDefault(__webpack_require__(169)); +} + +var _audit; + +function _load_audit() { + return _audit = _interopRequireDefault(__webpack_require__(353)); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const deepEqual = __webpack_require__(631); + +const emoji = __webpack_require__(302); +const invariant = __webpack_require__(9); +const path = __webpack_require__(0); +const semver = __webpack_require__(22); +const uuid = __webpack_require__(119); +const ssri = __webpack_require__(65); + +const ONE_DAY = 1000 * 60 * 60 * 24; + +/** + * Try and detect the installation method for Yarn and provide a command to update it with. + */ + +function getUpdateCommand(installationMethod) { + if (installationMethod === 'tar') { + return `curl --compressed -o- -L ${(_constants || _load_constants()).YARN_INSTALLER_SH} | bash`; + } + + if (installationMethod === 'homebrew') { + return 'brew upgrade yarn'; + } + + if (installationMethod === 'deb') { + return 'sudo apt-get update && sudo apt-get install yarn'; + } + + if (installationMethod === 'rpm') { + return 'sudo yum install yarn'; + } + + if (installationMethod === 'npm') { + return 'npm install --global yarn'; + } + + if (installationMethod === 'chocolatey') { + return 'choco upgrade yarn'; + } + + if (installationMethod === 'apk') { + return 'apk update && apk add -u yarn'; + } + + if (installationMethod === 'portage') { + return 'sudo emerge --sync && sudo emerge -au sys-apps/yarn'; + } + + return null; +} + +function getUpdateInstaller(installationMethod) { + // Windows + if (installationMethod === 'msi') { + return (_constants || _load_constants()).YARN_INSTALLER_MSI; + } + + return null; +} + +function normalizeFlags(config, rawFlags) { + const flags = { + // install + har: !!rawFlags.har, + ignorePlatform: !!rawFlags.ignorePlatform, + ignoreEngines: !!rawFlags.ignoreEngines, + ignoreScripts: !!rawFlags.ignoreScripts, + ignoreOptional: !!rawFlags.ignoreOptional, + force: !!rawFlags.force, + flat: !!rawFlags.flat, + lockfile: rawFlags.lockfile !== false, + pureLockfile: !!rawFlags.pureLockfile, + updateChecksums: !!rawFlags.updateChecksums, + skipIntegrityCheck: !!rawFlags.skipIntegrityCheck, + frozenLockfile: !!rawFlags.frozenLockfile, + linkDuplicates: !!rawFlags.linkDuplicates, + checkFiles: !!rawFlags.checkFiles, + audit: !!rawFlags.audit, + + // add + peer: !!rawFlags.peer, + dev: !!rawFlags.dev, + optional: !!rawFlags.optional, + exact: !!rawFlags.exact, + tilde: !!rawFlags.tilde, + ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck, + + // outdated, update-interactive + includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps, + + // add, remove, update + workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false + }; + + if (config.getOption('ignore-scripts')) { + flags.ignoreScripts = true; + } + + if (config.getOption('ignore-platform')) { + flags.ignorePlatform = true; + } + + if (config.getOption('ignore-engines')) { + flags.ignoreEngines = true; + } + + if (config.getOption('ignore-optional')) { + flags.ignoreOptional = true; + } + + if (config.getOption('force')) { + flags.force = true; + } + + return flags; +} + +class Install { + constructor(flags, config, reporter, lockfile) { + this.rootManifestRegistries = []; + this.rootPatternsToOrigin = (0, (_map || _load_map()).default)(); + this.lockfile = lockfile; + this.reporter = reporter; + this.config = config; + this.flags = normalizeFlags(config, flags); + this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode + this.resolutionMap = new (_resolutionMap || _load_resolutionMap()).default(config); // Selective resolutions for nested dependencies + this.resolver = new (_packageResolver || _load_packageResolver()).default(config, lockfile, this.resolutionMap); + this.integrityChecker = new (_integrityChecker || _load_integrityChecker()).default(config); + this.linker = new (_packageLinker || _load_packageLinker()).default(config, this.resolver); + this.scripts = new (_packageInstallScripts || _load_packageInstallScripts()).default(config, this.resolver, this.flags.force); + } + + /** + * Create a list of dependency requests from the current directories manifests. + */ + + fetchRequestFromCwd(excludePatterns = [], ignoreUnusedPatterns = false) { + var _this = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const patterns = []; + const deps = []; + let resolutionDeps = []; + const manifest = {}; + + const ignorePatterns = []; + const usedPatterns = []; + let workspaceLayout; + + // some commands should always run in the context of the entire workspace + const cwd = _this.flags.includeWorkspaceDeps || _this.flags.workspaceRootIsCwd ? _this.config.lockfileFolder : _this.config.cwd; + + // non-workspaces are always root, otherwise check for workspace root + const cwdIsRoot = !_this.config.workspaceRootFolder || _this.config.lockfileFolder === cwd; + + // exclude package names that are in install args + const excludeNames = []; + for (var _iterator = excludePatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const pattern = _ref; + + if ((0, (_index3 || _load_index3()).getExoticResolver)(pattern)) { + excludeNames.push((0, (_guessName || _load_guessName()).default)(pattern)); + } else { + // extract the name + const parts = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern); + excludeNames.push(parts.name); + } + } + + const stripExcluded = function stripExcluded(manifest) { + for (var _iterator2 = excludeNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + const exclude = _ref2; + + if (manifest.dependencies && manifest.dependencies[exclude]) { + delete manifest.dependencies[exclude]; + } + if (manifest.devDependencies && manifest.devDependencies[exclude]) { + delete manifest.devDependencies[exclude]; + } + if (manifest.optionalDependencies && manifest.optionalDependencies[exclude]) { + delete manifest.optionalDependencies[exclude]; + } + } + }; + + for (var _iterator3 = Object.keys((_index2 || _load_index2()).registries), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + const registry = _ref3; + + const filename = (_index2 || _load_index2()).registries[registry].filename; + + const loc = path.join(cwd, filename); + if (!(yield (_fs || _load_fs()).exists(loc))) { + continue; + } + + _this.rootManifestRegistries.push(registry); + + const projectManifestJson = yield _this.config.readJson(loc); + yield (0, (_index || _load_index()).default)(projectManifestJson, cwd, _this.config, cwdIsRoot); + + Object.assign(_this.resolutions, projectManifestJson.resolutions); + Object.assign(manifest, projectManifestJson); + + _this.resolutionMap.init(_this.resolutions); + for (var _iterator4 = Object.keys(_this.resolutionMap.resolutionsByPackage), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + const packageName = _ref4; + + const optional = (_objectPath || _load_objectPath()).default.has(manifest.optionalDependencies, packageName) && _this.flags.ignoreOptional; + for (var _iterator8 = _this.resolutionMap.resolutionsByPackage[packageName], _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref9; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref9 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref9 = _i8.value; + } + + const _ref8 = _ref9; + const pattern = _ref8.pattern; + + resolutionDeps = [...resolutionDeps, { registry, pattern, optional, hint: 'resolution' }]; + } + } + + const pushDeps = function pushDeps(depType, manifest, { hint, optional }, isUsed) { + if (ignoreUnusedPatterns && !isUsed) { + return; + } + // We only take unused dependencies into consideration to get deterministic hoisting. + // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely + // leave these out. + if (_this.flags.flat && !isUsed) { + return; + } + const depMap = manifest[depType]; + for (const name in depMap) { + if (excludeNames.indexOf(name) >= 0) { + continue; + } + + let pattern = name; + if (!_this.lockfile.getLocked(pattern)) { + // when we use --save we save the dependency to the lockfile with just the name rather than the + // version combo + pattern += '@' + depMap[name]; + } + + // normalization made sure packages are mentioned only once + if (isUsed) { + usedPatterns.push(pattern); + } else { + ignorePatterns.push(pattern); + } + + _this.rootPatternsToOrigin[pattern] = depType; + patterns.push(pattern); + deps.push({ pattern, registry, hint, optional, workspaceName: manifest.name, workspaceLoc: manifest._loc }); + } + }; + + if (cwdIsRoot) { + pushDeps('dependencies', projectManifestJson, { hint: null, optional: false }, true); + pushDeps('devDependencies', projectManifestJson, { hint: 'dev', optional: false }, !_this.config.production); + pushDeps('optionalDependencies', projectManifestJson, { hint: 'optional', optional: true }, true); + } + + if (_this.config.workspaceRootFolder) { + const workspaceLoc = cwdIsRoot ? loc : path.join(_this.config.lockfileFolder, filename); + const workspacesRoot = path.dirname(workspaceLoc); + + let workspaceManifestJson = projectManifestJson; + if (!cwdIsRoot) { + // the manifest we read before was a child workspace, so get the root + workspaceManifestJson = yield _this.config.readJson(workspaceLoc); + yield (0, (_index || _load_index()).default)(workspaceManifestJson, workspacesRoot, _this.config, true); + } + + const workspaces = yield _this.config.resolveWorkspaces(workspacesRoot, workspaceManifestJson); + workspaceLayout = new (_workspaceLayout || _load_workspaceLayout()).default(workspaces, _this.config); + + // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine + const workspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.dependencies); + for (var _iterator5 = Object.keys(workspaces), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; + } + + const workspaceName = _ref5; + + const workspaceManifest = workspaces[workspaceName].manifest; + workspaceDependencies[workspaceName] = workspaceManifest.version; + + // include dependencies from all workspaces + if (_this.flags.includeWorkspaceDeps) { + pushDeps('dependencies', workspaceManifest, { hint: null, optional: false }, true); + pushDeps('devDependencies', workspaceManifest, { hint: 'dev', optional: false }, !_this.config.production); + pushDeps('optionalDependencies', workspaceManifest, { hint: 'optional', optional: true }, true); + } + } + const virtualDependencyManifest = { + _uid: '', + name: `workspace-aggregator-${uuid.v4()}`, + version: '1.0.0', + _registry: 'npm', + _loc: workspacesRoot, + dependencies: workspaceDependencies, + devDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.devDependencies), + optionalDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.optionalDependencies), + private: workspaceManifestJson.private, + workspaces: workspaceManifestJson.workspaces + }; + workspaceLayout.virtualManifestName = virtualDependencyManifest.name; + const virtualDep = {}; + virtualDep[virtualDependencyManifest.name] = virtualDependencyManifest.version; + workspaces[virtualDependencyManifest.name] = { loc: workspacesRoot, manifest: virtualDependencyManifest }; + + // ensure dependencies that should be excluded are stripped from the correct manifest + stripExcluded(cwdIsRoot ? virtualDependencyManifest : workspaces[projectManifestJson.name].manifest); + + pushDeps('workspaces', { workspaces: virtualDep }, { hint: 'workspaces', optional: false }, true); + + const implicitWorkspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceDependencies); + + for (var _iterator6 = (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; + } + + const type = _ref6; + + for (var _iterator7 = Object.keys(projectManifestJson[type] || {}), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref7 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref7 = _i7.value; + } + + const dependencyName = _ref7; + + delete implicitWorkspaceDependencies[dependencyName]; + } + } + + pushDeps('dependencies', { dependencies: implicitWorkspaceDependencies }, { hint: 'workspaces', optional: false }, true); + } + + break; + } + + // inherit root flat flag + if (manifest.flat) { + _this.flags.flat = true; + } + + return { + requests: [...resolutionDeps, ...deps], + patterns, + manifest, + usedPatterns, + ignorePatterns, + workspaceLayout + }; + })(); + } + + /** + * TODO description + */ + + prepareRequests(requests) { + return requests; + } + + preparePatterns(patterns) { + return patterns; + } + preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) { + return patterns; + } + + prepareManifests() { + var _this2 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const manifests = yield _this2.config.getRootManifests(); + return manifests; + })(); + } + + bailout(patterns, workspaceLayout) { + var _this3 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // We don't want to skip the audit - it could yield important errors + if (_this3.flags.audit) { + return false; + } + // PNP is so fast that the integrity check isn't pertinent + if (_this3.config.plugnplayEnabled) { + return false; + } + if (_this3.flags.skipIntegrityCheck || _this3.flags.force) { + return false; + } + const lockfileCache = _this3.lockfile.cache; + if (!lockfileCache) { + return false; + } + const lockfileClean = _this3.lockfile.parseResultType === 'success'; + const match = yield _this3.integrityChecker.check(patterns, lockfileCache, _this3.flags, workspaceLayout); + if (_this3.flags.frozenLockfile && (!lockfileClean || match.missingPatterns.length > 0)) { + throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('frozenLockfileError')); + } + + const haveLockfile = yield (_fs || _load_fs()).exists(path.join(_this3.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME)); + + const lockfileIntegrityPresent = !_this3.lockfile.hasEntriesExistWithoutIntegrity(); + const integrityBailout = lockfileIntegrityPresent || !_this3.config.autoAddIntegrity; + + if (match.integrityMatches && haveLockfile && lockfileClean && integrityBailout) { + _this3.reporter.success(_this3.reporter.lang('upToDate')); + return true; + } + + if (match.integrityFileMissing && haveLockfile) { + // Integrity file missing, force script installations + _this3.scripts.setForce(true); + return false; + } + + if (match.hardRefreshRequired) { + // e.g. node version doesn't match, force script installations + _this3.scripts.setForce(true); + return false; + } + + if (!patterns.length && !match.integrityFileMissing) { + _this3.reporter.success(_this3.reporter.lang('nothingToInstall')); + yield _this3.createEmptyManifestFolders(); + yield _this3.saveLockfileAndIntegrity(patterns, workspaceLayout); + return true; + } + + return false; + })(); + } + + /** + * Produce empty folders for all used root manifests. + */ + + createEmptyManifestFolders() { + var _this4 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + if (_this4.config.modulesFolder) { + // already created + return; + } + + for (var _iterator9 = _this4.rootManifestRegistries, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref10; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref10 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref10 = _i9.value; + } + + const registryName = _ref10; + const folder = _this4.config.registries[registryName].folder; + + yield (_fs || _load_fs()).mkdirp(path.join(_this4.config.lockfileFolder, folder)); + } + })(); + } + + /** + * TODO description + */ + + markIgnored(patterns) { + for (var _iterator10 = patterns, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref11; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref11 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref11 = _i10.value; + } + + const pattern = _ref11; + + const manifest = this.resolver.getStrictResolvedPattern(pattern); + const ref = manifest._reference; + invariant(ref, 'expected package reference'); + + // just mark the package as ignored. if the package is used by a required package, the hoister + // will take care of that. + ref.ignore = true; + } + } + + /** + * helper method that gets only recent manifests + * used by global.ls command + */ + getFlattenedDeps() { + var _this5 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + var _ref12 = yield _this5.fetchRequestFromCwd(); + + const depRequests = _ref12.requests, + rawPatterns = _ref12.patterns; + + + yield _this5.resolver.init(depRequests, {}); + + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this5.resolver.getManifests(), _this5.config); + _this5.resolver.updateManifests(manifests); + + return _this5.flatten(rawPatterns); + })(); + } + + /** + * TODO description + */ + + init() { + var _this6 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.checkUpdate(); + + // warn if we have a shrinkwrap + if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_SHRINKWRAP_FILENAME))) { + _this6.reporter.warn(_this6.reporter.lang('shrinkwrapWarning')); + } + + // warn if we have an npm lockfile + if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_LOCK_FILENAME))) { + _this6.reporter.warn(_this6.reporter.lang('npmLockfileWarning')); + } + + if (_this6.config.plugnplayEnabled) { + _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L1')); + _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L2')); + } + + let flattenedTopLevelPatterns = []; + const steps = []; + + var _ref13 = yield _this6.fetchRequestFromCwd(); + + const depRequests = _ref13.requests, + rawPatterns = _ref13.patterns, + ignorePatterns = _ref13.ignorePatterns, + workspaceLayout = _ref13.workspaceLayout, + manifest = _ref13.manifest; + + let topLevelPatterns = []; + + const artifacts = yield _this6.integrityChecker.getArtifacts(); + if (artifacts) { + _this6.linker.setArtifacts(artifacts); + _this6.scripts.setArtifacts(artifacts); + } + + if ((_packageCompatibility || _load_packageCompatibility()).shouldCheck(manifest, _this6.flags)) { + steps.push((() => { + var _ref14 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + _this6.reporter.step(curr, total, _this6.reporter.lang('checkingManifest'), emoji.get('mag')); + yield _this6.checkCompatibility(); + }); + + return function (_x, _x2) { + return _ref14.apply(this, arguments); + }; + })()); + } + + const audit = new (_audit || _load_audit()).default(_this6.config, _this6.reporter, { groups: (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES }); + let auditFoundProblems = false; + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('resolveStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.reporter.lang('resolvingPackages'), emoji.get('mag')); + yield _this6.resolver.init(_this6.prepareRequests(depRequests), { + isFlat: _this6.flags.flat, + isFrozen: _this6.flags.frozenLockfile, + workspaceLayout + }); + topLevelPatterns = _this6.preparePatterns(rawPatterns); + flattenedTopLevelPatterns = yield _this6.flatten(topLevelPatterns); + return { bailout: !_this6.flags.audit && (yield _this6.bailout(topLevelPatterns, workspaceLayout)) }; + })); + }); + + if (_this6.flags.audit) { + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('auditStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.reporter.lang('auditRunning'), emoji.get('mag')); + if (_this6.flags.offline) { + _this6.reporter.warn(_this6.reporter.lang('auditOffline')); + return { bailout: false }; + } + const preparedManifests = yield _this6.prepareManifests(); + // $FlowFixMe - Flow considers `m` in the map operation to be "mixed", so does not recognize `m.object` + const mergedManifest = Object.assign({}, ...Object.values(preparedManifests).map(function (m) { + return m.object; + })); + const auditVulnerabilityCounts = yield audit.performAudit(mergedManifest, _this6.lockfile, _this6.resolver, _this6.linker, topLevelPatterns); + auditFoundProblems = auditVulnerabilityCounts.info || auditVulnerabilityCounts.low || auditVulnerabilityCounts.moderate || auditVulnerabilityCounts.high || auditVulnerabilityCounts.critical; + return { bailout: yield _this6.bailout(topLevelPatterns, workspaceLayout) }; + })); + }); + } + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('fetchStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.markIgnored(ignorePatterns); + _this6.reporter.step(curr, total, _this6.reporter.lang('fetchingPackages'), emoji.get('truck')); + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this6.resolver.getManifests(), _this6.config); + _this6.resolver.updateManifests(manifests); + yield (_packageCompatibility || _load_packageCompatibility()).check(_this6.resolver.getManifests(), _this6.config, _this6.flags.ignoreEngines); + })); + }); + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('linkStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // remove integrity hash to make this operation atomic + yield _this6.integrityChecker.removeIntegrityFile(); + _this6.reporter.step(curr, total, _this6.reporter.lang('linkingDependencies'), emoji.get('link')); + flattenedTopLevelPatterns = _this6.preparePatternsForLinking(flattenedTopLevelPatterns, manifest, _this6.config.lockfileFolder === _this6.config.cwd); + yield _this6.linker.init(flattenedTopLevelPatterns, workspaceLayout, { + linkDuplicates: _this6.flags.linkDuplicates, + ignoreOptional: _this6.flags.ignoreOptional + }); + })); + }); + + if (_this6.config.plugnplayEnabled) { + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('pnpStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const pnpPath = `${_this6.config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`; + + const code = yield (0, (_generatePnpMap || _load_generatePnpMap()).generatePnpMap)(_this6.config, flattenedTopLevelPatterns, { + resolver: _this6.resolver, + reporter: _this6.reporter, + targetPath: pnpPath, + workspaceLayout + }); + + try { + const file = yield (_fs || _load_fs()).readFile(pnpPath); + if (file === code) { + return; + } + } catch (error) {} + + yield (_fs || _load_fs()).writeFile(pnpPath, code); + yield (_fs || _load_fs()).chmod(pnpPath, 0o755); + })); + }); + } + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('buildStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.flags.force ? _this6.reporter.lang('rebuildingPackages') : _this6.reporter.lang('buildingFreshPackages'), emoji.get('hammer')); + + if (_this6.config.ignoreScripts) { + _this6.reporter.warn(_this6.reporter.lang('ignoredScripts')); + } else { + yield _this6.scripts.init(flattenedTopLevelPatterns); + } + })); + }); + + if (_this6.flags.har) { + steps.push((() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + const formattedDate = new Date().toISOString().replace(/:/g, '-'); + const filename = `yarn-install_${formattedDate}.har`; + _this6.reporter.step(curr, total, _this6.reporter.lang('savingHar', filename), emoji.get('black_circle_for_record')); + yield _this6.config.requestManager.saveHar(filename); + }); + + return function (_x3, _x4) { + return _ref21.apply(this, arguments); + }; + })()); + } + + if (yield _this6.shouldClean()) { + steps.push((() => { + var _ref22 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + _this6.reporter.step(curr, total, _this6.reporter.lang('cleaningModules'), emoji.get('recycle')); + yield (0, (_autoclean || _load_autoclean()).clean)(_this6.config, _this6.reporter); + }); + + return function (_x5, _x6) { + return _ref22.apply(this, arguments); + }; + })()); + } + + let currentStep = 0; + for (var _iterator11 = steps, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref23; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref23 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref23 = _i11.value; + } + + const step = _ref23; + + const stepResult = yield step(++currentStep, steps.length); + if (stepResult && stepResult.bailout) { + if (_this6.flags.audit) { + audit.summary(); + } + if (auditFoundProblems) { + _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails')); + } + _this6.maybeOutputUpdate(); + return flattenedTopLevelPatterns; + } + } + + // fin! + if (_this6.flags.audit) { + audit.summary(); + } + if (auditFoundProblems) { + _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails')); + } + yield _this6.saveLockfileAndIntegrity(topLevelPatterns, workspaceLayout); + yield _this6.persistChanges(); + _this6.maybeOutputUpdate(); + _this6.config.requestManager.clearCache(); + return flattenedTopLevelPatterns; + })(); + } + + checkCompatibility() { + var _this7 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + var _ref24 = yield _this7.fetchRequestFromCwd(); + + const manifest = _ref24.manifest; + + yield (_packageCompatibility || _load_packageCompatibility()).checkOne(manifest, _this7.config, _this7.flags.ignoreEngines); + })(); + } + + persistChanges() { + var _this8 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // get all the different registry manifests in this folder + const manifests = yield _this8.config.getRootManifests(); + + if (yield _this8.applyChanges(manifests)) { + yield _this8.config.saveRootManifests(manifests); + } + })(); + } + + applyChanges(manifests) { + let hasChanged = false; + + if (this.config.plugnplayPersist) { + const object = manifests.npm.object; + + + if (typeof object.installConfig !== 'object') { + object.installConfig = {}; + } + + if (this.config.plugnplayEnabled && object.installConfig.pnp !== true) { + object.installConfig.pnp = true; + hasChanged = true; + } else if (!this.config.plugnplayEnabled && typeof object.installConfig.pnp !== 'undefined') { + delete object.installConfig.pnp; + hasChanged = true; + } + + if (Object.keys(object.installConfig).length === 0) { + delete object.installConfig; + } + } + + return Promise.resolve(hasChanged); + } + + /** + * Check if we should run the cleaning step. + */ + + shouldClean() { + return (_fs || _load_fs()).exists(path.join(this.config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME)); + } + + /** + * TODO + */ + + flatten(patterns) { + var _this9 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + if (!_this9.flags.flat) { + return patterns; + } + + const flattenedPatterns = []; + + for (var _iterator12 = _this9.resolver.getAllDependencyNamesByLevelOrder(patterns), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref25; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref25 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref25 = _i12.value; + } + + const name = _ref25; + + const infos = _this9.resolver.getAllInfoForPackageName(name).filter(function (manifest) { + const ref = manifest._reference; + invariant(ref, 'expected package reference'); + return !ref.ignore; + }); + + if (infos.length === 0) { + continue; + } + + if (infos.length === 1) { + // single version of this package + // take out a single pattern as multiple patterns may have resolved to this package + flattenedPatterns.push(_this9.resolver.patternsByPackage[name][0]); + continue; + } + + const options = infos.map(function (info) { + const ref = info._reference; + invariant(ref, 'expected reference'); + return { + // TODO `and is required by {PARENT}`, + name: _this9.reporter.lang('manualVersionResolutionOption', ref.patterns.join(', '), info.version), + + value: info.version + }; + }); + const versions = infos.map(function (info) { + return info.version; + }); + let version; + + const resolutionVersion = _this9.resolutions[name]; + if (resolutionVersion && versions.indexOf(resolutionVersion) >= 0) { + // use json `resolution` version + version = resolutionVersion; + } else { + version = yield _this9.reporter.select(_this9.reporter.lang('manualVersionResolution', name), _this9.reporter.lang('answer'), options); + _this9.resolutions[name] = version; + } + + flattenedPatterns.push(_this9.resolver.collapseAllVersionsOfPackage(name, version)); + } + + // save resolutions to their appropriate root manifest + if (Object.keys(_this9.resolutions).length) { + const manifests = yield _this9.config.getRootManifests(); + + for (const name in _this9.resolutions) { + const version = _this9.resolutions[name]; + + const patterns = _this9.resolver.patternsByPackage[name]; + if (!patterns) { + continue; + } + + let manifest; + for (var _iterator13 = patterns, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref26; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref26 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref26 = _i13.value; + } + + const pattern = _ref26; + + manifest = _this9.resolver.getResolvedPattern(pattern); + if (manifest) { + break; + } + } + invariant(manifest, 'expected manifest'); + + const ref = manifest._reference; + invariant(ref, 'expected reference'); + + const object = manifests[ref.registry].object; + object.resolutions = object.resolutions || {}; + object.resolutions[name] = version; + } + + yield _this9.config.saveRootManifests(manifests); + } + + return flattenedPatterns; + })(); + } + + /** + * Remove offline tarballs that are no longer required + */ + + pruneOfflineMirror(lockfile) { + var _this10 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const mirror = _this10.config.getOfflineMirrorPath(); + if (!mirror) { + return; + } + + const requiredTarballs = new Set(); + for (const dependency in lockfile) { + const resolved = lockfile[dependency].resolved; + if (resolved) { + const basename = path.basename(resolved.split('#')[0]); + if (dependency[0] === '@' && basename[0] !== '@') { + requiredTarballs.add(`${dependency.split('/')[0]}-${basename}`); + } + requiredTarballs.add(basename); + } + } + + const mirrorFiles = yield (_fs || _load_fs()).walk(mirror); + for (var _iterator14 = mirrorFiles, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref27; + + if (_isArray14) { + if (_i14 >= _iterator14.length) break; + _ref27 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) break; + _ref27 = _i14.value; + } + + const file = _ref27; + + const isTarball = path.extname(file.basename) === '.tgz'; + // if using experimental-pack-script-packages-in-mirror flag, don't unlink prebuilt packages + const hasPrebuiltPackage = file.relative.startsWith('prebuilt/'); + if (isTarball && !hasPrebuiltPackage && !requiredTarballs.has(file.basename)) { + yield (_fs || _load_fs()).unlink(file.absolute); + } + } + })(); + } + + /** + * Save updated integrity and lockfiles. + */ + + saveLockfileAndIntegrity(patterns, workspaceLayout) { + var _this11 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const resolvedPatterns = {}; + Object.keys(_this11.resolver.patterns).forEach(function (pattern) { + if (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern)) { + resolvedPatterns[pattern] = _this11.resolver.patterns[pattern]; + } + }); + + // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile + patterns = patterns.filter(function (p) { + return !workspaceLayout || !workspaceLayout.getManifestByPattern(p); + }); + + const lockfileBasedOnResolver = _this11.lockfile.getLockfile(resolvedPatterns); + + if (_this11.config.pruneOfflineMirror) { + yield _this11.pruneOfflineMirror(lockfileBasedOnResolver); + } + + // write integrity hash + if (!_this11.config.plugnplayEnabled) { + yield _this11.integrityChecker.save(patterns, lockfileBasedOnResolver, _this11.flags, workspaceLayout, _this11.scripts.getArtifacts()); + } + + // --no-lockfile or --pure-lockfile or --frozen-lockfile + if (_this11.flags.lockfile === false || _this11.flags.pureLockfile || _this11.flags.frozenLockfile) { + return; + } + + const lockFileHasAllPatterns = patterns.every(function (p) { + return _this11.lockfile.getLocked(p); + }); + const lockfilePatternsMatch = Object.keys(_this11.lockfile.cache || {}).every(function (p) { + return lockfileBasedOnResolver[p]; + }); + const resolverPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) { + const manifest = _this11.lockfile.getLocked(pattern); + return manifest && manifest.resolved === lockfileBasedOnResolver[pattern].resolved && deepEqual(manifest.prebuiltVariants, lockfileBasedOnResolver[pattern].prebuiltVariants); + }); + const integrityPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) { + const existingIntegrityInfo = lockfileBasedOnResolver[pattern].integrity; + if (!existingIntegrityInfo) { + // if this entry does not have an integrity, no need to re-write the lockfile because of it + return true; + } + const manifest = _this11.lockfile.getLocked(pattern); + if (manifest && manifest.integrity) { + const manifestIntegrity = ssri.stringify(manifest.integrity); + return manifestIntegrity === existingIntegrityInfo; + } + return false; + }); + + // remove command is followed by install with force, lockfile will be rewritten in any case then + if (!_this11.flags.force && _this11.lockfile.parseResultType === 'success' && lockFileHasAllPatterns && lockfilePatternsMatch && resolverPatternsAreSameAsInLockfile && integrityPatternsAreSameAsInLockfile && patterns.length) { + return; + } + + // build lockfile location + const loc = path.join(_this11.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME); + + // write lockfile + const lockSource = (0, (_lockfile2 || _load_lockfile2()).stringify)(lockfileBasedOnResolver, false, _this11.config.enableLockfileVersions); + yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource); + + _this11._logSuccessSaveLockfile(); + })(); + } + + _logSuccessSaveLockfile() { + this.reporter.success(this.reporter.lang('savedLockfile')); + } + + /** + * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd. + */ + hydrate(ignoreUnusedPatterns) { + var _this12 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const request = yield _this12.fetchRequestFromCwd([], ignoreUnusedPatterns); + const depRequests = request.requests, + rawPatterns = request.patterns, + ignorePatterns = request.ignorePatterns, + workspaceLayout = request.workspaceLayout; + + + yield _this12.resolver.init(depRequests, { + isFlat: _this12.flags.flat, + isFrozen: _this12.flags.frozenLockfile, + workspaceLayout + }); + yield _this12.flatten(rawPatterns); + _this12.markIgnored(ignorePatterns); + + // fetch packages, should hit cache most of the time + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this12.resolver.getManifests(), _this12.config); + _this12.resolver.updateManifests(manifests); + yield (_packageCompatibility || _load_packageCompatibility()).check(_this12.resolver.getManifests(), _this12.config, _this12.flags.ignoreEngines); + + // expand minimal manifests + for (var _iterator15 = _this12.resolver.getManifests(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref28; + + if (_isArray15) { + if (_i15 >= _iterator15.length) break; + _ref28 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) break; + _ref28 = _i15.value; + } + + const manifest = _ref28; + + const ref = manifest._reference; + invariant(ref, 'expected reference'); + const type = ref.remote.type; + // link specifier won't ever hit cache + + let loc = ''; + if (type === 'link') { + continue; + } else if (type === 'workspace') { + if (!ref.remote.reference) { + continue; + } + loc = ref.remote.reference; + } else { + loc = _this12.config.generateModuleCachePath(ref); + } + const newPkg = yield _this12.config.readManifest(loc); + yield _this12.resolver.updateManifest(ref, newPkg); + } + + return request; + })(); + } + + /** + * Check for updates every day and output a nag message if there's a newer version. + */ + + checkUpdate() { + if (this.config.nonInteractive) { + // don't show upgrade dialog on CI or non-TTY terminals + return; + } + + // don't check if disabled + if (this.config.getOption('disable-self-update-check')) { + return; + } + + // only check for updates once a day + const lastUpdateCheck = Number(this.config.getOption('lastUpdateCheck')) || 0; + if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) { + return; + } + + // don't bug for updates on tagged releases + if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) { + return; + } + + this._checkUpdate().catch(() => { + // swallow errors + }); + } + + _checkUpdate() { + var _this13 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + let latestVersion = yield _this13.config.requestManager.request({ + url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL + }); + invariant(typeof latestVersion === 'string', 'expected string'); + latestVersion = latestVersion.trim(); + if (!semver.valid(latestVersion)) { + return; + } + + // ensure we only check for updates periodically + _this13.config.registries.yarn.saveHomeConfig({ + lastUpdateCheck: Date.now() + }); + + if (semver.gt(latestVersion, (_yarnVersion || _load_yarnVersion()).version)) { + const installationMethod = yield (0, (_yarnVersion || _load_yarnVersion()).getInstallationMethod)(); + _this13.maybeOutputUpdate = function () { + _this13.reporter.warn(_this13.reporter.lang('yarnOutdated', latestVersion, (_yarnVersion || _load_yarnVersion()).version)); + + const command = getUpdateCommand(installationMethod); + if (command) { + _this13.reporter.info(_this13.reporter.lang('yarnOutdatedCommand')); + _this13.reporter.command(command); + } else { + const installer = getUpdateInstaller(installationMethod); + if (installer) { + _this13.reporter.info(_this13.reporter.lang('yarnOutdatedInstaller', installer)); + } + } + }; + } + })(); + } + + /** + * Method to override with a possible upgrade message. + */ + + maybeOutputUpdate() {} +} + +exports.Install = Install; +function hasWrapper(commander, args) { + return true; +} + +function setFlags(commander) { + commander.description('Yarn install is used to install all dependencies for a project.'); + commander.usage('install [flags]'); + commander.option('-A, --audit', 'Run vulnerability audit on installed packages'); + commander.option('-g, --global', 'DEPRECATED'); + commander.option('-S, --save', 'DEPRECATED - save package to your `dependencies`'); + commander.option('-D, --save-dev', 'DEPRECATED - save package to your `devDependencies`'); + commander.option('-P, --save-peer', 'DEPRECATED - save package to your `peerDependencies`'); + commander.option('-O, --save-optional', 'DEPRECATED - save package to your `optionalDependencies`'); + commander.option('-E, --save-exact', 'DEPRECATED'); + commander.option('-T, --save-tilde', 'DEPRECATED'); +} + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(52); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), +/* 36 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SubjectSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subject; }); +/* unused harmony export AnonymousSubject */ +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(189); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = __webpack_require__(422); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = __webpack_require__(321); +/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ + + + + + + + +var SubjectSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](SubjectSubscriber, _super); + function SubjectSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; + } + return SubjectSubscriber; +}(__WEBPACK_IMPORTED_MODULE_2__Subscriber__["a" /* Subscriber */])); + +var Subject = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](Subject, _super); + function Subject() { + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; + } + Subject.prototype[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__["a" /* rxSubscriber */]] = function () { + return new SubjectSubscriber(this); + }; + Subject.prototype.lift = function (operator) { + var subject = new AnonymousSubject(this, this); + subject.operator = operator; + return subject; + }; + Subject.prototype.next = function (value) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + if (!this.isStopped) { + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].next(value); + } + } + }; + Subject.prototype.error = function (err) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + this.hasError = true; + this.thrownError = err; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].error(err); + } + this.observers.length = 0; + }; + Subject.prototype.complete = function () { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].complete(); + } + this.observers.length = 0; + }; + Subject.prototype.unsubscribe = function () { + this.isStopped = true; + this.closed = true; + this.observers = null; + }; + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } + }; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + else if (this.hasError) { + subscriber.error(this.thrownError); + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + else if (this.isStopped) { + subscriber.complete(); + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + else { + this.observers.push(subscriber); + return new __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__["a" /* SubjectSubscription */](this, subscriber); + } + }; + Subject.prototype.asObservable = function () { + var observable = new __WEBPACK_IMPORTED_MODULE_1__Observable__["a" /* Observable */](); + observable.source = this; + return observable; + }; + Subject.create = function (destination, source) { + return new AnonymousSubject(destination, source); + }; + return Subject; +}(__WEBPACK_IMPORTED_MODULE_1__Observable__["a" /* Observable */])); + +var AnonymousSubject = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](AnonymousSubject, _super); + function AnonymousSubject(destination, source) { + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; + } + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); + } + }; + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { + this.destination.error(err); + } + }; + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); + } + }; + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); + } + else { + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + }; + return AnonymousSubject; +}(Subject)); + +//# sourceMappingURL=Subject.js.map + + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.normalizePattern = normalizePattern; + +/** + * Explode and normalize a pattern into its name and range. + */ + +function normalizePattern(pattern) { + let hasVersion = false; + let range = 'latest'; + let name = pattern; + + // if we're a scope then remove the @ and add it back later + let isScoped = false; + if (name[0] === '@') { + isScoped = true; + name = name.slice(1); + } + + // take first part as the name + const parts = name.split('@'); + if (parts.length > 1) { + name = parts.shift(); + range = parts.join('@'); + + if (range) { + hasVersion = true; + } else { + range = '*'; + } + } + + // add back @ scope suffix + if (isScoped) { + name = `@${name}`; + } + + return { name, range, hasVersion }; +} + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license + * Lodash + * Copyright JS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.10'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading and trailing whitespace. */ + var reTrim = /^\s+|\s+$/g, + reTrimStart = /^\s+/, + reTrimEnd = /\s+$/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + + return result; + } + + if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + + return result; + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + var index = -1; + iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); + + var low = 0, + high = array == null ? 0 : array.length, + valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': ' + + + + +
+ +
+ + + +
+
+

+
+

+ + + + +

+
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/resources/[system]/runcode/web/nui.html b/resources/[system]/runcode/web/nui.html new file mode 100644 index 0000000..6f65d71 --- /dev/null +++ b/resources/[system]/runcode/web/nui.html @@ -0,0 +1,60 @@ + + +runcode nui + + + +
+ +
+ + \ No newline at end of file diff --git a/resources/[system]/sessionmanager-rdr3/.gitignore b/resources/[system]/sessionmanager-rdr3/.gitignore new file mode 100644 index 0000000..5699291 --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +.yarn.installed \ No newline at end of file diff --git a/resources/[system]/sessionmanager-rdr3/fxmanifest.lua b/resources/[system]/sessionmanager-rdr3/fxmanifest.lua new file mode 100644 index 0000000..5e44544 --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/fxmanifest.lua @@ -0,0 +1,17 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Handles Social Club conductor session API for RedM. Do not disable.' +repository 'https://github.com/citizenfx/cfx-server-data' + +fx_version 'adamant' +game 'rdr3' +rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aware my resources *will* become incompatible once RedM ships.' + +dependencies { + 'yarn' +} + +server_script 'sm_server.js' diff --git a/resources/[system]/sessionmanager-rdr3/package.json b/resources/[system]/sessionmanager-rdr3/package.json new file mode 100644 index 0000000..e00b6dc --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "dependencies": { + "@citizenfx/protobufjs": "6.8.8" + } +} \ No newline at end of file diff --git a/resources/[system]/sessionmanager-rdr3/rline.proto b/resources/[system]/sessionmanager-rdr3/rline.proto new file mode 100644 index 0000000..9084181 --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/rline.proto @@ -0,0 +1,192 @@ +syntax = "proto3"; +package rline; + +message RpcErrorData { + string ErrorCodeString = 1; + int32 ErrorCode = 2; + string DomainString = 3; + int32 DomainCode = 4; + bytes DataEx = 5; +}; + +message RpcError { + int32 ErrorCode = 1; + string ErrorMessage = 2; + RpcErrorData Data = 3; +}; + +message RpcHeader { + string RequestId = 1; + string MethodName = 2; + RpcError Error = 3; + string srcTid = 4; +}; + +message RpcMessage { + RpcHeader Header = 1; + bytes Content = 2; +}; + +message RpcResponseContainer { + bytes Content = 1; +}; + +message RpcResponseMessage { + RpcHeader Header = 1; + RpcResponseContainer Container = 2; +}; + +message TokenStuff { + string tkn = 1; +}; + +message InitSessionResponse { + bytes sesid = 1; + TokenStuff token = 2; +}; + +message MpGamerHandleDto { + string gh = 1; +}; + +message MpPeerAddressDto { + string addr = 1; +}; + +message InitPlayer2_Parameters { + MpGamerHandleDto gh = 1; + MpPeerAddressDto peerAddress = 2; + int32 discriminator = 3; + int32 seamlessType = 4; + uint32 connectionReason = 5; +}; + +message InitPlayerResult { + uint32 code = 1; +}; + +message Restriction { + int32 u1 = 1; + int32 u2 = 2; + int32 u3 = 3; +} + +message GetRestrictionsData { + repeated Restriction restriction = 1; + repeated string unk2 = 2; +}; + +message GetRestrictionsResult { + GetRestrictionsData data = 1; +}; + +message PlayerIdSto { + int32 acctId = 1; + int32 platId = 2; +}; + +message MpSessionRequestIdDto { + PlayerIdSto requestor = 1; + int32 index = 2; + int32 hash = 3; +}; + +message QueueForSession_Seamless_Parameters { + MpSessionRequestIdDto requestId = 1; + uint32 optionFlags = 2; + int32 x = 3; + int32 y = 4; +}; + +message QueueForSessionResult { + uint32 code = 1; +}; + +message QueueEntered_Parameters { + uint32 queueGroup = 1; + MpSessionRequestIdDto requestId = 2; + uint32 optionFlags = 3; +}; + +message GuidDto { + fixed64 a = 1; + fixed64 b = 2; +}; + +message MpTransitionIdDto { + GuidDto value = 1; +}; + +message MpSessionIdDto { + GuidDto value = 1; +}; + +message SessionSubcommandEnterSession { + int32 index = 1; + int32 hindex = 2; + uint32 sessionFlags = 3; + uint32 mode = 4; + int32 size = 5; + int32 teamIndex = 6; + MpTransitionIdDto transitionId = 7; + uint32 sessionManagerType = 8; + int32 slotCount = 9; +}; + +message SessionSubcommandLeaveSession { + uint32 reason = 1; +}; + +message SessionSubcommandAddPlayer { + PlayerIdSto id = 1; + MpGamerHandleDto gh = 2; + MpPeerAddressDto addr = 3; + int32 index = 4; +}; + +message SessionSubcommandRemovePlayer { + PlayerIdSto id = 1; +}; + +message SessionSubcommandHostChanged { + int32 index = 1; +}; + +message SessionCommand { + uint32 cmd = 1; + string cmdname = 2; + SessionSubcommandEnterSession EnterSession = 3; + SessionSubcommandLeaveSession LeaveSession = 4; + SessionSubcommandAddPlayer AddPlayer = 5; + SessionSubcommandRemovePlayer RemovePlayer = 6; + SessionSubcommandHostChanged HostChanged = 7; +}; + +message scmds_Parameters { + MpSessionIdDto sid = 1; + int32 ncmds = 2; + repeated SessionCommand cmds = 3; +}; + +message UriType { + string url = 1; +}; + +message TransitionReady_PlayerQueue_Parameters { + UriType serverUri = 1; + uint32 serverSandbox = 2; + MpTransitionIdDto id = 3; + uint32 sessionType = 4; + MpSessionRequestIdDto requestId = 5; + MpSessionIdDto transferId = 6; +}; + +message TransitionToSession_Parameters { + MpTransitionIdDto id = 1; + float x = 2; + float y = 3; +}; + +message TransitionToSessionResult { + uint32 code = 1; +}; \ No newline at end of file diff --git a/resources/[system]/sessionmanager-rdr3/sm_server.js b/resources/[system]/sessionmanager-rdr3/sm_server.js new file mode 100644 index 0000000..2c70324 --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/sm_server.js @@ -0,0 +1,328 @@ +const protobuf = require("@citizenfx/protobufjs"); + +const playerDatas = {}; +let slotsUsed = 0; + +function assignSlotId() { + for (let i = 0; i < 32; i++) { + if (!(slotsUsed & (1 << i))) { + slotsUsed |= (1 << i); + return i; + } + } + + return -1; +} + +let hostIndex = -1; +const isOneSync = GetConvar("onesync", "off") !== "off"; + +protobuf.load(GetResourcePath(GetCurrentResourceName()) + "/rline.proto", function(err, root) { + if (err) { + console.log(err); + return; + } + + const RpcMessage = root.lookupType("rline.RpcMessage"); + const RpcResponseMessage = root.lookupType("rline.RpcResponseMessage"); + const InitSessionResponse = root.lookupType("rline.InitSessionResponse"); + const InitPlayer2_Parameters = root.lookupType("rline.InitPlayer2_Parameters"); + const InitPlayerResult = root.lookupType("rline.InitPlayerResult"); + const GetRestrictionsResult = root.lookupType("rline.GetRestrictionsResult"); + const QueueForSession_Seamless_Parameters = root.lookupType("rline.QueueForSession_Seamless_Parameters"); + const QueueForSessionResult = root.lookupType("rline.QueueForSessionResult"); + const QueueEntered_Parameters = root.lookupType("rline.QueueEntered_Parameters"); + const TransitionReady_PlayerQueue_Parameters = root.lookupType("rline.TransitionReady_PlayerQueue_Parameters"); + const TransitionToSession_Parameters = root.lookupType("rline.TransitionToSession_Parameters"); + const TransitionToSessionResult = root.lookupType("rline.TransitionToSessionResult"); + const scmds_Parameters = root.lookupType("rline.scmds_Parameters"); + + function toArrayBuffer(buf) { + var ab = new ArrayBuffer(buf.length); + var view = new Uint8Array(ab); + for (var i = 0; i < buf.length; ++i) { + view[i] = buf[i]; + } + return ab; + } + + function emitMsg(target, data) { + emitNet('__cfx_internal:pbRlScSession', target, toArrayBuffer(data)); + } + + function emitSessionCmds(target, cmd, cmdname, msg) { + const stuff = {}; + stuff[cmdname] = msg; + + emitMsg(target, RpcMessage.encode({ + Header: { + MethodName: 'scmds' + }, + Content: scmds_Parameters.encode({ + sid: { + value: { + a: 2, + b: 2 + } + }, + ncmds: 1, + cmds: [ + { + cmd, + cmdname, + ...stuff + } + ] + }).finish() + }).finish()); + } + + function emitAddPlayer(target, msg) { + emitSessionCmds(target, 2, 'AddPlayer', msg); + } + + function emitRemovePlayer(target, msg) { + emitSessionCmds(target, 3, 'RemovePlayer', msg); + } + + function emitHostChanged(target, msg) { + emitSessionCmds(target, 5, 'HostChanged', msg); + } + + onNet('playerDropped', () => { + if (isOneSync) { + return; + } + + try { + const oData = playerDatas[source]; + delete playerDatas[source]; + + if (oData && hostIndex === oData.slot) { + const pda = Object.entries(playerDatas); + + if (pda.length > 0) { + hostIndex = pda[0][1].slot | 0; // TODO: actually use <=31 slot index *and* check for id + + for (const [ id, data ] of Object.entries(playerDatas)) { + emitHostChanged(id, { + index: hostIndex + }); + } + } else { + hostIndex = -1; + } + } + + if (!oData) { + return; + } + + if (oData.slot > -1) { + slotsUsed &= ~(1 << oData.slot); + } + + for (const [ id, data ] of Object.entries(playerDatas)) { + emitRemovePlayer(id, { + id: oData.id + }); + } + } catch (e) { + console.log(e); + console.log(e.stack); + } + }); + + function makeResponse(type, data) { + return { + Header: { + }, + Container: { + Content: type.encode(data).finish() + } + }; + } + + const handlers = { + async InitSession(source, data) { + return makeResponse(InitSessionResponse, { + sesid: Buffer.alloc(16), + /*token: { + tkn: 'ACSTOKEN token="meow",signature="meow"' + }*/ + }); + }, + + async InitPlayer2(source, data) { + const req = InitPlayer2_Parameters.decode(data); + + if (!isOneSync) { + playerDatas[source] = { + gh: req.gh, + peerAddress: req.peerAddress, + discriminator: req.discriminator, + slot: -1 + }; + } + + return makeResponse(InitPlayerResult, { + code: 0 + }); + }, + + async GetRestrictions(source, data) { + return makeResponse(GetRestrictionsResult, { + data: { + + } + }); + }, + + async ConfirmSessionEntered(source, data) { + return {}; + }, + + async TransitionToSession(source, data) { + const req = TransitionToSession_Parameters.decode(data); + + return makeResponse(TransitionToSessionResult, { + code: 1 // in this message, 1 is success + }); + }, + + async QueueForSession_Seamless(source, data) { + const req = QueueForSession_Seamless_Parameters.decode(data); + + if (!isOneSync) { + playerDatas[source].req = req.requestId; + playerDatas[source].id = req.requestId.requestor; + playerDatas[source].slot = assignSlotId(); + } + + setTimeout(() => { + emitMsg(source, RpcMessage.encode({ + Header: { + MethodName: 'QueueEntered' + }, + Content: QueueEntered_Parameters.encode({ + queueGroup: 69, + requestId: req.requestId, + optionFlags: req.optionFlags + }).finish() + }).finish()); + + if (isOneSync) { + hostIndex = 16 + } else if (hostIndex === -1) { + hostIndex = playerDatas[source].slot | 0; + } + + emitMsg(source, RpcMessage.encode({ + Header: { + MethodName: 'TransitionReady_PlayerQueue' + }, + Content: TransitionReady_PlayerQueue_Parameters.encode({ + serverUri: { + url: '' + }, + requestId: req.requestId, + id: { + value: { + a: 2, + b: 0 + } + }, + serverSandbox: 0xD656C677, + sessionType: 3, + transferId: { + value: { + a: 2, + b: 2 + } + }, + }).finish() + }).finish()); + + setTimeout(() => { + emitSessionCmds(source, 0, 'EnterSession', { + index: (isOneSync) ? 16 : playerDatas[source].slot | 0, + hindex: hostIndex, + sessionFlags: 0, + mode: 0, + size: (isOneSync) ? 0 : Object.entries(playerDatas).filter(a => a[1].id).length, + //size: 2, + //size: Object.entries(playerDatas).length, + teamIndex: 0, + transitionId: { + value: { + a: 2, + b: 0 + } + }, + sessionManagerType: 0, + slotCount: 32 + }); + }, 50); + + if (!isOneSync) { + setTimeout(() => { + // tell player about everyone, and everyone about player + const meData = playerDatas[source]; + + const aboutMe = { + id: meData.id, + gh: meData.gh, + addr: meData.peerAddress, + index: playerDatas[source].slot | 0 + }; + + for (const [ id, data ] of Object.entries(playerDatas)) { + if (id == source || !data.id) continue; + + emitAddPlayer(source, { + id: data.id, + gh: data.gh, + addr: data.peerAddress, + index: data.slot | 0 + }); + + emitAddPlayer(id, aboutMe); + } + }, 150); + } + }, 250); + + return makeResponse(QueueForSessionResult, { + code: 1 + }); + }, + }; + + async function handleMessage(source, method, data) { + if (handlers[method]) { + return await handlers[method](source, data); + } + + return {}; + } + + onNet('__cfx_internal:pbRlScSession', async (data) => { + const s = source; + + try { + const message = RpcMessage.decode(new Uint8Array(data)); + const response = await handleMessage(s, message.Header.MethodName, message.Content); + + if (!response || !response.Header) { + return; + } + + response.Header.RequestId = message.Header.RequestId; + + emitMsg(s, RpcResponseMessage.encode(response).finish()); + } catch (e) { + console.log(e); + console.log(e.stack); + } + }); +}); \ No newline at end of file diff --git a/resources/[system]/sessionmanager-rdr3/yarn.lock b/resources/[system]/sessionmanager-rdr3/yarn.lock new file mode 100644 index 0000000..e089cd0 --- /dev/null +++ b/resources/[system]/sessionmanager-rdr3/yarn.lock @@ -0,0 +1,90 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@citizenfx/protobufjs@6.8.8": + version "6.8.8" + resolved "https://registry.yarnpkg.com/@citizenfx/protobufjs/-/protobufjs-6.8.8.tgz#d12edcada06182f3785dea1d35eebf0ebe4fd2c3" + integrity sha512-RBJvHPWNwguEPxV+ALbCZBXAEQf2byP5KtYrYl36Mbb0+Ch7MxpOm+764S+YqYWj/A/iNSW3jXglfJ9hlxjBLA== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.0" + "@types/node" "^10.1.0" + long "^4.0.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + +"@types/long@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/node@^10.1.0": + version "10.17.58" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.58.tgz#10682f6016fd866725c36d22ce6bbbd029bf4545" + integrity sha512-Dn5RBxLohjdHFj17dVVw3rtrZAeXeWg+LQfvxDIW/fdPkSiuQk7h3frKMYtsQhtIW42wkErDcy9UMVxhGW4O7w== + +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== diff --git a/resources/[system]/sessionmanager/client/empty.lua b/resources/[system]/sessionmanager/client/empty.lua new file mode 100644 index 0000000..5470635 --- /dev/null +++ b/resources/[system]/sessionmanager/client/empty.lua @@ -0,0 +1,3 @@ +--This empty file causes the scheduler.lua to load clientside +--scheduler.lua when loaded inside the sessionmanager resource currently manages remote callbacks. +--Without this, callbacks will only work server->client and not client->server. \ No newline at end of file diff --git a/resources/[system]/sessionmanager/fxmanifest.lua b/resources/[system]/sessionmanager/fxmanifest.lua new file mode 100644 index 0000000..83ddebd --- /dev/null +++ b/resources/[system]/sessionmanager/fxmanifest.lua @@ -0,0 +1,13 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Handles the "host lock" for non-OneSync servers. Do not disable.' +repository 'https://github.com/citizenfx/cfx-server-data' + +fx_version 'cerulean' +games { 'gta4', 'gta5' } + +server_script 'server/host_lock.lua' +client_script 'client/empty.lua' \ No newline at end of file diff --git a/resources/[system]/sessionmanager/server/host_lock.lua b/resources/[system]/sessionmanager/server/host_lock.lua new file mode 100644 index 0000000..5121404 --- /dev/null +++ b/resources/[system]/sessionmanager/server/host_lock.lua @@ -0,0 +1,69 @@ +-- whitelist c2s events +RegisterServerEvent('hostingSession') +RegisterServerEvent('hostedSession') + +-- event handler for pre-session 'acquire' +local currentHosting +local hostReleaseCallbacks = {} + +-- TODO: add a timeout for the hosting lock to be held +-- TODO: add checks for 'fraudulent' conflict cases of hosting attempts (typically whenever the host can not be reached) +AddEventHandler('hostingSession', function() + -- if the lock is currently held, tell the client to await further instruction + if currentHosting then + TriggerClientEvent('sessionHostResult', source, 'wait') + + -- register a callback for when the lock is freed + table.insert(hostReleaseCallbacks, function() + TriggerClientEvent('sessionHostResult', source, 'free') + end) + + return + end + + -- if the current host was last contacted less than a second ago + if GetHostId() then + if GetPlayerLastMsg(GetHostId()) < 1000 then + TriggerClientEvent('sessionHostResult', source, 'conflict') + + return + end + end + + hostReleaseCallbacks = {} + + currentHosting = source + + TriggerClientEvent('sessionHostResult', source, 'go') + + -- set a timeout of 5 seconds + SetTimeout(5000, function() + if not currentHosting then + return + end + + currentHosting = nil + + for _, cb in ipairs(hostReleaseCallbacks) do + cb() + end + end) +end) + +AddEventHandler('hostedSession', function() + -- check if the client is the original locker + if currentHosting ~= source then + -- TODO: drop client as they're clearly lying + print(currentHosting, '~=', source) + return + end + + -- free the host lock (call callbacks and remove the lock value) + for _, cb in ipairs(hostReleaseCallbacks) do + cb() + end + + currentHosting = nil +end) + +EnableEnhancedHostSupport(true) \ No newline at end of file diff --git a/resources/[test]/example-loadscreen/bankgothic.ttf b/resources/[test]/example-loadscreen/bankgothic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f3d8049b052a1f9cfd27557eb3675bc85ce4b9fc GIT binary patch literal 36272 zcmc${349b)wm*JvRrQ)q(%sp~+UYDnCu!162q9q+BOst+*a8B>P6(T_FER`wq9_tv z8C)KtJch?0Q`KpgVRR;n3^Ixiq98608OL$(IgI0De4y#d|9fs#hk!WCd!OIuAE>UX zTh&$fo_p@u&uPXPV_tkHtYFBHF*n?@-S#MBybP^5L+h^_!ZUD%@nJYG7&_{v(GPFG z_ZFNtF=jb8boAK4FLb=1GiGbV^*{IRA9>?v6U_Y-aU}_7nbg80oO5;-8=!|X{g9DkSknAyOBb?k;yUZ-5Z|YJu)gAL#-;QTkO~(Y*uj6G_*HO>LckE&l zI-X~faP7U0e0B=k`?&W5>_5cz5sqcn51-U(oYmpz6t)ksIayK1hj`+Lc-qTs0a`ZU z_&qj)y^s9|*nfom8MJ4yWPKO&V9V`jVR_h!I+n3MxLVB?vwFO17>-9`Yrr-ZTO+mw z=-XQCH{src*wd3wu}AUreDU-Tar_aE&)~k_w$Onz&im|ypyn}9&0nhPfKdFzhXn7ys{RkVK(OPQ3 zSqo@bJ^Dm#FL(CJ!piZS8eHv%tq$AWc$$osdbHFFDkGtnpaR(J0-oh)r%zz5?gfCrvUw90^2J}`ZRco$~@e5V-CDP=v-n+g_WAr@x6 zSry*W7jNmuYVnSGHk4h@Ze%yH(QGVWI010E1#nq_^|lF5dVuW!cX$tL{{yV~GgxJD zdS8ZTcBS{3f^rj$Cyt9haYP4P`4OjCVwRx_xRZX+*zuh~CW7aWJLj0Q8%lM=%M{p9x-oP30u^jY3#lAZ$z>%H(kah6U ze5Ldo>3!+L0%t*LLAQdug2IB5f?z?vf*<$_KW5)5qQ3=fCvWJylNGoNG7ECdJ8R54 zc}GXbCmpYJ+}bfR))D(6_Fo^r_VK}w+dlsF$1i^Ti;uOB_k4Wk=~oIqwR~#!3LW{! ze;n`;EEu%Gr~F{*GWvVD0JYcWiw0m4hcve(>RYr+&d+ zewDE^zyITBY}NZ8u{-bEux0bsmTmVx{0MvK@h2W*hYsJy*l$*wW0hyhGZi0O&z1uN z?_u||2icFA#&%&_1>D@gHnJz#G&YkhW!u;~;OK7lEPIOG2b{ePSUZJ1#>TKkY!n*? ztiA>q4n!zZS;`2t=cq7 zXlT67Kfzb7%4Ksi3)DfQ8hz@Z3FWF%Mql;$eXAQk%04L zC9mT71*%+py}v+JN`|X!RO9AZo2M1fLEmhjZ$kEFan@j*(F>hM@7&pLA6}ABR`9kM zj;pL7sM-RP8Vd@B`iD$wE@&*6Io)^!-Iqvj#;Xf97YyAzWSW0-!DhdBonK`Qjp`uW ziSf~E)j_l91m8&#Z|Z*{)91@BII$UEz?ZH^-^QAKL;rAFa+$y2g!yuRLF0(g**=v| zXxxkeUGLxQFW7wjX8$zm2@QunsXuO-1}~<;Lj#}#?-c_;NBu+m)0(Gt9SMCkr3{1E zyotaze5QZ1O)VJJSeM;~E2(9zY!DwbcrYLFf}71?;*)M3i=G#3ZfNvRNALZEv$5m; z!GQdrhQR;yfrW7tKOe2alUA~QOmVldl~pg#IhgH&d2!G z^kBr}O$&#^YDO^PPD#a)*3EJ@BFTxNP)N-VMi_TdV;&kURtFlnS`gHHJfQaJcA)Nt z&$qI)fKyGcNK*6LELxi7Vv?$~9jLqc^X+uOqIz+~hAW;VT(P&I!QINdwv>RH=5FO_ zN=l$rqEBj<j9h1+ zbx=l{BM>PC&Z>d1X2lhIC{k*rE2TXgfvBw@tw$ozH>}wlXH_SrFceh%Cp4Q2OUbR~ z7M$>C-4f2K-GW*!b~ZO5azx4Nj_Ho33e=7;M^D0tRJX=?Kug9qE9q;!TxYc~VSPca z$E#)M)YNEJ8;*Ka)?fwD(ksOhR)r` zjMe4-{d{=y1Jk$7J$7vBqF^ax)JHl_TSqB_SpqbQY)Eloc95xQK`pBrkXi;QsSK)) zu$GUb}_J1<+@t;Loi`gWIxckg^SE_bKPY><$*AT28CbR^?0M z)fqPKFXgoo+pKTY|0=EMK6He>d)u6f8(y#IzVM#ITj$)TFOb;R6VLHcADr5>jtATH z-xhakZnYAf4g>nY_sb!yX2sCUIQ>{UgdgO4_VPW0zP9BOl>_q7u z2@WhTS5UQ{0Ev%_2VfBv!3ZoeScKI=cUtX^fR-pA$vr+I!yaFi&m(V=ien#4kDZcA zl|!*Nr^nusDyK^!F=lS<2=gzYxhAuo3>}CjJ6WoN_ql^=0wgeFX?n1nl>}g+#Rh}~ z`4`ycuQthim`BRIEfZG_$?|&3&ZHGS{=u0H-xPl;jd2M-DOE}fz~>5ul*b)sHEe`9 z8UtyN6PObKHBkl#yoCRXpM2yIe3!$jYWA(lpgz<)lH!OGna7v+v`dHM-Rvr(MFJ_F z@->;BlmL3UtT4rt%&4C|I!;Twz)xg01h@&ThWrV2nkE~4Bcf7s_z$ZL!o)zBc$+3C zUsP17O==~HgVr?HIQF!B@$w8F<~=0u+}K&4GUMAPh@QTV`K|aWTG3x53vcS<`qOr5$RHucUQ z?3KOk=j76DbLVc09p5&$>4CYjP?9-63xVS{r3biXADRQPd@Zam04Ym^H?l$)1_Wd$ zG>hwOgb8e760pf8-VIEuD)vZk{gK}-uW7FT_N0kB7*7D>$z_{a1hXB`T=CIl(`fR7 zYVHXw2crR(&7#pHoQ-4&q|Sn1quSl7n`Dhd+>schVQcvYtP4|)94A<-E`U0rP0O?a z)LCs(Bq1}403AtiWnwQtt!2BwOp}sxa=}c&LJc^PaBkzistjVFzN+4RsyUFWlvhvQ z#Pz!-hi;CIk)GQ#Wm9`w&0y(hY}+2WVMSx(iorLI3+s(Xs>iHo9DMx^J^8^m|A&+p z&S8DAWMQlokhF;+1~e%0oT(rsrJ(i6R;)6`Qd6V4J!nv~yjr(xqWp2uD%1z`z62xk z#gEcTF*-sGG2}c>J3s&IuE~3(>HUgJYV^(grkawHn%L_*CvTE6H%-2NeDmaao5rsk zSNhB1ep_mbH&u)nFudaFg24oUskcl_bz7 zXc5gqB*-A#NJ=J=zybMDC2TKFSKlWdIKsC}~iC3rkA5uZ6ppxBXN-xI)*r zR?Cg9SWWQ^C@x7{(ZAN;n*QFsuNM|hTex^mflmtG-@($;v|qgR(~NG$+@BNcyB3~| zGSZ_91=a(SNkOff4O$8za|ZArHK_HV^yv)Dng5VaPRj4bze+7|y>oN@RQyZjKjnPKzoloa*s*ov+IxR_ zFE8cS!U%vr@ZXMemXW{{JL}IP7Qz#WhT$MiPs51FiXe}`ZWD;NyGoM}BX%_3nO zHjKlgO)8x?;=S-S+Pi#!tK*=>I zP&P1jzJEn(V4&1zU?4Cs_S*qv)9zR_b!M__`VXcGVlrihD|zPBMeC=_#SQg=vTGaa zdj@pdl55J!u32(TpbS*ySjT6UB)}yHGS@g3@enYIfMZ!O2w{g22Y_k;Q<=3XfK7$a zG`eH--Q8LN#+{Dw2eB{cPFj^S%O=oF$-?yHh&2*U4;K_wLu@vUHG)_It!Rl1;G}M0 zVnH;=TGE`qO#2iPADz9{ia8>osEt30H8LP;2Fm z`|tcAP)k1r#Z{87ODRlz_l9c)_R-u+h8!c$1mDkxS0MsNaUhy+NHWP1j_u-@>@RBe z2{i$#xuF}$@gp+J5E(R9MW@Xv<%)BDNxqrgDe1^FFNr#_wU>_3FCqJx{i}YD$Q@^LORJ?{@5xe0Zs6T_i zXg8Qf=IB?C5>ZZqflM%sl#4`?KYQ!dHltY~)llQi4tpKQwbaI*Gc7`bl7hruac;_M z4k?XSam!QflB|C_TiKyV`c!?!0)D1}{{eWa^A(nT@{L%@HdsAP5sKt=YcOgP5(t z78RmKg~S?3^MI;GhRIw|!gPV7t?u;Pt_D+;hof#o+fNq;OtL6xeq-)(%MUwgk`$F! zsL2)3ydf}MRFiR|?V{AmrDQkFks;M7K93iYsI^AeMXHKPdg~N)ENNHTU!`h3Eq3OC zxlMf2s%83CZ@}v=H!QLH9@O^k?$&R?{An{^c&YaF%McBAQ~guhy|A0!$ZmnM2SZUb z&%!b>%>F@jNT)J3A*7BDMn@V~yuoOtIpdRpYT!f{lhE}5%s6BCgYIMlBm>I6JZ6Bz0y#oz({4(;sE%p_kXvO7B!^aoJ|j53BsQo@4SQCSZyKdo z43y?kaVAcLq%dfl$NQYOxH50Z$kAkBBB`9;46ehZ?wbX9pqrinSts- z*IqvkSJjaol@n{O4$B624)v)fB^uvWY=&M=B1chmhE?$w7L^(rd!M3kNXZadwoQ;( z%v6+PC{oe#0wI@uE5FH{8Br$de7zejtUnPx|prp7hF;AN3vJUDB}Q z$iiv!{#~wL8+)^?I3ZBkv-=IK<1w8NnKAQ+`t!fpuYWVEVbY8#)r%HQp0u1-zxf8A zanFKV8%NF1^+$iE|JRg0H6unUsh07RfBKU@^123n(1po!^}oHb==QBxANAndTd+PP z#I0zCl%OhM$iWe-%}MrkNDKC`#=xXFtON-`G8vL|+qeA8IGR~iripc1giPeTh(k?r zUOezx;>YL2Wm|=6sUXv=HT|OIl}L4_bM zCS0<2I}LP*;{kCDpF;|BzwDFwL8(UnBsNRB<|S#wE1P0foA|v_ZhNER`}Q=1LCDQA z_hPIh4>_Qp7Qs(w=yas#q!B4dCOyZJnikh{ii2wE3C#+%1{PK*IgpQFpwN71$O>sC z;1LXXr{+Q&aa+UzIwY8_2O^)`c?4U<<;sh)BRn|vq%{57kfVGc9rO>jub0QHm^=2C z36r-y#FH9_RqOluNY>`w-SrQ9#^xx#Y4g{N9g~nS_m)j_;R!eOwZRxm2D_F;oFutQ z7>5uqI0<=~LWq#iS4@bEo-^ocI7#ymmqIAcg8*%%6$dNNK>bdBJLm7b_lE~wzIOJq zB~917@?h)$^(OkeBU(#o;M&jcedy2iJ-ed^T=a!}WC@6HF!Wgm;6v^)lDnc7M4Mrr zEd(lH7Q@qW2mAApfWxgsw2tx7KzyaZv&$S=qr}R?A*P`#|HRybln;1eWp*uo_H%48`s;GaOK8d4M7LK0F!nhmI782jLaL4U$z?gKzH`5IMi z|Fz=NM{yO48=fa)zWG7C2mV3xJuGP2xilG1qRlYE(Ub5LA`H-xptmR#agYexk%1>f z5A1-YX~7k%2CE;IBF%}1kR?~M6RgOL5jR|j{*hhcP|NK7Qnfm#rRjm=#rjX=``b@# zn``3ZKD@`tZZ&l=u7J9dBREWCHI9NZbazltFj7kbbAwOYp#ep02`mX}nMr#6Lw@^X zgQ*H(&=eJ!CX-n~wVDEk#SWU}pdQkIeGcy9G;ZlZF2y9dK|d8602tQtL%KC~ihrON z$LCA=1pTx?CpO@LIWpbKh6N3fjL2e@2;7NV&@e@5G&u!|uYK`@@n>0!@vJPwateDh zJXVHzMIff7)188GX$g>{fQQ6d-uUIIh{-$1^{QoNUR2ZC4)nh317T0GsE!KFX1C)~ zl9mGRNow1HH=5q};VTJhrn@ygGYujIJ}-$B>{&ZS%aBbCfBbob(R4XCL^8}L0EW;g z&4vSwxy4EV1p?lM9k9*#u?(PO!TrEXN=x`oMR}w}lKAPTp0e@Oe3w4IT%W|13VCLJ zecxEM;){)vfS=Nlq}y_O^!3D|QXRJrB-%|h;wiu-og`8TsHQr@Fc1n%$PkzSjZcMq ziC6&51-N7yaCtZRclQdoB!cC-VW71OgVF)BJpuNa)+Bc#29M7!gOA8bBzTe-l_-wP z0jDzz*joduCiYegTuQ{itzLoFo-ohj85O*W79I__lt96~i{y;#{sngXQ#0D%vAXJV ztyYY*e`bA;@S^EbJ;r<5lF+BJ*Mi|O5JXAX6^~-96srK6u$!nA14fbi0RzDDhfO%; zgvPM^nc<^#VU-y+VRFNgn-Ki7(=N=T^1SwkRS=#Jw$7QeHCDWB&V!QP+|o>D;Rl+U zTY!2dFB*dPI#?Q_-XaNtI6{a4`Gq-0BHEZ9RGlZZG`yIH;M6C7r{>1HGXxDLmS~tD zd7OWP3t_BJNmH(=tZY|_Vb5I=n=EhFw}$#Z*gw?XM11;-dDHZnMjsSix6s&a@ZkQ; z^nj;^H4A*%p@a%|BlV2D*VH@cCRiiFDQL5j zQ_yNNoPxhu_=g0-4hv)zHNA}-N zz(9&-W2Of8>YS;^5Uucy-k=}Bgl*|nx1+AI%Y^aA#iVieDb{8!`srg$=p|vR2iTe| z&~@ zLDE=m$zDES?zTzW=FVB4j${I|0cL@}Z4)>MiA>l4$?U{J(C|e-j&wrfAn05;N;ssQ zh$PI~5_~3cZQt;-rAhl#Jy%&NZ);y9Z)*|j%%EjU@ccwXm_m30yx{#3Mrru^1PgVE zH;^)ncpuGTvQSK2oM#eRdH6wD+K=VDr3I^~eKGM(TFi1O#y~m>$+}j=01A2;;fjTH z6UY%(yyTMghvY)v3uFetH$UX|c7mcRLFT8xY#)2I=g z!C%(bN5B#K&gbRa_oTjlgZ_bj3?O(x9!A@@r{(8kXN0JcpVR|s2jU;3w5ZiE5IRWqfk_%yNE9U5AUOP;k7@7+-kx?m zx9dTIp+`Cp)*w0T;3aTPSP-{h-Y0@05L!V&5fB}4S^3UoTj%8jcdISI+V$H|Qk_!# z;kfLi%dC|vHldaB&Lb0ege~GfV7EqMu?sq1%qM-Q2c>FVpQNvme6YFQ%3E}I>@9v! z?{DIeB^PkBvpcSYo3Pp=5CLGKfIe93i61~jCe7M}SgB#SCn)`{`Q6?G9QbdI01;ty zI}rT$ck8KHSlVD;R1jkVW?_Tl5d$H#Ku}72_B{s1d!&i6KYaj$+I=Tuf96M}F?tVv zGN$T5W3D%WzNqN4gWX`tiwM=~;%tDB51oekRH438LobI`FWk$p2UzgxxH}9s0B|z= z89XRl1?MItN?+P0IXPA(f7pTM8J4E}5zG)s4E&R7)gwoFCR}BoQaekpqycFnv8_!rU&F z=BR8M9SHe}a z34R`y?rGLPi^#|MBv`p>fv-p46R<%OYsD&qPXIPuV-G?tD>foj&~z+eXnEuV?rQX^ zo^$$d0*5I?!U_HYk=16uh(p*nVDvh7dZxIHRU`@iBD*hYHm4n+)12;$mR5_CLPjBl z!Ma8kFZwhrUT6nQo&U(<6((|A>Vq#-uH|1pB1w_kVtW=v`O(khneC6i{yHDVG4C=v zf^jxuoQ}(EU0i{!3q#hD71+9%Ve2BFlVR)P5LIC70@K6<2wN8#Ok0=FFmb`wMOs5H z!8R@+`>TbmD-H58wO#J0U%>yTZ=kGta`!6T!T+bGC}x*FnmKXUO*f3XeI4JVUkFs! z_bEHn&^`ZjUhG48=FJmkUN_WXAAkL#abt)kMlp_w7)KX77slYBF<>yAb}mEWircwx z_WgD)Gi2g2JD2<%iS@fC+^$Qvk8fPV_1h=xl0J#;d@FzUigBY?^CPRqj$hG`4ZQ;9 z7E2cTV@D<#B&rl)eL;^>JA0HS^ch1e6w)hs2-1PjLgwqVafvXPVc(aResBtJ=3;JZan!}Og&rVn1hy^AYuvU) z;4y7m0LUfV7OYK}+skZQq`ZrN*dLLbWBvF(*m&NQXRbfJUI#@q-q{21H0)aDtKxPo zdXs6_y7Enz*|o%L1kpVrPmR^{d-Y{_g?@gWz9&A{d-0Agb}fu6#e{69U5m)0Y1g`J z+9@pKAKSI6u5Q<|#u}vk`je7%!tJr>?Gq-hkw&hXByix1<@%pij2pX>A6YSe-2AK@ zgYVJ$IwViW91IjON2Was{gs`<26kng@*mD@_Q7PR1 zxHP<=E~m#pH-Pz4#(?{SLJuWkt;ugN6c!~aqp=ozb$KAJUQ!mQX~=~Mk&arwgX z;#jsk^Tvs!rx(_SSv9f}3`mie<|@5ZNK+?oe&)tkjM#CDz!oR3chS*tJ|#$0R_ zb79!3y3EBTTb0R$$W~>{NZeM1G5;&JDnIvofd_9-AN?m^OCov?YAq2m0j9uBZ za_rcZnfdF_k6qcYV*Hrqv;rU>M|2cZtOEDQPDR6jD079K3K47nl%1;iX??bQ3Zhf4 z^vU}5gxdyh+JfgNk~P>N>{NhPB3=YLmDqP0t7tk+V-@C-*x`4KRSTrmyRnx4c>4t6 z0K@}Vjvco`denFqjb#Y1W!7J&-%r+ONJ}! zCBv2VUo~8%@NhP1N;2o`ban5SoX!8{%Ln!7%JWFioEe)dJxUws{-)R}fgdoyD31UZ z2?(bWqeqezWEY_yLdmu}$b8q;Xa#Ev$uO4;R$(;64OWn6;s&eZUmVZ?mu}A&;PA{8~@WE z^{4bh{6)S8pSAh|J;`W;?sn#8bmg7aw&OqtgHyt!Z?^`Y?=6S*@K7fUA)u}`SHZQ*K)u3hKjK{v((^8P%@*jVFY=$&%+sEg3{7_mT z{cy)urymk@iodSsO4Zg}$U3=3PRRFUI&lb$QuTam?ggLibhjo};Nz6MMXfF%Vm_&mEk4}-t=P_XolTgEL~G|m9btM@4lUzuY+ zfBJ!W(|7#!XZPn9+`sp$Cjb`%7Kj-*Y57JvhdA8_C<`E(Wn?KOg;enML=2Gh+i=t) znzbC7>D(YC{}J+^{ma2W6RN>mO^J9~O2I`nqYWpmRy%CaYKprxEhPhfS$tkv*%4f% z@c3t8o=-_LJ#hT8Gt(AJ8F7U{a>7#HWEI7aXQb0V0HfOS&Fr?xGk%h5Nl>Saeqm*E z+k~b)2{uRiPbZFjVY#$+*w7lMqzoE4=C7y1SHdcmq z2_e^hf^4TA!{7`ZmaJ@&2vk(3kHnL%!$uzit19!~M6n9;~a?p~^uH!Z6^vukaJ z+fzQfEZIZ(y#9Fnn95T2$a!$!x&r$u}w(WmNnw|e|Yf^W?dpWVb~A$`h&T&QcA$;^njst((L$&}{km&2x&$|gO&?Hg(EfQD;F z%;T(TMjzj#`c2awJiqC>@%lIQYq5l@^ypi|rtq~>2k+U_|CUJ^_v=-AeH(}NLtqQ7 z)su)nzYX^JIfR+J9krC9=AVdv-&X)%h zvDOpeu3APZj>`K`9DjKqU<_8i-4jtNLv%44tS*w6hA4kffDGU|g@XC3!iYrZ^oI&_ zW1$t~Ap=&cR2*1sB2lD27eQ=@+r)}Fx%vmPeEf)_v^>olesuR!wKwXYO&uaDyh#6C z@_M#&&%$xnKC<)4#rnzCs->f|9!gw#PfA7ps`8r(9=mVu%&Da}URyPEihpRyDx1#{ zTu@aRzJ79#-2Uq~R96qGCY@~}pRTO8Y=X=Hj>YO$IV(kcat3O9do3Ay=8iYtzAEhUwXQ&WV? zUtA4VP)kLSuIA>@aZaug5b*YI-);qZCm_Y5)fLQvH>>Dox8_yk(zj~g{)KoBZZ4vmk(b`0<7iGf4|B zJr(OIITT^(bViAaNGqd&AOuQ96B8Ij&3H`E?^54=*kCgMbr1rL}i0w1e5)0=HBW0Hqi9f z^{1q2%XZLo8>qS&a)8m8xzyz00tdNN_=IGQ6hq#aKc8=pIi;@^MxR)3J3EHUP0A3& z^4Fv0k2*LQO*cf2pb$9#ajss6MR+0_5~RMBg^Ize@{P5XAEZhLw8}yvTQfS)xXCdv z3pdpmofrZ_MfD1Rz$){oDK%;cx#@@{SF=2W9Ld)7obJJ@y1^7l?w}+ut!5x@4uFyc z(>>njlf5a{V&n}OLA4-Hc|cSV%vu5bw93`yc@UXkAZG@$5-Quo^)y)L%$Qe!*g$FS ztQ|b`v0!=4u#wl@UmmDx99RFtK|?0}N56e*Cr#{I^~kF6PYxJYdFy~{Z}^i%d2IQt z3Dtvsa{Db&$zO6^Y0uul;-V3O(qJ&QrEy^0u&T*}GKQ@gH+-_EctYRls|VDM>D_xk zpX;Yf(%_Y2>Sua$=MJ2?VL0Kq#NCQl`cipI%v%)`3BzF$5YhoZ6qYfL#B?H;%&5mf zs7z^P@vsrp#sL1LNuze^1v?e*OZcN_%WPH0*Van-&az;8y`E-rKrmWnqgEkB4Yd6*|Q&0a9CX`cSowr%>?bLTF+t$7ywpbw5}{MEkQFU}gj zcIWwbU;nygS=*iGZkaND>ZGZExnunoQzp-tIc37<@{C1Iv-Q6{{D}U|?B?4RH8*kR z1KW7w{5kWnmP+9n?ji3Ne$c4M&PS~tkSR(HF?^ngNF|#PEf}bK6p?Bc3j#n%=&kze zN2dSV$QM^MTQU-ooNWhwyXeDjhz7xIk3da$Kb>ugCKrlqB@y@k54@m80+SI~0g}X@ z;}S$t13|S%QZq0cMVZJI4si#DO!(GSTgWWpK&icE6iVfp zlYca*E&?m0HgZqEhH+GXFImuDGS0wDjtfj&sC@n;aboBP4mYA!LH3DMzgc?nLvcIV z^%1Ry3$TPHw6RtR)R<^7?>sV@V6k6D1s|9-=(Bz6S6^-YT-veq{Q0eCH^3)Ut{>Nr z8GEcVWMUXD(suWRI&5!Fk?n6kX4ejAY|>Q4Ru z1vdU)Y91(^Yu^s;S%F#vZ!xtt812!Sd4wPUpkTx+)9Uvki(YekP`(G=evkk{&fH)$ zD2})~G^k#4BI-AA)Gvzvm{osBtVP8i*rDTUI8vD5aEMkJOMjSw!oQjNhfH3W1yBiiA6hf~Ro4*Z;2zZ_0uE3y z$V^`#u@qsGRMQGM?f(*;kQ<(S@~-)dn<77(f6I&8B8S$=`=(Bu@|U~rI6LVFv$|4< z?L1*loI*UP|4)-iA(Wtg?AlSIuOGK~#e|iK`Wn7O-y)CHN8WYrmdP`wPMY?Y^>H%s znLK;p+$+gM3s0U0GC??`RLYXFA5`0{Z(&7!3oEqWOZ6@6kVXvuV+ta6bV*Sv*TQRw zSPOZbG~2QdD=&kMWGeE?Q2T@C5Cq+2&LJW{(@tC=48vML0s&Q2pbQ($g@|N>CTq!Q z!Z6T97L?;Pgg}uc->Pxr)~p^se&t(Be)9B^Wjmi%9vQcK^|@7<~{}3xF{8S=OK zF5&x~j%XEv|31)ZL`1?ugG!uKNF$nUzz{Ylz);9Mq7DTWd?H$Hl%j~*1;@KeHHv7W zabIGP5*Z23W=)Fx1Fsp@*?3Kg!hgCZg;~2p*sUzzsY!8kzyv<3ae%K1*1RJN`%jF0 zP*R4BmYECXUBjxXhL!dT=jkhamBXq^1Ho*bwC15~bKH|K?h4d^6lEyLB15=?qIFhd za*{Cu6N};{DdLFKS(PFhFh+|6>mmv!G>U?e0k6ma(7#-$f}1tKjM(r_gA`J%yX0?T z;l~SA44zoGh(B18nN@t@qvEX068*k;11Iq5jRSi1yRQFr6Zr1l*M~C}r4^3zXWW!i zQCyZYBdv5;RiB~#`t)%*>uLwzh=?V`KCM9P(>Ega3E8=T0g^f6u}?-N7X*o!tB|LJ zasRQ1{u#wQp}I7_-?2>}r?^lfr4$t}$QSJkYbnt9ZP56;!*XfR!vT+f^-F_Kl|a>R z(~6P3isa(~Pki-jK_&&?(vov7A`F#OM_$aJPb9lr6O&!gCz9xs+KZ?i3LxvE_VJns zu9MoASi{InLUl~3Vrfz`QP=n%|NcvY2Wly(Iwnd(@Jk7t;D(*aoRlp_QzUk!vY+$D zwRZc`1#6>$Rrl_4ISUJIDbCcCvWy|u_I!NSq|K#^@8fk!kC<9oU$AW5$=9XwcD=gJ z>+^BG&|)1nJn4q9qejM#TaE*az{@cdQ(-v_ssW0I;5kWTw7@c$WTGMp3)#95G>UI^ z0Bw=s16dRSN)*ONtBxoFac*3M0#4jN*n2Rf(#q-tKmnRy? z1R*H1P2+`d61AZgnG7UB{B0J?1d`zN5|TvF1`I(-S5zDlm2iL-{IWAb0?kc%DvA?Y znau-SApcxdT+0)OzC%v2$?mizFS8K@)GI@@l%g-36Dx2)FTG(qr_H# zhL=OurkDamt3t=YD@;C!+LnT23K`f!QP@kR)9Yp~`>9(N&xxhpCb!eM;q@f4=RjuVOEsJquy@3K>{G#uOgz zIBnmG7+b3Er9cWX!^4Wqyb?q#5&`mP#Bv4GB6T%+Pxxnjt16;uZcJ zFBxevkm3)_HzXFy^vAM}CK)^@N%+gihz@3qiTt}YgCOjXQdN1!$=hhrC}faMf>a8L zwCJLWM|p}a9w@!=rb1T{AY+ykDu%R5C54{lRx&ypRP<75AuSbYzM2<)CI}xMZb9&y zS!76r=>lD=J+`g-TEv+-_~~^&{;|HQy{Sol^xKzOzCOuo^us5&42J`C{qQYD&~j`m zKVMrM6Y(OlfbAr}HWyI{r98#Rr#2-!@{Ael2j=)_u>sLyQ5CAVgdo~Is1}}xmKqQ( zEG1AE76GEAqUK4b(Z(poV9GW=V&O336EH8yIXL^L^1Ig_>8P7Pz&1fEea$ zA3&U+`Ux$+brqHxhJ(1t8Un#( zf{`fqfRJzpk&J4O<#g>>e$AMg{E&V#f3~@9Z0zg89>~mGF}J02KKKXqm6i3yWxcZh zd|Q67zOuMyAftWBJ(*G~g_B>J8HMe-4Ce>&Q7lqPl4HQY_rH(-kkT`a`(Vk2Z&OgG zYe-60%R_NHbs$8h>Kx#De=!@a$^CO+L^A|RB5>w{=Gr?#dW5P@N(1e%x zFya0G_lsum|BFSV<&trG&HWSE$c@ zW&85)X+LyX`xBkdIec0Bmd^HOYG?TU2zsv-URG4v>;{;hW072dTFnVlVd}j6Lh=>( z0PlER4dg$PQqz}sL{RgRa~ac-EPR+m>)^wLB`TUG)=nJeodr0kd>a+u$VPErqX0)v z*8&{*6>4sUnvY7gD8NyO0vsq)D++KF!oykES%8BoPZvn|RMGCEcGy4S1vuhAF%Xy1 zu_to~m1)zwnY32OkQ&#{eOwlfdvepkU)@FEBv-@w6&?JW$WCg zt$O3-^*eZ^w&7;nFuGq;3l*Sf`PS80&;wYF-(Ttvyrz1Sh`L1sR3IdpY02>fV<$YE zUfA?fBpb3e72DZpLXtR4Ff)%SBsYOkbc<1s9R6cbBib2?B#V^DWK!qth?Y-Ige?k~ zPh2`Q>Am%Y?xy4eQO4VbVj5n6Foiy4)a&kyS~c{34~lIgnF&H1HW?Y!w*Kv{vFA=7 zmix!?ta_SpOhiQi5mm&vlg1=;%NRlOW|l0@q3eF0bZ3(N4MKsRGBl z8#vD0gyTm2i!SZUzo-4sW$lE^#&epDc2p~1{J+I>%8ciCG>bKK27=|xF73MSoLtLoaFvqCRbgA+rYKBB}bGo7OB*KWbTq>>UKiSGwPY3jI6aA@e(T%RwLa+$=Gf=m@{ZwRFyIXAxb_{wQ_TSpw1LQbBtN= zU9HRrJk3U_5k%f!rQFCHZy?|H=rVop6*Wir*=777&6CLOw-BwU6!1bElb8<$<2)+h z5;EsWz|qK$@6x`UU%ma%W$pBQ<2i>fYbW>`?akBXd-h0cP3C5!yD z5`9u-3neoNr#AYetFCx^vS`nUw|Ap<{AfU8lA%NM=eeZVT*(>T;`AGkA+i+alqv7G zkdz7=3Ke(&2L`1|K}-sd-p0R*J;4=e&XV><!Iz7h;mA zyuhvc1!dt~RDMDKhC6TDXs&}L0njclBQ2Ze@sQs^+^z^cMRQ^GeKGIt%`#;b>%=R?a?o zli;Dks7Q`6sjXFZV5K8Wfus+Vus6J52C_m?;v^aRY=Vzcx|&CxdZYf9(ikh%^Pf8+ zy)Ms=9pX>uGk7y!t8e&h!xvx3Gm*g7L2!)fLCPb<_`z`i_tp4~A!?^Qu39l4FqVk< z*mBkO(&1O67Xnd!5{z&8b9rz&(y!U!6> zFGageJl}XuGqq#>reGapVg8a4xd{F#DuJbA>ZtH0oLFaJ?sq1Gf1>UPMKOB8KM|)S zTo)qd1krQp!f!z_ClROcuRF=Y3bxB{`zaJ#^6+TW!VG3k6$}`P0Mt<)qK6U-+Rr&==Zj8@ERN(W?0#1jqn#H_f zevS!vG??>q@T%?0@%tE8yZ=zvcJX}UIfpN6r+G8lo2ebEL1)|H9}0qRCZl>wKk|@A zk=TaX@u=_-kLyZ@2f|dJP_M;t0=cr3p--XVs3MBY7a}EbV=Meqocups&gF6C0|u0r z_a7kL0Y^|{*+4oO$QKMKFB>qRtZX1JL0!$q2bGl%=wDGbNc1b((L*_g0*MAs`oQ2x zB3D8ViRzXS7tK6F@`R0KSgKe?>Wqw$<(vt7j0i|50C=eDxtU{thD>G?)}R|bA5HR8m?h!2xFSukJl zsJe)xn#>6cPcfMjls}O&XEGe<)G_KGF!l4^`>uU)*oyjcGWJZ|qk zI;!#I#!)Y#JD@+JpQ8UpKbwtyl00gA8S=P{Y`#Vo@e)5ky(WrAiJYaa=wW*^ZpNMlqw<6r5cLEVf# zHcIue7m@v{oQt*br}Qb(kZ)b9CLyD5#PV^1*KC-uoZxH7CnUER@=3FhPdGaxAD46C z$FpJvAdb)vV#Hl}@Fu~P2l_z{brfGP!i7}}tR%=~N%5E3&K!yyniq*0ZoTv8fmhrv zzbsuqeOJ@Ro+hlW@CuVp$jDI;2<1XO48v}U@l#j?e%J?=1>s}2A}Cp??nd2p;cf@r z`W_XYFA)lPUER&|ght-f)S^5G4ZW^z%;?%VTer?>+PW2fvX2y(>{m{McFq#xOoUI} zAfMS_L7ULM3yV0|I{=?u8$uHxn6@k-`grX zJ(-53RrvcTu8vF&{s9yqnvYyiijbH6nRAAD@;#$mIf+FT$&G1qMtJgEH@XWFi+Uw0 zrzg*_Sh5u*uke2%+eBEtvx|MvG{ zP%9lJ)>jCa`5?PRs5C0l0aZW?KIAN8h1jt|P+SagF?mMz1$+|}e`f*{mBh5XGypRr z3r1<=%w)o+9tUj(l}NK7dj2ZF^$Ev#7iddI0PPk)JK*v5)U&hF+}{O#QA%22=Omz} zI{Lpz%t1bCN{h%0>N(1)lW0WY1TfEJpNN-uM-Udu|HOZ`28I|d6+a1~rIArR!GofM zs?zzZJ6Fz=?}~Yo!vR8#VOc;8{j*CI*A-uCkuitc7j2#BcxPleZpx6_GtC zOiw+f+Bg5}o?iL;K;P+UrRd!-_z%ju_SC2dFYvkRuL#jv3iD&~2Ea7|ztC&M`8W*c ztcdwBj=Q+^;kG5WK6Y1g>xcKRS^dn3&KjmshAsOlq zeVYBL7S82$mphe-RuaE`+%gsX)`j{n2N^OuB34Hd`O;H`t4w232x_nJ9Fw+7Kiudn z%0PEf7RD0~n25MNq!+uBpmKRcoU?}#;^6G1U}ZC+j0(2l3_-WVs8K+MhW6^ce`+w8 zB!|Txx3E&w(MQePQl#F#clKtwhB#~rKcza5n$%rfwsogyMli=HA}efmVFohQYKRty zMw9)pNqhWhA_%2Q-n;wpr9-vK1H;zsYfvrw^@)6U>>NL?m(wPBYxGinis~hRcR*R1 zEzbteVU&a~&u-sATU@5Lv_a=CWg``mlC6mLHf3;olW4!`%64a_aX%`w5r$rW<#m_w zyqmszUG#-B{&J7%7k`jk_cxYrr_Qk>Z~P28vav@LRIaNHo*9NjMq&HF5yoI06Z;!u zt_vO8Ixf1}j8V~d%)if-qxh8u{7HMU=@{`aRF$e>)2*d!nWdebwSLMTv6i#lyp&Bx zroy|}jzW-*Sobnr(m^wKu_f3iNk>@^-2b|zou9>K#iro=F!ny|&tcQCy@lC8< zINtY(vA5Fw1KFp_9+qX@g!?w)nV+!1mMB|dnS%Wiwh80-g!+vA1{BQRjWIC@4pxf- zt8x-MqMTz_1^a+`mE@*Rc)P#sJ=SoCoBu_+WV#TY>Md zv!CW+V`IB4K}4Yg?pNDvr~yfHA?AVR!rY{H*{#^lU>kvLwRHs>5}yZ}i_5mXyi%NF zE@(dDo0tpCnX{7Z7jP%oU$I$tVO}s7VjgHN%nkF9i|u}?yyF7)rIvTul=wW*Ty)(C zF5(<>LGuyc#9Uy`Xm6j2K7WSq0Y3nC>ATVzwg%fedM>R6&>Uvn$d1@| zvLnuq*b&zS(y#LwQv>Z}D1&Syo$~v;5xLXnn_4 zVSC#?*uK)CIF>tJak`z2&fA@@Ce*vexPF`1D{*yVTVi`sMbe!~FC@K_Y)_t)e1|*9 zeW$z4BYE!jeCVzBF7@vAUP$?2YPZy-scP!SY2LK@wENTcroE9qD1BG@7a0{9O&L2f zzRc{NIXH85=I=5uWG&D7uv=!giQWD)yI1!1?ANmOoQ9nDavO5@<^CzJA#Y*cd-g?AS2^-uNRUo@)d)#Aa$3ybe7nOSm2$?r;wN_Tee-hEj2FM9OqF{Q`* zJ*_>5^n5k2xNJcAkn&f`-z{Ey{dmFpFeVE16};Gp2hU}JD*@Ydk%!MlSG1>1Ys zd!_a&=vCIMZ?F1ZzpwmJ<$aagD|c0@l`n=^$Q8;A6@_|*>O#XpV?wWm-U)pi`XY28 ztc2a+oN)JW@9_5UuCN+@G5lKio$$xK%X+`j`@P28y_9}bTsH#a-`}?pyu0Fl{ z{HV{z-}6te&Z+KKJ+69j_1@|a`?~th@B2zkX3g-LiTL+a%@;La^jq5Rj(+#|+tF`t zzXO<6;xnJKNl;AcL4YKjOUNI_Kng<*VRulfNW!Rszk(_fhHL z9pUb`Q97Zmk}%tj7jb5>FMS7xHLjf=8*8CX3)Egdn?PPr-5g73N9$sjEq#Ib*DJk{BGs_{yFqg>LJS-pi+=tJ^uWb<@ zH=Cy)=g3@{M+9~OdRTz{XCYD-k%h&Lt~_X~6uo<;98XsT`df~=w}w43<7Y~dbrt89}-Vt_7@oRc|qh$tGt$1cu8+CM&ISMyychlhB5gf-{h$5U>tTb7dp`Y z1xBcwnGs<`V~k=iqdUy*i+dQyy|Q2Sv0uPNR{sa2A1}>U;%A1iXAH`Hc_$y`J+aSe zDqUr$OqE5L_av3AH#SgHluJz|m)kA5BX{KyR>IrzSPsiIm4h$gp_(SgRj!(@@`$R) zcgDgYx4Y79U{wP8JO-8+SY}{_h90-uE)Og=xLqFHE)Og<+j z+<7uM7;qFe%!+3RYvZmBob(50#2tm38+b0v^2d`3tKtsJKSaE&LnaV!1fF8~Z#voy z;si-PYmihBXT3qvKvDw+Ne4;uCJ@r5nwB%6W>9`GDbP#9S-PW)gClg5pakPCtkJ&# D`#l06 literal 0 HcmV?d00001 diff --git a/resources/[test]/example-loadscreen/fxmanifest.lua b/resources/[test]/example-loadscreen/fxmanifest.lua new file mode 100644 index 0000000..8b1d115 --- /dev/null +++ b/resources/[test]/example-loadscreen/fxmanifest.lua @@ -0,0 +1,19 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'Example loading screen.' +repository 'https://github.com/citizenfx/cfx-server-data' + +files { + 'index.html', + 'keks.css', + 'bankgothic.ttf', + 'loadscreen.jpg' +} + +loadscreen 'index.html' + +fx_version 'bodacious' +game 'gta5' \ No newline at end of file diff --git a/resources/[test]/example-loadscreen/index.html b/resources/[test]/example-loadscreen/index.html new file mode 100644 index 0000000..c3f8446 --- /dev/null +++ b/resources/[test]/example-loadscreen/index.html @@ -0,0 +1,77 @@ + + + + + +
+
+

Free Mode

+

Not Algonquin

+
+ +
+

Intel

+

+
+

The Statue of Happiness has no heart. You do.

+
+
+
+
+
+
+ + + + diff --git a/resources/[test]/example-loadscreen/keks.css b/resources/[test]/example-loadscreen/keks.css new file mode 100644 index 0000000..0026bc9 --- /dev/null +++ b/resources/[test]/example-loadscreen/keks.css @@ -0,0 +1,151 @@ +body +{ + margin: 0px; + padding: 0px; +} + +.backdrop +{ + position: relative; + top: 0px; + left: 0px; + width: 100%; + height: 100%; + + background-image: url(loadscreen.jpg); + background-size: 100% 100%; +} + +.bottom +{ + position: absolute; + bottom: 0px; + width: 100%; + height: 100%; +} + +#gradient +{ + position: absolute; + bottom: 0px; + width: 100%; + + height: 25%; + + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%); +} + +@font-face { + font-family: 'BankGothic'; + src: url('bankgothic.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +h1, h2 { + position: relative; + background: transparent; + z-index: 0; +} +/* add a single stroke */ +h1:before, h2:before { + content: attr(title); + position: absolute; + -webkit-text-stroke: 0.1em #000; + left: 0; + z-index: -1; +} + + +.letni +{ + position: absolute; + left: 5%; + right: 5%; + bottom: 10%; + + z-index: 5; + + color: #fff; + + font-family: "Segoe UI"; +} + +.letni p +{ + font-size: 22px; + + margin-left: 3px; + + margin-top: 0px; +} + +.letni h2, .letni h3 +{ + font-family: BankGothic; + + text-transform: uppercase; + + font-size: 50px; + + margin: 0px; + + display: inline-block; +} + +.top +{ + color: #fff; + + position: absolute; + top: 7%; + left: 5%; + right: 5%; +} + +.top h1 +{ + font-family: BankGothic; + font-size: 60px; + + margin: 0px; +} + +.top h2 +{ + font-family: BankGothic; + font-size: 40px; + + margin: 0px; + + color: #ddd; +} + +.loadbar +{ + width: 100%; + background-color: rgba(140, 140, 140, .9); + height: 20px; + + margin-left: 2px; + margin-right: 3px; + + margin-top: 5px; + margin-bottom: 5px; + + overflow: hidden; + + position: relative; + + display: block; +} + +.thingy +{ + width: 10%; + background-color: #eee; + height: 20px; + + position: absolute; + left: 10%; +} \ No newline at end of file diff --git a/resources/[test]/example-loadscreen/loadscreen.jpg b/resources/[test]/example-loadscreen/loadscreen.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a87caee90824c660da95c362fa3e7b997e491d7a GIT binary patch literal 289433 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%0DFlw3>gEpDEEzI_p7GYrvdt~hdB586*yN4T2 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

Q2I@_wUGjdci-ET|-bx_)b1DjiJf%4zx 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 c>L`lz&en(*-p0|QgF`HxN8cHyd+md~Q+ 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%0D0yL+A8TK1=3Cqb7;?6=5ybZKG0MA9zJ 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 literal 0 HcmV?d00001 diff --git a/resources/[test]/fivem/fxmanifest.lua b/resources/[test]/fivem/fxmanifest.lua new file mode 100644 index 0000000..74201da --- /dev/null +++ b/resources/[test]/fivem/fxmanifest.lua @@ -0,0 +1,13 @@ +-- This resource is part of the default Cfx.re asset pack (cfx-server-data) +-- Altering or recreating for local use only is strongly discouraged. + +version '1.0.0' +author 'Cfx.re ' +description 'A compatibility resource to load basic-gamemode.' +repository 'https://github.com/citizenfx/cfx-server-data' + +-- compatibility wrapper +fx_version 'adamant' +game 'common' + +dependency 'basic-gamemode' diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..c987c5a --- /dev/null +++ b/run.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# save the script directory +SCRIPT=$(readlink -f "$0") +SCRIPTPATH=$(dirname "$SCRIPT") + +# run server +exec $SCRIPTPATH/alpine/opt/cfx-server/ld-musl-x86_64.so.1 \ + --library-path "$SCRIPTPATH/alpine/usr/lib/v8/:$SCRIPTPATH/alpine/lib/:$SCRIPTPATH/alpine/usr/lib/" -- \ + $SCRIPTPATH/alpine/opt/cfx-server/FXServer +set citizen_dir $SCRIPTPATH/alpine/opt/cfx-server/citizen/ $* diff --git a/server.cfg b/server.cfg new file mode 100644 index 0000000..b0740ca --- /dev/null +++ b/server.cfg @@ -0,0 +1,62 @@ +endpoint_add_tcp "0.0.0.0:30120" +endpoint_add_udp "0.0.0.0:30120" + +sv_scriptHookAllowed 0 +#set rcon_password "" + +sets tags "roleplay, bulgaria" +sets locale "bg-BG" + +#sets banner_detail "https://url.to/image.png" +#sets banner_connecting "https://url.to/image.png" + +sv_hostname "United Islands DEV" + +sets sv_projectName "United Islands" +sets sv_projectDesc "United Islands S4" +sv_enforceGameBuild 3258 +load_server_icon icon.png + +set temp_convar "hey world!" +sv_master1 "" + +add_ace group.admin command allow # allow all commands +add_ace group.admin command.quit deny # but don't allow quit +add_principal identifier.fivem:1 group.admin # add the admin to the group + +sv_maxclients 10 +set steam_webApiKey "" +sv_licenseKey cfxk_1dpnFJLVxfm1CRkj7Fp3t_35Z3DX + +set mysql_connection_string "mysql://uirp_admin:740921nlnL!@157.90.252.24/uirp?waitForConnections=true&charset=utf8mb4" +set mysql_ui true + +setr esx:locale "en" + + # Scripts +#ensure mapmanager +ensure chat +ensure spawnmanager +ensure sessionmanager +#ensure basic-gamemode +ensure hardcap +ensure rconlog + +## Add system admins +add_principal group.admin group.user +add_ace group.admin command allow # allow all commands +add_ace group.admin command.quit deny # but don't allow quit +setr illenium-appearance:locale "en" + +## Default & Standalone resources +ensure chat-theme-gtao # Cool Chat theme +ensure oxmysql + +## + +ensure [core] +ensure [addons] +ensure [models] + + + diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..cfb0332 --- /dev/null +++ b/start.sh @@ -0,0 +1,2 @@ +./run.sh +set serverProfile dev_server +set txAdminPort 50663 + diff --git a/txData/admins.json b/txData/admins.json new file mode 100644 index 0000000..92c3c57 --- /dev/null +++ b/txData/admins.json @@ -0,0 +1 @@ +[{"$schema":1,"name":"androxaaa","master":true,"password_hash":"$2a$11$IcUdxQRlSssfIcKIKo97w.kKOXQ1eO0JGd3yTitNsf7t3UYZIBvje","providers":{"citizenfx":{"id":"androxaaa","identifier":"fivem:15385361","data":{}}},"permissions":[]}] \ No newline at end of file diff --git a/txData/dev_server/config.json b/txData/dev_server/config.json new file mode 100644 index 0000000..9398aaf --- /dev/null +++ b/txData/dev_server/config.json @@ -0,0 +1,9 @@ +{ + "version": 2, + "general": { + "serverName": "UIRP-5M" + }, + "server": { + "dataPath": "/home/UIRP-Legacy" + } +} \ No newline at end of file diff --git a/txData/dev_server/data/cachedData.json b/txData/dev_server/data/cachedData.json new file mode 100644 index 0000000..3cc8018 --- /dev/null +++ b/txData/dev_server/data/cachedData.json @@ -0,0 +1 @@ +[["admin:picture:androxaaa","https://forum.cfx.re/user_avatar/forum.cfx.re/androxaaa/256/4656663_2.png"],["deployer:recipe","none"],["fxsRuntime:maxClients",10],["fxsRuntime:cfxId","j98bka"],["fxsRuntime:gameName","fivem"],["fxsRuntime:locale","bg-BG"],["fxsRuntime:projectDesc","United Islands S4"],["fxsRuntime:projectName","United Islands"],["fxsRuntime:tags","roleplay, bulgaria"]] \ No newline at end of file diff --git a/txData/dev_server/data/configChangelog.json b/txData/dev_server/data/configChangelog.json new file mode 100644 index 0000000..a6db40a --- /dev/null +++ b/txData/dev_server/data/configChangelog.json @@ -0,0 +1 @@ +{"version":1,"log":[{"author":"androxaaa","ts":1743887019515,"keys":["general.serverName"]},{"author":"androxaaa","ts":1743887065105,"keys":["server.dataPath"]},{"author":"androxaaa","ts":1743887580947,"keys":["server.dataPath"]}]} \ No newline at end of file diff --git a/txData/dev_server/data/playersDB.backup.json b/txData/dev_server/data/playersDB.backup.json new file mode 100644 index 0000000..a7ef4bb --- /dev/null +++ b/txData/dev_server/data/playersDB.backup.json @@ -0,0 +1 @@ +{"version":5,"actions":[],"players":[],"whitelistApprovals":[],"whitelistRequests":[]} \ No newline at end of file diff --git a/txData/dev_server/data/playersDB.json b/txData/dev_server/data/playersDB.json new file mode 100644 index 0000000..a7ef4bb --- /dev/null +++ b/txData/dev_server/data/playersDB.json @@ -0,0 +1 @@ +{"version":5,"actions":[],"players":[],"whitelistApprovals":[],"whitelistRequests":[]} \ No newline at end of file diff --git a/txData/dev_server/data/stats_playerDrop.json b/txData/dev_server/data/stats_playerDrop.json new file mode 100644 index 0000000..58ad2af --- /dev/null +++ b/txData/dev_server/data/stats_playerDrop.json @@ -0,0 +1 @@ +{"version":2,"lastGameVersion":"gta5:3258","lastServerVersion":"linux:12746","lastResourceList":["yarn/1.0.0","hardcap/1.0.0","sessionmanager/1.0.0","spawnmanager/1.0.0","monitor/8.0.1","chat-theme-gtao/1.0.0","rconlog/1.0.0"],"lastUnknownReasons":[],"log":[{"hour":"2025-04-05T21:00:00.000Z","changes":[],"crashTypes":[],"dropTypes":[],"resKicks":[]}]} \ No newline at end of file diff --git a/txData/dev_server/data/stats_svRuntime.json b/txData/dev_server/data/stats_svRuntime.json new file mode 100644 index 0000000..aae1b30 --- /dev/null +++ b/txData/dev_server/data/stats_svRuntime.json @@ -0,0 +1 @@ +{"version":1,"lastPerfBoundaries":[0.001,0.002,0.004,0.006,0.008,0.01,0.015,0.02,0.03,0.05,0.07,0.1,0.15,0.25,"+Inf"],"log":[{"ts":1743887066607,"type":"svClose","reason":"the server needs to be restarted, please reconnect"},{"ts":1743887445974,"type":"svBoot","duration":2},{"ts":1743887502995,"type":"data","players":0,"fxsMemory":225.19,"nodeMemory":27.110000000000582,"perf":{"svSync":{"count":7244,"sum":0.08200000000000006,"buckets":[7243,1,0,0,0,0,0,0,0,0,0,0,0,0,0]},"svNetwork":{"count":5822,"sum":0.07200000000000006,"buckets":[5822,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"svMain":{"count":862,"sum":0.4990000000000002,"buckets":[851,2,3,2,1,0,1,1,0,0,0,0,0,0,1]}}},{"ts":1743887589325,"type":"svClose","reason":"admin request"},{"ts":1743887591731,"type":"svBoot","duration":1},{"ts":1743887623010,"type":"data","players":0,"fxsMemory":167.94,"nodeMemory":19.639999999999418,"perf":{"svSync":{"count":4049,"sum":0.05800000000000004,"buckets":[4047,0,2,0,0,0,0,0,0,0,0,0,0,0,0]},"svNetwork":{"count":3255,"sum":0.05200000000000004,"buckets":[3255,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},"svMain":{"count":632,"sum":0.573,"buckets":[622,3,2,1,1,0,1,0,0,0,1,0,0,0,1]}}}]} \ No newline at end of file diff --git a/txData/dev_server/logs/admin.log b/txData/dev_server/logs/admin.log new file mode 100644 index 0000000..ab06447 --- /dev/null +++ b/txData/dev_server/logs/admin.log @@ -0,0 +1,23 @@ +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:02:31 PM +================================================================ +[21:02:59][androxaaa] created admins file +[21:03:39][androxaaa] Config changes: general.serverName +[21:03:39][androxaaa] Changing global settings via setup stepper and started Deployer. +[21:04:25][androxaaa] Config changes: server.dataPath +[21:04:25][androxaaa] Changing global/fxserver settings via setup stepper. +[21:04:26][MONITOR] Restarting server: Server process close detected. +[21:04:56][MONITOR] Restarting server: Server process close detected. +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:09:23 PM +================================================================ +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:09:55 PM +================================================================ +[21:10:01][androxaaa] logged in from 217.120.27.16 via password +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:10:43 PM +================================================================ +[21:10:51][androxaaa] logged in from 217.120.27.16 via password +[21:13:00][androxaaa] Config changes: server.dataPath +[21:13:04][androxaaa] [androxaaa] executed "RESTART SERVER" diff --git a/txData/dev_server/logs/fxserver.log b/txData/dev_server/logs/fxserver.log new file mode 100644 index 0000000..32642e7 --- /dev/null +++ b/txData/dev_server/logs/fxserver.log @@ -0,0 +1,505 @@ +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [435848] FXServer Starting - 4/5/2025, 9:04:25 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[resources:oulsen_sat] Warning: oulsen_satmap-main does not have a resource manifest (fxmanifest.lua) +[ resources] Found 66 resources. +[ resources] 1 warning was encountered. +[ svadhesive] Authenticating server license key... +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ net-tcp-server] Listening on socket failed - libuv error EADDRINUSE. +[ net-tcp-server] error on connection: address already in use +║ STDERR║ Could not bind on 0.0.0.0:30120 - is this address valid and not already in use? +[ citizen-server-impl] Error: Could not bind on 0.0.0.0:30120 - is this address valid and not already in use? +[ citizen-server-impl] +║ TXADMIN║ Restarting server: Server process close detected. + +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [435993] FXServer Starting - 4/5/2025, 9:04:31 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[resources:oulsen_sat] Warning: oulsen_satmap-main does not have a resource manifest (fxmanifest.lua) +[ resources] Found 66 resources. +[ resources] 1 warning was encountered. +[ svadhesive] Authenticating server license key... +║ TXADMIN║ txaReportResources +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ net-tcp-server] Listening on socket failed - libuv error EADDRINUSE. +[ net-tcp-server] error on connection: address already in use +║ STDERR║ Could not bind on 0.0.0.0:30120 - is this address valid and not already in use? +[ citizen-server-impl] Error: Could not bind on 0.0.0.0:30120 - is this address valid and not already in use? +[ citizen-server-impl] +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [1646] FXServer Starting - 4/5/2025, 9:09:23 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[resources:oulsen_sat] Warning: oulsen_satmap-main does not have a resource manifest (fxmanifest.lua) +[ resources] Found 66 resources. +[ resources] 1 warning was encountered. +[ svadhesive] Authenticating server license key... +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ c-scripting-core] Creating script environments for yarn +[ resources] Started resource yarn +[ c-scripting-core] Creating script environments for webpack +[ resources] Started resource webpack +[ c-scripting-core] Creating script environments for chat +[ resources] Started resource chat +[ resources] Started resource spawnmanager +[ c-scripting-core] Creating script environments for hardcap +[ resources] Started resource hardcap +[ c-scripting-core] Creating script environments for rconlog +[ resources] Started resource rconlog +[ resources] Started resource chat-theme-gtao +[ c-scripting-core] Creating script environments for oxmysql +[ resources] Started resource oxmysql +[ c-scripting-core] Creating script environments for ui_core +[ resources] Started resource ui_core +[ c-scripting-core] Creating script environments for ox_lib +[ resources] Started resource ox_lib +[ c-scripting-core] Creating script environments for illenium-appearance +[ resources] Started resource illenium-appearance +[ c-scripting-core] Creating script environments for PolyZone +[ resources] Started resource PolyZone +[ c-scripting-core] Creating script environments for cron +[ resources] Started resource cron +[ c-scripting-core] Creating script environments for ox_inventory +[ resources] Started resource ox_inventory +[ c-scripting-core] Creating script environments for pma-voice +[ resources] Started resource pma-voice +[ c-scripting-core] Creating script environments for screenshot-basic +[ resources] Started resource screenshot-basic +[ c-scripting-core] Creating script environments for ui-base +[ resources] Started resource ui-base +[ c-scripting-core] Creating script environments for ui_context +[ resources] Started resource ui_context +[ c-scripting-core] Creating script environments for ui_hud +[ resources] Started resource ui_hud +[ c-scripting-core] Creating script environments for ui_identity +[ resources] Started resource ui_identity +[resources:ui_loading] Warning: could not find file `img/*.png` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.jpg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.svg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.webp` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `js/jquery.min.js` (defined in fxmanifest.lua:14) +[ resources] Started resource ui_loading (5 warnings) +[ c-scripting-core] Creating script environments for ui_multicharacter +[ resources] Started resource ui_multicharacter +[ c-scripting-core] Creating script environments for ui_notify +[ resources] Started resource ui_notify +[ c-scripting-core] Creating script environments for ui_pmenu +[ resources] Started resource ui_pmenu +[ c-scripting-core] Creating script environments for ui_progressbar +[ resources] Started resource ui_progressbar +[ c-scripting-core] Creating script environments for ui_textui +[ resources] Started resource ui_textui +[ c-scripting-core] Creating script environments for xsound +[ resources] Started resource xsound +[ resources] Started resource bob74_ipl +[ resources] Started resource ui-bodyremaster +[ resources] Started resource ui-faceremaster +[ resources] Started resource ui-pressence +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_furn.ydr uses 40.0 MiB of physical memory. +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_shell.ydr uses 42.0 MiB of physical memory. +[ resources] Started resource Airport_Pegasus_LSIA (2 warnings) +[ c-scripting-core] Creating script environments for AutoExotic +[ script:AutoExotic] Map successfully loaded +[resources:AutoExotic] Asset AutoExotic/as_autoexotic_txt.ytd uses 22.5 MiB of physical memory. +[ resources] Started resource AutoExotic (1 warning) +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_shell.ydr uses 24.0 MiB of physical memory. +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_stairs.ydr uses 24.0 MiB of physical memory. +[ resources] Started resource TiboMLO_appart1 (2 warnings) +[ resources] Started resource ajaxon_aldore_hospital +[ resources] Started resource ajaxon_mapdata +[resources:bmwg07:str] Asset bmwg07/bmwg07.ytd uses 31.8 MiB of physical memory. +[resources:bmwg07:str] Asset bmwg07/bmwg07_hi.yft uses 16.7 MiB of virtual memory. +[ resources] Started resource bmwg07 (2 warnings) +[ resources] Started resource dev_warehouse +[ resources] Started resource expolregent +[ resources] Started resource expolscout +[resources:m5g60:stre] Asset m5g60/m5g60.yft uses 23.8 MiB of virtual memory. +[resources:m5g60:stre] Asset m5g60/m5g60.ytd uses 62.0 MiB of physical memory. Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering). +[resources:m5g60:stre] Asset m5g60/m5g60_hi.yft uses 20.2 MiB of virtual memory. +[ resources] Started resource m5g60 (3 warnings) +[ resources] Started resource moreo_parkings +[ resources] Started resource uf_fleecabank +[ resources] Started resource uf_mapdata +[ c-scripting-core] Creating script environments for ui-postals +[ resources] Started resource ui-postals +[ citizen-server-main] Warning: The players.json endpoint has been modified to no longer return the player identifiers without authentication. +[ citizen-server-main] To learn more about this change read our announcement at https://forum.cfx.re/t/celebrating-one-year-with-rockstar-games/5269938#fivem-and-redm-6 +[ citizen-server-impl] server thread hitch warning: timer interval of 278 milliseconds +[ citizen-server-impl] server thread hitch warning: timer interval of 235 milliseconds +[ script:ox_lib] An update is available for ox_lib (current version: 3.30.3) +[ script:ox_lib] https://github.com/overextended/ox_lib/releases/tag/v3.30.5 +[ citizen-server-impl] fff +[ citizen-server-impl] cccc ff xx xx rr rr eee +[ citizen-server-impl] cc ffff xx rrr r ee e +[ citizen-server-impl] cc ff xx ... rr eeeee +[ citizen-server-impl] ccccc ff xx xx ... rr eeeee +[ citizen-server-impl] +[ citizen-server-impl] Authenticated with cfx.re Nucleus: https://androxaaa-j98bka.users.cfx.re/ +[ script:oxmysql] An update is available for oxmysql (current version: 2.11.2) +[ script:oxmysql] https://github.com/overextended/oxmysql/releases/tag/v2.13.0 +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] Database server connection established! +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ui_core took 404.3496ms to execute a query! +[ script:oxmysql] SELECT * FROM jobs [] +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ox_inventory took 404.3755ms to execute a query! +[ script:oxmysql] INSERT IGNORE INTO `licenses` (`type`, `label`) VALUES (?, ?) ["weapon","Weapon License"] +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ox_inventory took 406.1546ms to execute a query! +[ script:oxmysql] SELECT * FROM items [] +[ script:ox_inventory] [ox_inventory] [INFO] Database contains 48 items. +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ox_inventory took 410.7532ms to execute a query! +[ script:oxmysql] SELECT 1 FROM ox_inventory [] +[ citizen-server-impl] server thread hitch warning: timer interval of 409 milliseconds +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ui_core took 1493.3304ms to execute a query! +[ script:oxmysql] SELECT * FROM job_grades [] +[ script:ui_core] [^ui_core] ^CORE 1.10.8 initialized! +[ citizen-server-impl] server thread hitch warning: timer interval of 1488 milliseconds +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ox_inventory took 1831.7853ms to execute a query! +[ script:oxmysql] SHOW COLUMNS FROM `owned_vehicles` [] +[ citizen-server-impl] server thread hitch warning: timer interval of 345 milliseconds +[ citizen-server-impl] server thread hitch warning: timer interval of 343 milliseconds +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] ox_inventory took 344.8398ms to execute a query! +[ script:oxmysql] SELECT inventory FROM `users` [] +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [2071] FXServer Starting - 4/5/2025, 9:09:55 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[resources:oulsen_sat] Warning: oulsen_satmap-main does not have a resource manifest (fxmanifest.lua) +[ resources] Found 66 resources. +[ resources] 1 warning was encountered. +[ svadhesive] Authenticating server license key... +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ c-scripting-core] Creating script environments for yarn +[ resources] Started resource yarn +[ c-scripting-core] Creating script environments for webpack +[ resources] Started resource webpack +[ c-scripting-core] Creating script environments for chat +[ resources] Started resource chat +[ resources] Started resource spawnmanager +[ c-scripting-core] Creating script environments for hardcap +[ resources] Started resource hardcap +[ c-scripting-core] Creating script environments for rconlog +[ resources] Started resource rconlog +[ resources] Started resource chat-theme-gtao +[ c-scripting-core] Creating script environments for oxmysql +[ resources] Started resource oxmysql +[ c-scripting-core] Creating script environments for ui_core +[ resources] Started resource ui_core +[ c-scripting-core] Creating script environments for ox_lib +[ resources] Started resource ox_lib +[ c-scripting-core] Creating script environments for illenium-appearance +[ resources] Started resource illenium-appearance +[ c-scripting-core] Creating script environments for PolyZone +[ resources] Started resource PolyZone +[ c-scripting-core] Creating script environments for cron +[ resources] Started resource cron +[ c-scripting-core] Creating script environments for ox_inventory +[ resources] Started resource ox_inventory +[ c-scripting-core] Creating script environments for pma-voice +[ resources] Started resource pma-voice +[ c-scripting-core] Creating script environments for screenshot-basic +[ resources] Started resource screenshot-basic +[ c-scripting-core] Creating script environments for ui-base +[ resources] Started resource ui-base +[ c-scripting-core] Creating script environments for ui_context +[ resources] Started resource ui_context +[ c-scripting-core] Creating script environments for ui_hud +[ resources] Started resource ui_hud +[ c-scripting-core] Creating script environments for ui_identity +[ resources] Started resource ui_identity +[resources:ui_loading] Warning: could not find file `img/*.png` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.jpg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.svg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.webp` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `js/jquery.min.js` (defined in fxmanifest.lua:14) +[ resources] Started resource ui_loading (5 warnings) +[ c-scripting-core] Creating script environments for ui_multicharacter +[ resources] Started resource ui_multicharacter +[ c-scripting-core] Creating script environments for ui_notify +[ resources] Started resource ui_notify +[ c-scripting-core] Creating script environments for ui_pmenu +[ resources] Started resource ui_pmenu +[ c-scripting-core] Creating script environments for ui_progressbar +[ resources] Started resource ui_progressbar +[ c-scripting-core] Creating script environments for ui_textui +[ resources] Started resource ui_textui +[ c-scripting-core] Creating script environments for xsound +[ resources] Started resource xsound +[ resources] Started resource bob74_ipl +[ resources] Started resource ui-bodyremaster +[ resources] Started resource ui-faceremaster +[ resources] Started resource ui-pressence +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_furn.ydr uses 40.0 MiB of physical memory. +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_shell.ydr uses 42.0 MiB of physical memory. +[ resources] Started resource Airport_Pegasus_LSIA (2 warnings) +[ c-scripting-core] Creating script environments for AutoExotic +[ script:AutoExotic] Map successfully loaded +[resources:AutoExotic] Asset AutoExotic/as_autoexotic_txt.ytd uses 22.5 MiB of physical memory. +[ resources] Started resource AutoExotic (1 warning) +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_shell.ydr uses 24.0 MiB of physical memory. +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_stairs.ydr uses 24.0 MiB of physical memory. +[ resources] Started resource TiboMLO_appart1 (2 warnings) +[ resources] Started resource ajaxon_aldore_hospital +[ resources] Started resource ajaxon_mapdata +[resources:bmwg07:str] Asset bmwg07/bmwg07.ytd uses 31.8 MiB of physical memory. +[resources:bmwg07:str] Asset bmwg07/bmwg07_hi.yft uses 16.7 MiB of virtual memory. +[ resources] Started resource bmwg07 (2 warnings) +[ resources] Started resource dev_warehouse +[ resources] Started resource expolregent +[ resources] Started resource expolscout +[resources:m5g60:stre] Asset m5g60/m5g60.yft uses 23.8 MiB of virtual memory. +[resources:m5g60:stre] Asset m5g60/m5g60.ytd uses 62.0 MiB of physical memory. Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering). +[resources:m5g60:stre] Asset m5g60/m5g60_hi.yft uses 20.2 MiB of virtual memory. +[ resources] Started resource m5g60 (3 warnings) +[ resources] Started resource moreo_parkings +[ resources] Started resource uf_fleecabank +[ resources] Started resource uf_mapdata +[ c-scripting-core] Creating script environments for ui-postals +[ resources] Started resource ui-postals +[ citizen-server-main] Warning: The players.json endpoint has been modified to no longer return the player identifiers without authentication. +[ citizen-server-main] To learn more about this change read our announcement at https://forum.cfx.re/t/celebrating-one-year-with-rockstar-games/5269938#fivem-and-redm-6 +[ citizen-server-impl] server thread hitch warning: timer interval of 263 milliseconds +[ citizen-server-impl] fff +[ citizen-server-impl] cccc ff xx xx rr rr eee +[ citizen-server-impl] cc ffff xx rrr r ee e +[ citizen-server-impl] cc ff xx ... rr eeeee +[ citizen-server-impl] ccccc ff xx xx ... rr eeeee +[ citizen-server-impl] +[ citizen-server-impl] Authenticated with cfx.re Nucleus: https://androxaaa-j98bka.users.cfx.re/ +[ citizen-server-impl] server thread hitch warning: timer interval of 243 milliseconds +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] Database server connection established! +[ script:ox_inventory] [ox_inventory] [INFO] Database contains 48 items. +[ script:ui_core] [^ui_core] ^CORE 1.10.8 initialized! +[ script:oxmysql] An update is available for oxmysql (current version: 2.11.2) +[ script:oxmysql] https://github.com/overextended/oxmysql/releases/tag/v2.13.0 +[ citizen-server-impl] server thread hitch warning: timer interval of 449 milliseconds +[ script:ox_lib] An update is available for ox_lib (current version: 3.30.3) +[ script:ox_lib] https://github.com/overextended/ox_lib/releases/tag/v3.30.5 +[ citizen-server-impl] server thread hitch warning: timer interval of 383 milliseconds +[ citizen-server-impl] server thread hitch warning: timer interval of 1035 milliseconds +[ script:ox_inventory] [ox_inventory] [INFO] Inventory has loaded 262 items +[ citizen-server-impl] server thread hitch warning: timer interval of 679 milliseconds +║ TXADMIN║ txaReportResources +[ citizen-server-impl] server thread hitch warning: timer interval of 11962 milliseconds +[ script:monitor] [txAdmin] Sending resources list to txAdmin. +[ citizen-server-impl] server thread hitch warning: timer interval of 228 milliseconds +[ citizen-server-main] -> Quitting: SIGINT received +[ citizen-server-main] -> Quitting: host shutting down +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [2570] FXServer Starting - 4/5/2025, 9:10:43 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[resources:oulsen_sat] Warning: oulsen_satmap-main does not have a resource manifest (fxmanifest.lua) +[ resources] Found 66 resources. +[ resources] 1 warning was encountered. +[ svadhesive] Authenticating server license key... +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ c-scripting-core] Creating script environments for yarn +[ resources] Started resource yarn +[ c-scripting-core] Creating script environments for webpack +[ resources] Started resource webpack +[ c-scripting-core] Creating script environments for chat +[ resources] Started resource chat +[ resources] Started resource spawnmanager +[ c-scripting-core] Creating script environments for hardcap +[ resources] Started resource hardcap +[ c-scripting-core] Creating script environments for rconlog +[ resources] Started resource rconlog +[ resources] Started resource chat-theme-gtao +[ c-scripting-core] Creating script environments for oxmysql +[ resources] Started resource oxmysql +[ c-scripting-core] Creating script environments for ui_core +[ resources] Started resource ui_core +[ c-scripting-core] Creating script environments for ox_lib +[ resources] Started resource ox_lib +[ c-scripting-core] Creating script environments for illenium-appearance +[ resources] Started resource illenium-appearance +[ c-scripting-core] Creating script environments for PolyZone +[ resources] Started resource PolyZone +[ c-scripting-core] Creating script environments for cron +[ resources] Started resource cron +[ c-scripting-core] Creating script environments for ox_inventory +[ resources] Started resource ox_inventory +[ c-scripting-core] Creating script environments for pma-voice +[ resources] Started resource pma-voice +[ c-scripting-core] Creating script environments for screenshot-basic +[ resources] Started resource screenshot-basic +[ c-scripting-core] Creating script environments for ui-base +[ resources] Started resource ui-base +[ c-scripting-core] Creating script environments for ui_context +[ resources] Started resource ui_context +[ c-scripting-core] Creating script environments for ui_hud +[ resources] Started resource ui_hud +[ c-scripting-core] Creating script environments for ui_identity +[ resources] Started resource ui_identity +[resources:ui_loading] Warning: could not find file `img/*.png` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.jpg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.svg` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `img/*.webp` (defined in fxmanifest.lua:14) +[resources:ui_loading] Warning: could not find file `js/jquery.min.js` (defined in fxmanifest.lua:14) +[ resources] Started resource ui_loading (5 warnings) +[ c-scripting-core] Creating script environments for ui_multicharacter +[ resources] Started resource ui_multicharacter +[ c-scripting-core] Creating script environments for ui_notify +[ resources] Started resource ui_notify +[ c-scripting-core] Creating script environments for ui_pmenu +[ resources] Started resource ui_pmenu +[ c-scripting-core] Creating script environments for ui_progressbar +[ resources] Started resource ui_progressbar +[ c-scripting-core] Creating script environments for ui_textui +[ resources] Started resource ui_textui +[ c-scripting-core] Creating script environments for xsound +[ resources] Started resource xsound +[ resources] Started resource bob74_ipl +[ resources] Started resource ui-bodyremaster +[ resources] Started resource ui-faceremaster +[ resources] Started resource ui-pressence +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_furn.ydr uses 40.0 MiB of physical memory. +[resources:Airport_Pe] Asset Airport_Pegasus_LSIA/t_aircraft_dealership_shell.ydr uses 42.0 MiB of physical memory. +[ resources] Started resource Airport_Pegasus_LSIA (2 warnings) +[ c-scripting-core] Creating script environments for AutoExotic +[ script:AutoExotic] Map successfully loaded +[resources:AutoExotic] Asset AutoExotic/as_autoexotic_txt.ytd uses 22.5 MiB of physical memory. +[ resources] Started resource AutoExotic (1 warning) +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_shell.ydr uses 24.0 MiB of physical memory. +[resources:TiboMLO_ap] Asset TiboMLO_appart1/appart_stairs.ydr uses 24.0 MiB of physical memory. +[ resources] Started resource TiboMLO_appart1 (2 warnings) +[ resources] Started resource ajaxon_aldore_hospital +[ resources] Started resource ajaxon_mapdata +[resources:bmwg07:str] Asset bmwg07/bmwg07.ytd uses 31.8 MiB of physical memory. +[resources:bmwg07:str] Asset bmwg07/bmwg07_hi.yft uses 16.7 MiB of virtual memory. +[ resources] Started resource bmwg07 (2 warnings) +[ resources] Started resource dev_warehouse +[ resources] Started resource expolregent +[ resources] Started resource expolscout +[resources:m5g60:stre] Asset m5g60/m5g60.yft uses 23.8 MiB of virtual memory. +[resources:m5g60:stre] Asset m5g60/m5g60.ytd uses 62.0 MiB of physical memory. Oversized assets can and WILL lead to streaming issues (such as models not loading/rendering). +[resources:m5g60:stre] Asset m5g60/m5g60_hi.yft uses 20.2 MiB of virtual memory. +[ resources] Started resource m5g60 (3 warnings) +[ resources] Started resource moreo_parkings +[ resources] Started resource uf_fleecabank +[ resources] Started resource uf_mapdata +[ c-scripting-core] Creating script environments for ui-postals +[ resources] Started resource ui-postals +[ citizen-server-main] Warning: The players.json endpoint has been modified to no longer return the player identifiers without authentication. +[ citizen-server-main] To learn more about this change read our announcement at https://forum.cfx.re/t/celebrating-one-year-with-rockstar-games/5269938#fivem-and-redm-6 +[ citizen-server-impl] server thread hitch warning: timer interval of 299 milliseconds +[ citizen-server-impl] fff +[ citizen-server-impl] cccc ff xx xx rr rr eee +[ citizen-server-impl] cc ffff xx rrr r ee e +[ citizen-server-impl] cc ff xx ... rr eeeee +[ citizen-server-impl] ccccc ff xx xx ... rr eeeee +[ citizen-server-impl] +[ citizen-server-impl] Authenticated with cfx.re Nucleus: https://androxaaa-j98bka.users.cfx.re/ +[ citizen-server-impl] server thread hitch warning: timer interval of 229 milliseconds +[ script:oxmysql] [8.0.41-0ubuntu0.24.04.1] Database server connection established! +[ script:ox_inventory] [ox_inventory] [INFO] Database contains 48 items. +[ script:ui_core] [^ui_core] ^CORE 1.10.8 initialized! +[ script:oxmysql] An update is available for oxmysql (current version: 2.11.2) +[ script:oxmysql] https://github.com/overextended/oxmysql/releases/tag/v2.13.0 +[ citizen-server-impl] server thread hitch warning: timer interval of 809 milliseconds +[ script:ox_lib] An update is available for ox_lib (current version: 3.30.3) +[ script:ox_lib] https://github.com/overextended/ox_lib/releases/tag/v3.30.5 +[ citizen-server-impl] server thread hitch warning: timer interval of 1388 milliseconds +[ script:ox_inventory] [ox_inventory] [INFO] Inventory has loaded 262 items +[ citizen-server-impl] server thread hitch warning: timer interval of 337 milliseconds +[ citizen-server-impl] server thread hitch warning: timer interval of 11142 milliseconds +[ citizen-server-impl] server thread hitch warning: timer interval of 299 milliseconds +║ TXADMIN║ txaEvent "serverShuttingDown" "{\"delay\":5000,\"author\":\"androxaaa\",\"message\":\"Server restarting (admin request).\"}" +[ script:monitor] [txAdmin] Server shutting down. Kicking all players. + +║ TXADMIN║ ================================================================ +║ TXADMIN║ ======== [2988] FXServer Starting - 4/5/2025, 9:13:09 PM +║ TXADMIN║ ================================================================ +[ resources] Scanning resources. +[ resources] Found 25 resources. +[ svadhesive] Authenticating server license key... +[ svadhesive] Server license key authentication succeeded. Welcome! +[ c-scripting-core] Creating script environments for sessionmanager +║ STDERR║ Stack overflow in unmanaged: IP: 0x7de4973c0f7f, fault addr: 0x7fffe0169fb0 +[ resources] Started resource sessionmanager +[ c-scripting-core] Creating script environments for monitor +[ script:monitor] [txAdmin] Resource v8.0.1 threads and commands set up. All Ready. +[ resources] Started resource monitor +[ citizen-server-impl] Could not open icon.png for reading. +[ c-scripting-core] Creating script environments for yarn +[ resources] Started resource yarn +[ citizen-server-impl] Running build tasks on resource webpack - it'll restart once completed. +[ c-resources-core] Could not start dependency webpack for resource chat. +[ citizen-server-impl] Couldn't start resource chat. +[ resources] Started resource spawnmanager +[ c-scripting-core] Creating script environments for hardcap +[ resources] Started resource hardcap +[ c-scripting-core] Creating script environments for rconlog +[ resources] Started resource rconlog +[ resources] Started resource chat-theme-gtao +[ citizen-server-impl] Couldn't find resource oxmysql. +[ citizen-server-impl] Couldn't find resource category [core]. +[ citizen-server-impl] Couldn't find resource category [addons]. +[ citizen-server-impl] Couldn't find resource category [models]. +[ citizen-server-main] Warning: The players.json endpoint has been modified to no longer return the player identifiers without authentication. +[ citizen-server-main] To learn more about this change read our announcement at https://forum.cfx.re/t/celebrating-one-year-with-rockstar-games/5269938#fivem-and-redm-6 +[ citizen-server-impl] fff +[ citizen-server-impl] cccc ff xx xx rr rr eee +[ citizen-server-impl] cc ffff xx rrr r ee e +[ citizen-server-impl] cc ff xx ... rr eeeee +[ citizen-server-impl] ccccc ff xx xx ... rr eeeee +[ citizen-server-impl] +[ citizen-server-impl] Authenticated with cfx.re Nucleus: https://androxaaa-j98bka.users.cfx.re/ +[ script:yarn] [yarn] yarn install v1.22.5 +[ script:yarn] [yarn] [1/4] Resolving packages... +[ script:yarn] [yarn] [2/4] Fetching packages... +[ script:yarn] [yarn] info fsevents@2.3.1: The platform "linux" is incompatible with this module. +[ script:yarn] [yarn] info "fsevents@2.3.1" is an optional dependency and failed compatibility check. Excluding it from installation. +[ script:yarn] [yarn] info fsevents@1.2.13: The platform "linux" is incompatible with this module. +[ script:yarn] info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation. +[ script:yarn] [yarn] [3/4] Linking dependencies... +[ script:yarn] [yarn] [4/4] Building fresh packages... +[ script:yarn] Error: [yarn] warning Ignored scripts due to flag. +[ script:yarn] [yarn] Done in 3.77s. +[ citizen-server-impl] Build tasks completed - starting resource webpack. +[ c-scripting-core] Creating script environments for webpack +[ citizen-server-impl] Running build tasks on resource chat - it'll restart once completed. +[ resources] Started resource webpack +[ script:yarn] [yarn] yarn install v1.22.5 +[ script:yarn] [yarn] [1/4] Resolving packages... +[ script:yarn] [yarn] [2/4] Fetching packages... +[ citizen-server-impl] server thread hitch warning: timer interval of 274 milliseconds +[ script:yarn] [yarn] info fsevents@1.2.11: The platform "linux" is incompatible with this module. +[ script:yarn] [yarn] info "fsevents@1.2.11" is an optional dependency and failed compatibility check. Excluding it from installation. +[ script:yarn] [yarn] [3/4] Linking dependencies... +[ script:yarn] [yarn] [4/4] Building fresh packages... +[ script:yarn] Error: [yarn] warning Ignored scripts due to flag. +[ script:yarn] [yarn] Done in 6.57s. +[ script:webpack] chat: started building webpack.config.js +[ citizen-server-impl] server thread hitch warning: timer interval of 398 milliseconds +[ script:webpack] chat: built webpack.config.js +[ citizen-server-impl] Build tasks completed - starting resource chat. +[ c-scripting-core] Creating script environments for chat +[ resources] Started resource chat diff --git a/txData/dev_server/logs/server.log b/txData/dev_server/logs/server.log new file mode 100644 index 0000000..e11b917 --- /dev/null +++ b/txData/dev_server/logs/server.log @@ -0,0 +1,16 @@ +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:02:31 PM +================================================================ +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:09:23 PM +================================================================ +[9:09:29 PM] txAdmin: Logger started +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:09:55 PM +================================================================ +[9:09:58 PM] txAdmin: Logger started +================================================================ +======== txAdmin v8.0.1 atop fxserver 12746 Starting - 4/5/2025, 9:10:43 PM +================================================================ +[9:10:46 PM] txAdmin: Logger started +[9:13:11 PM] txAdmin: Logger started