From 753732a007882cc59b1c5da6d4279edfd9e0e01d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 4 Jul 2023 17:07:21 +0200 Subject: [PATCH] Squashed commit of the following: commit b4f616a2c9067223432e79d6083f75343d40b4e3 Author: bunsenstraat Date: Tue Jul 4 17:02:29 2023 +0200 fix bash commit 50b5f5083d7b60e70afe1985b4ff655b06e78cc7 Author: bunsenstraat Date: Tue Jul 4 16:10:27 2023 +0200 bash commit dffa78e3dc1815e9aa006bacf9a84df6eb3114b1 Author: bunsenstraat Date: Tue Jul 4 15:10:28 2023 +0200 shells commit f34a4e394e3c0591e3eb7ebd8fa2787b38b1c3f2 Author: bunsenstraat Date: Tue Jul 4 14:26:48 2023 +0200 update readme commit f53cba9205cb6a3443bbdcdea0ccdf70c98aec8d Author: bunsenstraat Date: Tue Jul 4 14:18:57 2023 +0200 static commit 897e81246fbe3f9194b6e99850029ad00d6bbdab Author: bunsenstraat Date: Tue Jul 4 14:01:07 2023 +0200 Update README.md commit 5d7e112a35e5a8e6a103f29b3e5256fdb3029cdf Author: bunsenstraat Date: Tue Jul 4 13:56:34 2023 +0200 rm txt file commit 0d77e68ddf6865352b43e64124d2bff542b9baa0 Author: bunsenstraat Date: Tue Jul 4 13:55:40 2023 +0200 add readme commit b7f59b65ac3daed3930f89a3540c8c34f1515dd0 Author: bunsenstraat Date: Tue Jul 4 13:54:52 2023 +0200 fix glob commit 962395926e7a58726f03ee4eb9d90f7b48c694b3 Author: filip mertens Date: Tue Jul 4 12:50:44 2023 +0200 fix modals commit 3e610699ccd3aba2daa46d285e96fb45ad7b187d Author: filip mertens Date: Tue Jul 4 12:18:01 2023 +0200 commits commit c0cc7328eff406ebafbc5cb269d826e6662c882f Author: filip mertens Date: Tue Jul 4 10:57:11 2023 +0200 fix class commit d2eea4eea2dd4a039734827cad8706d2d79bff2f Author: filip mertens Date: Tue Jul 4 10:39:53 2023 +0200 linting commit 673258ef87ef8dab9b524eedd13603a996188cdb Author: filip mertens Date: Tue Jul 4 10:11:57 2023 +0200 filter commit 0257e2928ecd34b81573ac285aa5eadcad041a6e Author: filip mertens Date: Tue Jul 4 10:10:13 2023 +0200 ci filter commit 329de0d339bba0e86b699c14b12c394224a073c8 Author: filip mertens Date: Tue Jul 4 10:06:40 2023 +0200 fix lint commit 29abc4076e7b58b40e1890905d9e7fe49d1afad0 Author: filip mertens Date: Tue Jul 4 09:27:31 2023 +0200 install yarn commit 366fd4969e1510024bc32c86e987b6c0b5231057 Author: filip mertens Date: Mon Jul 3 17:33:56 2023 +0200 yarn commit ea7e69faa32ea9db3e1f68348448e82f1b4a44ac Author: filip mertens Date: Mon Jul 3 16:52:08 2023 +0200 console commit 3b6561c488a98d5ab165ae606e8ae0700cdc3ccd Author: filip mertens Date: Mon Jul 3 16:51:44 2023 +0200 consoles commit 57ef21ab9411de2c1afb9b0b8db9d318933697b4 Author: filip mertens Date: Mon Jul 3 16:50:20 2023 +0200 consoles commit 867b9775c01d2b7431bdc7711db289fb20f7bcb3 Author: filip mertens Date: Mon Jul 3 16:49:54 2023 +0200 consoles commit a2dc8b996a11079435edd98e6dade391466552b7 Author: filip mertens Date: Mon Jul 3 16:47:14 2023 +0200 rm lock commit bc6d4d23a37bbc4ad23ccb31bb88c90fd847ceb0 Author: filip mertens Date: Mon Jul 3 16:46:16 2023 +0200 restore libs commit 1a76ab87ba499892a8625ed4eb26ddcb1392b0e7 Author: filip mertens Date: Mon Jul 3 16:44:40 2023 +0200 fix git commit 870083ff49893c67a11dd01b485e1132ac530367 Author: filip mertens Date: Mon Jul 3 16:29:33 2023 +0200 typo commit 8987d73d201c345a85e5e16e5af7c8f16c05ae3f Author: filip mertens Date: Mon Jul 3 16:26:14 2023 +0200 can use worker commit 6045655cd2bb601e32dba4d0bdfa41e431bdff67 Author: filip mertens Date: Mon Jul 3 16:26:07 2023 +0200 can use worker commit 5ee444e0307839bfa55f5e16a663b8a82f2f4f61 Author: filip mertens Date: Mon Jul 3 16:13:38 2023 +0200 cleanup package commit 7f5f0bfd37706ca436f7d9cc6485d0316d79ec4c Author: filip mertens Date: Mon Jul 3 16:10:01 2023 +0200 fix lib commit 1d97df570ca4722f4f68137647823a9bb9f641de Author: filip mertens Date: Mon Jul 3 16:05:26 2023 +0200 rm test app commit 0483d13e5675a0ed09da1cabfc3f1e9202bf6e62 Author: filip mertens Date: Mon Jul 3 16:03:17 2023 +0200 logs commit 8edd1925b7a3afa41921b44290a6d74224dda2b2 Author: filip mertens Date: Wed Jun 28 19:53:27 2023 +0200 debugger commit 16f337a2d77c8a47effd362fcfd9bb9fcec9f523 Author: filip mertens Date: Wed Jun 28 16:36:44 2023 +0200 fix env shell commit 35a76905911d8c5efc65793c9db5850f73e64402 Author: filip mertens Date: Wed Jun 28 16:15:54 2023 +0200 terminal menu commit 12c089407998e1359a058ed8a718beb1200b84b5 Author: filip mertens Date: Wed Jun 28 13:26:23 2023 +0200 custom components commit 731aecd556cf16aab8f2ad25c38ef95b229e8b70 Author: filip mertens Date: Wed Jun 28 12:39:36 2023 +0200 terminals commit 297c476b2191723fcb2e3ba524bf29a4739d74e0 Author: filip mertens Date: Wed Jun 28 12:39:32 2023 +0200 terminals commit aeebd08602aa62ef4b68e6ed98ab639824664011 Author: filip mertens Date: Tue Jun 27 15:57:26 2023 +0200 bugfix commit c104f7056a605f39d39f1273676d068e1bfed8f6 Author: filip mertens Date: Tue Jun 27 15:54:07 2023 +0200 rm ripgrep commit 9c3283c017a7e4e5e734badcd3c47e09dac29f4f Author: filip mertens Date: Tue Jun 27 15:01:41 2023 +0200 xterm panels commit e0a2f62f710debc030a793322a5033d6e5ffa266 Author: bunsenstraat Date: Tue Jun 27 13:51:09 2023 +0200 terminals commit 1607d4a586382a4fbe7eff19aec50167a8ea4c3c Author: bunsenstraat Date: Tue Jun 27 13:02:36 2023 +0200 pre18 commit f4e3dfc01d210633050b9b745ed974f2307fe7f0 Author: bunsenstraat Date: Tue Jun 27 12:29:16 2023 +0200 xterm build commit cb32ecbd3108a6d169bd7a2e5bb2d95f43e00712 Author: filip mertens Date: Tue Jun 27 10:21:47 2023 +0200 ripgrep tests commit ee56ee6a0ee6d25ba9922760d8f350ab5463bda2 Author: filip mertens Date: Tue Jun 27 08:41:05 2023 +0200 machine image commit f5bdd715ce7dca0173c2841bb29f705fff0375a2 Author: filip mertens Date: Tue Jun 27 08:34:32 2023 +0200 14.17.6 commit 5af1131851a62c6c88186189d51f151b95e83369 Author: filip mertens Date: Tue Jun 27 08:26:58 2023 +0200 add orb commit 6897b22cad3e95a7ad6d6688f97294caaa9ba605 Author: filip mertens Date: Tue Jun 27 08:25:06 2023 +0200 node install commit 84e58d7ad075295e0e2b85112911ac4b3b067333 Author: filip mertens Date: Tue Jun 27 08:21:03 2023 +0200 18.04 commit 716e39f00f92298c998bbcae6e22a6f39ecdf386 Author: filip mertens Date: Tue Jun 27 08:12:05 2023 +0200 docker commit 26006c6e2aedb5286508746531697e45475a7a7a Author: filip mertens Date: Tue Jun 27 08:04:35 2023 +0200 typo commit 48444e18bf33d501a46f9dc72ac4dc8df675b7e1 Author: filip mertens Date: Tue Jun 27 08:03:13 2023 +0200 machine commit bf007bb1d150f47969cbe1c53be8ac45dd44eaa6 Author: filip mertens Date: Tue Jun 27 08:01:54 2023 +0200 electronuserland/builder:14 commit 80e367e82732a346a7c3761a10f7a0a28366318a Author: filip mertens Date: Tue Jun 27 07:56:17 2023 +0200 current commit fcc036660006b8f3d1f7971d5be8ad35ad72ab08 Author: filip mertens Date: Tue Jun 27 07:52:28 2023 +0200 run commit 5a76be67fa8d37a8e1fb9918623781394b2dde6b Author: filip mertens Date: Tue Jun 27 07:51:20 2023 +0200 linux commit 3b04e0df7c3dc2c8de21a75f7c23ea0e0c788546 Author: bunsenstraat Date: Mon Jun 26 18:06:15 2023 +0200 ripgrep commit f9277301715d90b07cc30117428ab1ad2c5ca004 Author: filip mertens Date: Mon Jun 26 17:26:36 2023 +0200 fixes for git commit e5ec564b1ea750844c2c230e34e954685b503d1d Author: bunsenstraat Date: Mon Jun 26 12:11:29 2023 +0200 git fixes commit cc3d9ea5fb202e3ce865775628d85ae1a8635086 Author: bunsenstraat Date: Sun Jun 25 17:30:19 2023 +0200 less logs commit dc8cf19bf1592d19e221d79d6d22bcfb74678a12 Author: bunsenstraat Date: Sun Jun 25 16:51:27 2023 +0200 use native git commit fe86f5927bb51e30bebd050b331f6890ad69e459 Author: bunsenstraat Date: Sun Jun 25 14:27:19 2023 +0200 icon commit 76244314f454864a971c49730dfae67a46a49958 Author: bunsenstraat Date: Sun Jun 25 14:10:51 2023 +0200 no asar commit f31ac8e008d106cb2facd677bd67101a7f135670 Author: bunsenstraat Date: Sun Jun 25 13:51:41 2023 +0200 linux fields commit 30c186d20b4f383c373540d1d29ab194124dcc63 Author: bunsenstraat Date: Sun Jun 25 13:42:38 2023 +0200 author commit 2035636e204bdf313e7631bd16868662f25c1341 Author: bunsenstraat Date: Sun Jun 25 13:36:00 2023 +0200 email commit 7a28db2f528ab76f38160a03290f114759e320d2 Author: bunsenstraat Date: Sun Jun 25 13:23:27 2023 +0200 linux commit 6d8b169c3001f7acfca8798fe10eb843f444b113 Author: bunsenstraat Date: Sun Jun 25 13:22:28 2023 +0200 config commit a1050f17141e508b53987540f4c2125584590dda Author: bunsenstraat Date: Sun Jun 25 13:21:41 2023 +0200 linux commit 0728709ce2409c4dcadbbbda26e2cd07bfe37292 Author: bunsenstraat Date: Sun Jun 25 13:04:43 2023 +0200 desktopbuild commit 539d992108ce8b900e110fd6933073bd46e489ce Author: bunsenstraat Date: Sun Jun 25 13:00:52 2023 +0200 unzip commit ec52d9acf3341aaeb3dfe581b1ea814e7c02e7d5 Author: bunsenstraat Date: Sun Jun 25 12:54:52 2023 +0200 typo commit 3690a7b3147c054305a85438ee38b18be408116f Author: bunsenstraat Date: Sun Jun 25 12:50:29 2023 +0200 typo commit 7880ff4e36c4a35d42eb64a6c1444a1a1188b985 Author: bunsenstraat Date: Sun Jun 25 12:47:15 2023 +0200 windows commit 34242019257f597d0f4440f607ea5e3537198d32 Author: bunsenstraat Date: Sun Jun 25 12:45:26 2023 +0200 config commit 1ad75731f73395b3794c7ba1d76334213ade09f5 Author: bunsenstraat Date: Sun Jun 25 12:41:34 2023 +0200 config commit 8fa20b74a466f71bf05609da75719187e39c04f0 Author: bunsenstraat Date: Sun Jun 25 12:41:11 2023 +0200 config commit be174d3da3664774d7e2f32e94841b3aead5f2a8 Author: bunsenstraat Date: Sun Jun 25 12:40:35 2023 +0200 config commit 32bbaf31bc9abab527420ff9d02d27e3465bff0b Author: bunsenstraat Date: Sun Jun 25 12:35:18 2023 +0200 config commit 1ec69c6e1e3b99881f69d4c7eddd88ced31b176b Author: bunsenstraat Date: Sun Jun 25 12:34:52 2023 +0200 config commit acca77164c09cb5645a8f99dd7e85932db38da5d Author: bunsenstraat Date: Sun Jun 25 12:33:25 2023 +0200 build desktop commit 6ecd1e8b2e736a720e94a5b84cd79d71e1a5c9b7 Author: bunsenstraat Date: Sun Jun 25 12:23:44 2023 +0200 cache commit b75983af55c3db436718540f8ae70fa047aea8c4 Author: bunsenstraat Date: Sun Jun 25 12:15:18 2023 +0200 ci commit 9b4b8970ae43af78f174200fe14021aedfb7639d Author: bunsenstraat Date: Sun Jun 25 12:13:27 2023 +0200 fix path commit 34acdb76a154eb0aa8c33f8fcc6b94c7a946e86c Author: bunsenstraat Date: Sun Jun 25 11:28:41 2023 +0200 fix windows commit 0de6b9cc745c7d89c13453d641d5c55567316b14 Author: bunsenstraat Date: Sat Jun 24 14:22:09 2023 +0200 es6 commit 7a51a12912f8cc892adc1a1b5083cd76450deee7 Author: bunsenstraat Date: Sat Jun 24 09:49:07 2023 +0200 USE_HARD_LINKS commit f77e8cb9a46a4022f106588b3d1ad1b196ab3ab5 Author: bunsenstraat Date: Fri Jun 23 20:03:26 2023 +0200 mkdir commit 16b492cb20e1ee5431c491d3cea456310882a930 Author: bunsenstraat Date: Fri Jun 23 19:58:24 2023 +0200 m1 commit 2daccdec4233e2a57c64f3f66df394eac0723eb9 Author: filip mertens Date: Fri Jun 23 17:22:31 2023 +0200 revert commit 0e1c48d3a14a8dacfcd58a80be0173875d929f42 Author: filip mertens Date: Fri Jun 23 17:12:09 2023 +0200 targets commit 3187054eb7feea6a9f3b715d28919b166265e989 Author: filip mertens Date: Fri Jun 23 16:59:52 2023 +0200 large commit e0765f2b1e3326db88a9f54fd3413d3676ef77c5 Author: filip mertens Date: Fri Jun 23 16:58:53 2023 +0200 large commit d2b9e1b55719acb160b70f8063be8ca30e208e27 Author: filip mertens Date: Fri Jun 23 16:58:19 2023 +0200 xlarge commit a2d6acaab8479a5b9c3fe583a9b7676415ae8cb8 Author: filip mertens Date: Fri Jun 23 16:41:29 2023 +0200 cmd commit 6108f51031f22f791a540c45ecef6e0dffcdab6d Author: filip mertens Date: Fri Jun 23 16:35:11 2023 +0200 windows commit 9f68bdf415c11ffed7fd280e0ccb97c0ed2d0d3f Author: filip mertens Date: Fri Jun 23 16:24:27 2023 +0200 package commit bf57415b8da120c1a26cf1423645051863c457a9 Author: filip mertens Date: Fri Jun 23 16:09:00 2023 +0200 apps/remixdesktop/ commit f8b6de1cfc10ebec40756fe922991f00b3e8bf65 Author: filip mertens Date: Fri Jun 23 16:03:46 2023 +0200 store commit 02646d2f191763e82232ffec083ab3ddbd9d49ec Author: filip mertens Date: Fri Jun 23 15:41:19 2023 +0200 other glob version commit f77e18dfa52ba9adce1d498c102c7612c8bd7b5c Author: filip mertens Date: Fri Jun 23 15:19:07 2023 +0200 rm lock commit 276760eeeebe4fe79286d0d476938f032a573ae5 Author: filip mertens Date: Fri Jun 23 15:15:43 2023 +0200 path commit ad8811c068b4dd7a0328cc036ee9e24a9a4628c6 Author: filip mertens Date: Fri Jun 23 15:14:04 2023 +0200 orb commit 016b29a94b42bb3e2bf0fa6030b0b7726b41d446 Author: filip mertens Date: Fri Jun 23 15:13:26 2023 +0200 job commit 2a115aa6e8f3ef98f16868ac86d0cd3d628b3936 Author: filip mertens Date: Fri Jun 23 15:12:22 2023 +0200 windows test commit 570fdd3ab33bff1b5d9106c254560af55767c07a Author: filip mertens Date: Fri Jun 23 12:54:32 2023 +0200 typo commit cb41e83dec595c4e61b348f6cfb4d15c6c08ac01 Author: filip mertens Date: Fri Jun 23 12:49:52 2023 +0200 mdkir commit 24908d0ffaf3424a540e9ab2b9721b618f18c997 Author: filip mertens Date: Fri Jun 23 12:35:41 2023 +0200 lock commit f67726f191bd81b156f72b6e19cf933feadd068b Author: filip mertens Date: Fri Jun 23 12:29:11 2023 +0200 lock commit 90c6f5e1d90661820ab697505e9cb3d34768e754 Author: filip mertens Date: Fri Jun 23 12:12:35 2023 +0200 20 commit 99d9b6cc334afef0270d648c27b813ccf3f7ffde Author: filip mertens Date: Fri Jun 23 12:05:21 2023 +0200 use20 commit 6053f2d38a329084d393b2f8bc8a05d7e6ffc47e Author: filip mertens Date: Fri Jun 23 11:54:05 2023 +0200 space commit eb6d01edb708d7083db378e4b0893d502050ad2e Author: filip mertens Date: Fri Jun 23 11:51:12 2023 +0200 ls commit abedb4a95dba68e68c023226fe1c274b073c8745 Author: filip mertens Date: Fri Jun 23 11:50:09 2023 +0200 node v commit 0b818ca9fd805aa5837fb8077f194e45c955987a Author: filip mertens Date: Fri Jun 23 11:47:51 2023 +0200 ci commit cca1a7d63dd5a2036ff64a4d55651e4182c496ad Author: filip mertens Date: Fri Jun 23 11:44:12 2023 +0200 build CI commit 07c392e0ca1d8416cc3dd7e5d60ab4f9d5c13a66 Author: filip mertens Date: Fri Jun 23 10:31:42 2023 +0200 gist fix commit 9ecc3949df3e298e76e6d3f62bfb50a10fe0da37 Merge: 54ffcd5dc c7dbcf15c Author: filip mertens Date: Thu Jun 22 14:42:55 2023 +0200 Merge branch 'rdesktop' of https://github.com/ethereum/remix-project into rdesktop commit 54ffcd5dc35ffb074738d87b2c996846f61f9f05 Author: filip mertens Date: Thu Jun 22 14:38:00 2023 +0200 fix commit cedb19ed9e3f1babccce0a81b5187853d84c8520 Author: filip mertens Date: Thu Jun 22 14:01:54 2023 +0200 remixd test commit 7f13f5d7979d08602509f58c2fbfe704d95ae7e8 Author: filip mertens Date: Thu Jun 22 13:57:37 2023 +0200 fix test commit 2216cebb4bbe1bb26ac923596c2a2fc794b1197b Author: filip mertens Date: Thu Jun 22 13:56:08 2023 +0200 fix test commit 5dcfef2820ac9133491bf7f3dd12853a5eb6555e Author: filip mertens Date: Thu Jun 22 13:45:36 2023 +0200 required modules commit 5c8a92ac0f0e8c11686f8ddb80d053754c5d5fae Author: filip mertens Date: Thu Jun 22 13:20:12 2023 +0200 remove recent folder commit a69a6e648a429bf47338be46c91bfa6f0ae23a58 Author: filip mertens Date: Thu Jun 22 13:04:35 2023 +0200 filechanged commit 3ce2e5b200220f6d0877e30a2543669171ab3996 Author: filip mertens Date: Thu Jun 22 10:12:59 2023 +0200 context menu commit 570658f54c005eb8d5b7382c70c09a1b94011412 Author: filip mertens Date: Thu Jun 22 09:34:53 2023 +0200 menu commit 3660c8bc336b665dbeea6ea296b0c8569dd8cfe6 Author: filip mertens Date: Thu Jun 22 08:44:51 2023 +0200 fix menu commit a1dceb706da238933f1dee217cca7ecf7ac4f11f Author: filip mertens Date: Thu Jun 22 08:21:41 2023 +0200 hometab & clone commit e58d67345bb4acfd7fecc357889ba632c7d8a4e3 Author: filip mertens Date: Wed Jun 21 09:24:15 2023 +0200 provider events commit 356d8ed3dcfd41f7403745c03a97a469b09fc017 Author: filip mertens Date: Tue Jun 20 20:24:44 2023 +0200 some git functions commit ee259cd49f73796ca7fb6a7f6b99eec2da443f98 Author: filip mertens Date: Tue Jun 20 17:34:31 2023 +0200 fix search commit 193230f6756c6fef839819d74ac785aa8030f591 Author: filip mertens Date: Tue Jun 20 16:31:17 2023 +0200 glob commit f3ec824c62c277e0e685121f2dbb8df84fe8fb42 Author: filip mertens Date: Wed Jun 14 15:45:55 2023 +0200 folder handling commit b888c2b894e42015213c15d0a21a83a2d5361d8a Author: bunsenstraat Date: Tue Jun 13 17:16:36 2023 +0200 open folder commit eaefe37861e522269f938e2e7d5b3448201b768e Author: filip mertens Date: Tue Jun 13 12:51:12 2023 +0200 loading engine commit 5728f3c7dbbf37220e2611bb66486ae7f51e400d Author: filip mertens Date: Tue Jun 13 07:47:33 2023 +0200 isogit commit 429e845785234de86ffc9054237bc5c6f277d1dc Author: filip mertens Date: Wed Jun 7 19:39:39 2023 +0200 dgit commit b106cc8cdf68aa442bfbd708ac43f868891b4f1c Author: filip mertens Date: Wed Jun 7 17:22:30 2023 +0200 fs support commit ac28db3a521cbb1c3442080b1a9d3481ded58a91 Author: filip mertens Date: Wed Jun 7 13:33:28 2023 +0200 refactor commit 892915b13813a2dd2d2ea4ff4c8cedfed2739f4e Author: filip mertens Date: Wed Jun 7 11:54:41 2023 +0200 fs integration commit 218a56bdc73ee004768b016f672155732f7da977 Author: filip mertens Date: Wed Jun 7 11:54:27 2023 +0200 update test1 commit 6c25d81166aa15afec911e5e01ffff633682215a Author: filip mertens Date: Wed Jun 7 11:49:03 2023 +0200 update test app commit 24039ebb438ab296c8ff7cad29270ef56bee2566 Author: filip mertens Date: Sat Jun 3 13:42:10 2023 +0200 other builder commit a5c71f437975296c617e6096246d718ac19fae26 Author: bunsenstraat Date: Fri Jun 2 13:45:26 2023 +0200 cleanup commit 69398c09af4cecffb56fad7a9b13e64274a1d02b Author: bunsenstraat Date: Fri Jun 2 13:33:38 2023 +0200 terminals commit 89c146f1decd28cd4ceaedfe7b0b4a62f2b6f669 Author: filip mertens Date: Thu Jun 1 18:07:07 2023 +0200 serve commit 6bb9beb9508fbe35d2159f3a3872d6d8301a8061 Author: filip mertens Date: Thu Jun 1 11:52:42 2023 +0200 engine:activatePlugin commit 3b26898fb14a13de2b183b0304f23386db544605 Author: filip mertens Date: Thu Jun 1 11:50:57 2023 +0200 refactor commit 881d0c1b1264ba6f11f9e3a69d3c03e7baf0e0d8 Author: filip mertens Date: Thu Jun 1 11:47:48 2023 +0200 rename commit c28f72bca6ef8fd935ab8cc09891740868b9c5df Author: filip mertens Date: Thu Jun 1 11:46:39 2023 +0200 cleanup commit 96df90fa1c9560703dd632bc1dcebce3f8d095f3 Author: filip mertens Date: Thu Jun 1 11:43:04 2023 +0200 refactor commit 92feaa0283f7c29e008502939338a9df17a0c0fa Author: filip mertens Date: Thu Jun 1 11:32:35 2023 +0200 close watcher commit bea74d41242eb392b7a9a624f1f536bbcd2ffe08 Author: filip mertens Date: Thu Jun 1 11:28:33 2023 +0200 close watcher commit 6778a113f8ee632b5a5353e97759d2264d6409fc Author: filip mertens Date: Thu Jun 1 10:47:55 2023 +0200 refactor commit 87f65eeba73346b3b18f70e237a8eef3707781ea Author: filip mertens Date: Thu Jun 1 10:41:22 2023 +0200 refactor commit 971e4d02651c6144cbc595ebc4a1684552e16ee8 Author: filip mertens Date: Thu Jun 1 10:02:37 2023 +0200 refactor commit 78d324772542273352877a6d9b30f9bcae5f57a3 Author: filip mertens Date: Thu Jun 1 00:39:47 2023 +0200 change fs commit ee4b672de33b057d6b193ada3135bc96b8884c0c Author: filip mertens Date: Thu Jun 1 00:29:36 2023 +0200 add test app commit 8287f68209372c3ddc72382ba7cded4562075171 Author: bunsenstraat Date: Tue May 30 08:31:18 2023 +0200 fix path commit 47f3fa47a36f61e38c330e80d8c930b2f120104d Author: bunsenstraat Date: Mon May 29 18:39:08 2023 +0200 app build & serve commit c65465b056400d7e87fce7d27bba996df9d23e85 Author: bunsenstraat Date: Mon May 29 09:52:36 2023 +0200 rm trash commit 59210c07b5bf38012184cc14552ffe10517ec00d Author: bunsenstraat Date: Sun May 28 10:56:08 2023 +0200 new app commit 463d39d99ebc323a05e4122ad65cb8cb1ca2954b Author: filip mertens Date: Sat May 27 15:29:49 2023 +0200 fix webpack commit f3401854152fe631d6bf886b94f56e2f2f4f2c0a Author: filip mertens Date: Sat May 27 14:56:07 2023 +0200 prepackage commit 620ede28b09a2eaee87f014c9d1257be35cfd992 Author: filip mertens Date: Sat May 27 13:56:08 2023 +0200 testing commit cca42ea2a56884d865178b15960218947b1aee93 Author: filip mertens Date: Sat May 27 13:38:54 2023 +0200 dev server commit 560cfc23719232bd0c63397fc560a6a67ccdae0c Author: filip mertens Date: Sat May 27 13:17:18 2023 +0200 experiments commit c7dbcf15c296ad68b46874d411aa5191f4e26a53 Author: filip mertens Date: Thu Jun 22 14:01:54 2023 +0200 remixd test commit 367761fe7f5fa6870491ed8a2d2705e47e2a647e Author: filip mertens Date: Thu Jun 22 13:57:37 2023 +0200 fix test commit 3a259607359e6a2d1683f875979a1ca5fbe596a4 Author: filip mertens Date: Thu Jun 22 13:56:08 2023 +0200 fix test commit 3cd59ec57b259b5be53f85cd09b4d9bfa94f2cb4 Author: filip mertens Date: Thu Jun 22 13:45:36 2023 +0200 required modules commit 6c0ffc29afb71d7bd35112213afee8bac00a2b7b Author: filip mertens Date: Thu Jun 22 13:20:12 2023 +0200 remove recent folder commit f170b0834405f2a770f19f63d32f7b9cb7d0358e Author: filip mertens Date: Thu Jun 22 13:04:35 2023 +0200 filechanged commit 68515019a93471d7ce7a541409a5fda66d72969e Author: filip mertens Date: Thu Jun 22 10:12:59 2023 +0200 context menu commit 443dcde26016dabb022f43f0267a4e4caa5ca96e Author: filip mertens Date: Thu Jun 22 09:34:53 2023 +0200 menu commit 21e85f6881f865309d66346b82d5bbdbc1c90677 Author: filip mertens Date: Thu Jun 22 08:44:51 2023 +0200 fix menu commit 1d36d50ab69f1b09fed868409844a0706de74d79 Author: filip mertens Date: Thu Jun 22 08:21:41 2023 +0200 hometab & clone commit f542fd8d1b09355682214e5dcf1923c07c1bbd58 Author: filip mertens Date: Wed Jun 21 09:24:15 2023 +0200 provider events commit cdf0ca95c25049700bc5a2a6f4ba8134fbd2ac11 Author: filip mertens Date: Tue Jun 20 20:24:44 2023 +0200 some git functions commit 7dac9f1731cb4e3d45d42b7d24debedb98bfcd19 Author: filip mertens Date: Tue Jun 20 17:34:31 2023 +0200 fix search commit d1073ed3220aded304b08ef7de5a6733925f5a61 Author: filip mertens Date: Tue Jun 20 16:31:17 2023 +0200 glob commit 71eef01e5d5c9b644366cc38a80c5ce4e37d464d Author: filip mertens Date: Wed Jun 14 15:45:55 2023 +0200 folder handling commit b8ed5556cb6079b8f3ed975f8abf6352db3731f3 Author: bunsenstraat Date: Tue Jun 13 17:16:36 2023 +0200 open folder commit 274a3c7cbd47ca59ffc038767e3c688630aa9057 Author: filip mertens Date: Tue Jun 13 12:51:12 2023 +0200 loading engine commit 01433bae4fe70ca7bd5eaa09ddd078d7c92ee0cb Author: filip mertens Date: Tue Jun 13 07:47:33 2023 +0200 isogit commit 038c63e362984b36d230df7d2f07993860ade7ad Author: filip mertens Date: Wed Jun 7 19:39:39 2023 +0200 dgit commit 336d191c20536c756e84560461d2e3e1f5fa3cc7 Author: filip mertens Date: Wed Jun 7 17:22:30 2023 +0200 fs support commit 87c498fa9124a283de4127545123273916f1225f Author: filip mertens Date: Wed Jun 7 13:33:28 2023 +0200 refactor commit 34abe45ebc6a674e882dec99324da38f021bc023 Author: filip mertens Date: Wed Jun 7 11:54:41 2023 +0200 fs integration commit 2e39267532862b343cf955ed8093103e87d6c9e0 Author: filip mertens Date: Wed Jun 7 11:54:27 2023 +0200 update test1 commit 6534e8aa472220cfeb5a1427c21d3467613968c4 Author: filip mertens Date: Wed Jun 7 11:49:03 2023 +0200 update test app commit 272bf13344746d716aec003f8b58fa3754b596ec Author: filip mertens Date: Sat Jun 3 13:42:10 2023 +0200 other builder commit a2d511d44569b67ac41c1ff970ce4f260234aa29 Author: bunsenstraat Date: Fri Jun 2 13:45:26 2023 +0200 cleanup commit 15d1a0189cedfac7274d3a2450ab5b335de995e7 Author: bunsenstraat Date: Fri Jun 2 13:33:38 2023 +0200 terminals commit 3cd5c54262c6e9e37238f0d852bde43203d8936c Author: filip mertens Date: Thu Jun 1 18:07:07 2023 +0200 serve commit b8e344da37de1b529aa047484589c242fdc3c37f Author: filip mertens Date: Thu Jun 1 11:52:42 2023 +0200 engine:activatePlugin commit 05f5bad529caeaec5f5c8d6c63d89b9de162d659 Author: filip mertens Date: Thu Jun 1 11:50:57 2023 +0200 refactor commit 12b51f44bd0762b6921633ced9327b86e2398315 Author: filip mertens Date: Thu Jun 1 11:47:48 2023 +0200 rename commit 5bff29ea3a5ae3904e8517e4a9e451b066a91219 Author: filip mertens Date: Thu Jun 1 11:46:39 2023 +0200 cleanup commit 0b878097cb7c481dfe4fc3afb0b136be2872d8e0 Author: filip mertens Date: Thu Jun 1 11:43:04 2023 +0200 refactor commit f68b1899699ab3382f452aab81b2180a2074ba9e Author: filip mertens Date: Thu Jun 1 11:32:35 2023 +0200 close watcher commit 03163d303e60f38ea0712e79b991a5869803f67b Author: filip mertens Date: Thu Jun 1 11:28:33 2023 +0200 close watcher commit 946135bde069983cf853e259f6d845a80748fcaf Author: filip mertens Date: Thu Jun 1 10:47:55 2023 +0200 refactor commit eae0a0f6967f1491a02707e3443338b71780e10e Author: filip mertens Date: Thu Jun 1 10:41:22 2023 +0200 refactor commit 93973004e9cfbdc515db97468a4cf1451392efc3 Author: filip mertens Date: Thu Jun 1 10:02:37 2023 +0200 refactor commit 171518f49a68b7acf124e74338b1c474f7c8e6ca Author: filip mertens Date: Thu Jun 1 00:39:47 2023 +0200 change fs commit f275f0ae8a797644927c21ebc80aafb273096eff Author: filip mertens Date: Thu Jun 1 00:29:36 2023 +0200 add test app commit c9297a4d8f04fc98ef5f6603bf1a4d54a734b4ad Author: bunsenstraat Date: Tue May 30 08:31:18 2023 +0200 fix path commit acf2e01aa86be237b3152dbeb7e033165702ef68 Author: bunsenstraat Date: Mon May 29 18:39:08 2023 +0200 app build & serve commit 481947757773ceb66aa3624898ca09a01e133b22 Author: bunsenstraat Date: Mon May 29 09:52:36 2023 +0200 rm trash commit b4c9657e9b966ee6a1fffb02c0cb6bfcd84e5e06 Author: bunsenstraat Date: Sun May 28 10:56:08 2023 +0200 new app commit 542e20ea9c7e363cfe3b4edcc312b3d82c371f78 Author: filip mertens Date: Sat May 27 15:29:49 2023 +0200 fix webpack commit 94c19ac6d44d7d633e053c14d1f1ba9aef4ee8e0 Author: filip mertens Date: Sat May 27 14:56:07 2023 +0200 prepackage commit 2102b3004428efb0d8a4030dc80f1e747d5901b7 Author: filip mertens Date: Sat May 27 13:56:08 2023 +0200 testing commit 8220097fb770953b4d9b498cf9f3fa95e98065e0 Author: filip mertens Date: Sat May 27 13:38:54 2023 +0200 dev server commit f966c4cb9b9ce56f3332c08773a7c5f23e0b2cf9 Author: filip mertens Date: Sat May 27 13:17:18 2023 +0200 experiments --- .circleci/config.yml | 155 + .gitignore | 4 + apps/remix-ide-e2e/src/tests/remixd.test.ts | 2 +- .../src/tests/solidityImport.test.ts | 6 +- .../.deps/remix-tests/remix_accounts.sol | 9 + .../.deps/remix-tests/remix_tests.sol | 225 + apps/remix-ide/project.json | 7 + apps/remix-ide/src/app.js | 48 +- .../{dgitProvider.js => dgitProvider.ts} | 421 +- .../src/app/files/electronProvider.ts | 84 + apps/remix-ide/src/app/files/fileManager.ts | 34 +- .../{fileProvider.js => fileProvider.ts} | 37 +- .../remix-ide/src/app/files/remixDProvider.js | 2 +- .../src/app/files/workspaceFileProvider.js | 2 +- apps/remix-ide/src/app/panels/file-panel.js | 2 +- apps/remix-ide/src/app/panels/terminal.js | 34 +- .../plugins/electron/electronConfigPlugin.ts | 19 + .../src/app/plugins/electron/fsPlugin.ts | 143 + .../src/app/plugins/electron/isoGitPlugin.ts | 29 + .../app/plugins/electron/templatesPlugin.ts | 15 + .../src/app/plugins/electron/xtermPlugin.ts | 11 + .../services/code-parser-antlr-service.ts | 3 +- .../parser/services/code-parser-imports.ts | 36 +- .../src/app/plugins/remix-templates.ts | 30 + .../src/app/plugins/remixd-handle.tsx | 1 + .../src/app/tabs/locales/en/electron.json | 4 + .../src/app/tabs/locales/en/index.js | 2 + apps/remix-ide/src/app/tabs/theme-module.js | 38 +- apps/remix-ide/src/index.tsx | 3 +- apps/remix-ide/src/remixAppManager.js | 9 +- apps/remix-ide/src/remixEngine.js | 2 + apps/remix-ide/webpack.config.js | 17 +- apps/remixdesktop/README.md | 22 + apps/remixdesktop/assets/icon.png | Bin 0 -> 14458 bytes apps/remixdesktop/package.json | 105 + apps/remixdesktop/src/engine.ts | 61 + apps/remixdesktop/src/main.ts | 114 + apps/remixdesktop/src/menus/commands.ts | 39 + apps/remixdesktop/src/menus/darwin.ts | 28 + apps/remixdesktop/src/menus/edit.ts | 53 + apps/remixdesktop/src/menus/file.ts | 49 + apps/remixdesktop/src/menus/git.ts | 20 + apps/remixdesktop/src/menus/main.ts | 26 + apps/remixdesktop/src/menus/terminal.ts | 20 + apps/remixdesktop/src/menus/view.ts | 87 + apps/remixdesktop/src/menus/window.ts | 63 + apps/remixdesktop/src/plugins/configPlugin.ts | 50 + apps/remixdesktop/src/plugins/fsPlugin.ts | 377 ++ apps/remixdesktop/src/plugins/isoGitPlugin.ts | 368 ++ apps/remixdesktop/src/plugins/templates.ts | 72 + apps/remixdesktop/src/plugins/xtermPlugin.ts | 153 + apps/remixdesktop/src/preload.ts | 33 + apps/remixdesktop/src/tools/git.ts | 151 + apps/remixdesktop/src/utils/config.ts | 39 + apps/remixdesktop/src/utils/findExecutable.ts | 86 + apps/remixdesktop/tsconfig.json | 17 + apps/remixdesktop/yarn.lock | 5069 +++++++++++++++++ .../remix-core-plugin/src/lib/gist-handler.ts | 3 +- .../app/src/lib/remix-app/remix-app.tsx | 1 + .../src/lib/components/homeTabFeatured.tsx | 4 +- .../lib/components/homeTabFeaturedPlugins.tsx | 2 +- .../lib/components/homeTabFileElectron.tsx | 41 + .../src/lib/components/homeTabGetStarted.tsx | 7 + .../home-tab/src/lib/remix-ui-home-tab.tsx | 6 +- .../panel/src/lib/dragbar/dragbar.tsx | 4 +- .../panel/src/lib/main/main-panel.css | 2 +- .../src/lib/components/results/ResultItem.tsx | 1 - .../lib/components/results/SearchHelper.ts | 146 +- .../search/src/lib/context/context.tsx | 5 + .../src/lib/compiler-container.tsx | 3 +- .../src/lib/solidity-unit-testing.tsx | 3 +- .../workspace/src/lib/actions/events.ts | 12 +- .../workspace/src/lib/actions/index.ts | 66 +- .../workspace/src/lib/actions/payload.ts | 7 + .../workspace/src/lib/actions/workspace.ts | 151 +- .../src/lib/components/electron-menu.tsx | 65 + .../components/file-explorer-context-menu.tsx | 4 +- .../workspace/src/lib/contexts/index.ts | 3 + .../workspace/src/lib/css/electron-menu.css | 27 + .../src/lib/providers/FileSystemProvider.tsx | 20 +- .../workspace/src/lib/reducers/workspace.ts | 20 +- .../workspace/src/lib/remix-ui-workspace.tsx | 675 +-- .../remix-ui/workspace/src/lib/types/index.ts | 2 +- .../remix-ui/workspace/src/lib/utils/index.ts | 21 +- libs/remix-ui/xterm/src/index.ts | 2 + .../src/lib/components/remix-ui-xterm.tsx | 48 + .../lib/components/remix-ui-xterminals.tsx | 234 + .../src/lib/components/xterm-fit-addOn.ts | 92 + .../xterm/src/lib/components/xterm-wrap.tsx | 237 + libs/remix-ui/xterm/src/lib/css/index.css | 66 + package.json | 35 +- tsconfig.json | 4 +- tsconfig.paths.json | 4 + yarn.lock | 1797 +++++- 94 files changed, 11404 insertions(+), 952 deletions(-) create mode 100644 apps/remix-ide/contracts/.deps/remix-tests/remix_accounts.sol create mode 100644 apps/remix-ide/contracts/.deps/remix-tests/remix_tests.sol rename apps/remix-ide/src/app/files/{dgitProvider.js => dgitProvider.ts} (62%) create mode 100644 apps/remix-ide/src/app/files/electronProvider.ts rename apps/remix-ide/src/app/files/{fileProvider.js => fileProvider.ts} (92%) create mode 100644 apps/remix-ide/src/app/plugins/electron/electronConfigPlugin.ts create mode 100644 apps/remix-ide/src/app/plugins/electron/fsPlugin.ts create mode 100644 apps/remix-ide/src/app/plugins/electron/isoGitPlugin.ts create mode 100644 apps/remix-ide/src/app/plugins/electron/templatesPlugin.ts create mode 100644 apps/remix-ide/src/app/plugins/electron/xtermPlugin.ts create mode 100644 apps/remix-ide/src/app/plugins/remix-templates.ts create mode 100644 apps/remix-ide/src/app/tabs/locales/en/electron.json create mode 100644 apps/remixdesktop/README.md create mode 100644 apps/remixdesktop/assets/icon.png create mode 100644 apps/remixdesktop/package.json create mode 100644 apps/remixdesktop/src/engine.ts create mode 100644 apps/remixdesktop/src/main.ts create mode 100644 apps/remixdesktop/src/menus/commands.ts create mode 100644 apps/remixdesktop/src/menus/darwin.ts create mode 100644 apps/remixdesktop/src/menus/edit.ts create mode 100644 apps/remixdesktop/src/menus/file.ts create mode 100644 apps/remixdesktop/src/menus/git.ts create mode 100644 apps/remixdesktop/src/menus/main.ts create mode 100644 apps/remixdesktop/src/menus/terminal.ts create mode 100644 apps/remixdesktop/src/menus/view.ts create mode 100644 apps/remixdesktop/src/menus/window.ts create mode 100644 apps/remixdesktop/src/plugins/configPlugin.ts create mode 100644 apps/remixdesktop/src/plugins/fsPlugin.ts create mode 100644 apps/remixdesktop/src/plugins/isoGitPlugin.ts create mode 100644 apps/remixdesktop/src/plugins/templates.ts create mode 100644 apps/remixdesktop/src/plugins/xtermPlugin.ts create mode 100644 apps/remixdesktop/src/preload.ts create mode 100644 apps/remixdesktop/src/tools/git.ts create mode 100644 apps/remixdesktop/src/utils/config.ts create mode 100644 apps/remixdesktop/src/utils/findExecutable.ts create mode 100644 apps/remixdesktop/tsconfig.json create mode 100644 apps/remixdesktop/yarn.lock create mode 100644 libs/remix-ui/home-tab/src/lib/components/homeTabFileElectron.tsx create mode 100644 libs/remix-ui/workspace/src/lib/components/electron-menu.tsx create mode 100644 libs/remix-ui/workspace/src/lib/css/electron-menu.css create mode 100644 libs/remix-ui/xterm/src/index.ts create mode 100644 libs/remix-ui/xterm/src/lib/components/remix-ui-xterm.tsx create mode 100644 libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx create mode 100644 libs/remix-ui/xterm/src/lib/components/xterm-fit-addOn.ts create mode 100644 libs/remix-ui/xterm/src/lib/components/xterm-wrap.tsx create mode 100644 libs/remix-ui/xterm/src/lib/css/index.css diff --git a/.circleci/config.yml b/.circleci/config.yml index 2821756cb9..005e4cfe6b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,7 @@ parameters: default: false orbs: browser-tools: circleci/browser-tools@1.4.1 + win: circleci/windows@5.0 jobs: build: docker: @@ -50,6 +51,32 @@ jobs: paths: - "persist" + build-desktop: + docker: + - image: cimg/node:20.0.0-browsers + + resource_class: + xlarge + working_directory: ~/remix-project + steps: + - checkout + - restore_cache: + keys: + - v1-deps-{{ checksum "yarn.lock" }} + - run: yarn + - save_cache: + key: v1-deps-{{ checksum "yarn.lock" }} + paths: + - node_modules + - run: + name: Build + command: | + yarn build:desktop + - run: mkdir persist && zip -0 -r persist/desktopbuild.zip dist/apps/remix-ide + - persist_to_workspace: + root: . + paths: + - "persist" build-plugin: docker: @@ -77,6 +104,121 @@ jobs: paths: - "persist" + build-remixdesktop-linux: + machine: + image: ubuntu-2004:current + resource_class: + xlarge + working_directory: ~/remix-project + steps: + - run: ldd --version + - checkout + - attach_workspace: + at: . + - run: unzip ./persist/desktopbuild.zip + - restore_cache: + keys: + - remixdesktop-linux-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} + - run: + command: | + mkdir apps/remixdesktop/build + cp -r dist/apps/remix-ide apps/remixdesktop/build/remix-ide + cd apps/remixdesktop/ + yarn + yarn dist --linux + rm -rf release/*-unpacked + - save_cache: + key: remixdesktop-linux-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} + paths: + - apps/remixdesktop/node_modules + - store_artifacts: + path: apps/remixdesktop/release/ + destination: remixdesktop-linux + + build-remixdesktop-windows: + executor: + name: win/default # executor type + size: xlarge # can be medium, large, xlarge, 2xlarge + shell: bash.exe + working_directory: ~/remix-project + steps: + - checkout + - attach_workspace: + at: . + - run: unzip ./persist/desktopbuild.zip + - restore_cache: + key: node-20-windows-v3 + - run: + command: | + nvm install 20.0.0 + nvm use 20.0.0 + node -v + npx -v + npm install --global yarn + yarn -v + - save_cache: + key: node-20-windows-v3 + paths: + - /ProgramData/nvm/v20.0.0 + - restore_cache: + keys: + - remixdesktop-windows-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} + - run: + command: | + mkdir apps/remixdesktop/build + cp -r dist/apps/remix-ide apps/remixdesktop/build/remix-ide + cd apps/remixdesktop/ + yarn + yarn dist --win + rm -rf release/*-unpacked + - save_cache: + key: remixdesktop-windows-deps-{{ checksum "apps/remixdesktop/yarn.lock" }} + paths: + - apps/remixdesktop/node_modules + - store_artifacts: + path: apps/remixdesktop/release/ + destination: remixdesktop-windows + + build-remixdesktop-mac: + macos: + xcode: 14.2.0 + resource_class: + macos.m1.large.gen1 + working_directory: ~/remix-project + steps: + - checkout + - attach_workspace: + at: . + - run: unzip ./persist/desktopbuild.zip + - run: + command: | + ls -la dist/apps/remix-ide + nvm install 20.0.0 + nvm use 20.0.0 + - restore_cache: + keys: + - remixdesktop-deps-mac-{{ checksum "apps/remixdesktop/yarn.lock" }} + - run: + command: | + nvm use 20.0.0 + cd apps/remixdesktop && yarn + - save_cache: + key: remixdesktop-deps-mac-{{ checksum "apps/remixdesktop/yarn.lock" }} + paths: + - apps/remixdesktop/node_modules + # use USE_HARD_LINK=false https://github.com/electron-userland/electron-builder/issues/3179 + - run: + command: | + nvm use 20.0.0 + mkdir apps/remixdesktop/build + cp -r dist/apps/remix-ide apps/remixdesktop/build/remix-ide + cd apps/remixdesktop + USE_HARD_LINKS=false yarn dist --mac + rm -rf release/mac* + - store_artifacts: + path: apps/remixdesktop/release/ + destination: remixdesktop-mac + lint: docker: - image: cimg/node:20.0.0-browsers @@ -287,6 +429,19 @@ workflows: unless: << pipeline.parameters.run_flaky_tests >> jobs: - build + - build-desktop: + filters: + branches: + only: ['master', /.*desktop.*/] + - build-remixdesktop-mac: + requires: + - build-desktop + - build-remixdesktop-windows: + requires: + - build-desktop + - build-remixdesktop-linux: + requires: + - build-desktop - build-plugin: matrix: parameters: diff --git a/.gitignore b/.gitignore index ad98096af7..2c9c31b407 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,7 @@ testem.log .DS_Store .vscode/settings.json .vscode/launch.json + +apps/remixdesktop/.webpack +apps/remixdesktop/out +apps/remixdesktop/release/ diff --git a/apps/remix-ide-e2e/src/tests/remixd.test.ts b/apps/remix-ide-e2e/src/tests/remixd.test.ts index a1a617f645..898c020e2c 100644 --- a/apps/remix-ide-e2e/src/tests/remixd.test.ts +++ b/apps/remix-ide-e2e/src/tests/remixd.test.ts @@ -104,7 +104,7 @@ module.exports = { }) .addFile('test_import_node_modules_with_github_import.sol', sources[4]['test_import_node_modules_with_github_import.sol']) .clickLaunchIcon('solidity') - .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.0 + .setSolidityCompilerVersion('soljson-v0.8.20+commit.a1b79de6.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .testContracts('test_import_node_modules_with_github_import.sol', sources[4]['test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) }, 'Static Analysis run with remixd #group3': '' + function (browser) { diff --git a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts index 79bddb5ed5..6e7430f0a5 100644 --- a/apps/remix-ide-e2e/src/tests/solidityImport.test.ts +++ b/apps/remix-ide-e2e/src/tests/solidityImport.test.ts @@ -38,7 +38,7 @@ module.exports = { 'Test GitHub Import - from master branch #group1': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.19 (master branch) + .setSolidityCompilerVersion('soljson-v0.8.20+commit.a1b79de6.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .addFile('Untitled4.sol', sources[3]['Untitled4.sol']) .clickLaunchIcon('filePanel') .verifyContracts(['test7', 'ERC20'], { wait: 10000 }) @@ -54,7 +54,7 @@ module.exports = { 'Test GitHub Import - no branch specified #group2': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.19 (master branch) + .setSolidityCompilerVersion('soljson-v0.8.20+commit.a1b79de6.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .clickLaunchIcon('filePanel') .click('li[data-id="treeViewLitreeViewItemREADME.txt"') .addFile('Untitled6.sol', sources[5]['Untitled6.sol']) @@ -64,7 +64,7 @@ module.exports = { 'Test GitHub Import - raw URL #group4': function (browser: NightwatchBrowser) { browser - .setSolidityCompilerVersion('soljson-v0.8.19+commit.7dd6d404.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) + .setSolidityCompilerVersion('soljson-v0.8.20+commit.a1b79de6.js') // open-zeppelin moved to pragma ^0.8.0 (master branch) .clickLaunchIcon('filePanel') .click('li[data-id="treeViewLitreeViewItemREADME.txt"') .addFile('Untitled7.sol', sources[6]['Untitled7.sol']) diff --git a/apps/remix-ide/contracts/.deps/remix-tests/remix_accounts.sol b/apps/remix-ide/contracts/.deps/remix-tests/remix_accounts.sol new file mode 100644 index 0000000000..b4ee04a169 --- /dev/null +++ b/apps/remix-ide/contracts/.deps/remix-tests/remix_accounts.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.4.22 <0.9.0; + +library TestsAccounts { + function getAccount(uint index) pure public returns (address) { + return address(0); + } +} diff --git a/apps/remix-ide/contracts/.deps/remix-tests/remix_tests.sol b/apps/remix-ide/contracts/.deps/remix-tests/remix_tests.sol new file mode 100644 index 0000000000..b8b9960362 --- /dev/null +++ b/apps/remix-ide/contracts/.deps/remix-tests/remix_tests.sol @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity >=0.4.22 <0.9.0; + +library Assert { + + event AssertionEvent( + bool passed, + string message, + string methodName + ); + + event AssertionEventUint( + bool passed, + string message, + string methodName, + uint256 returned, + uint256 expected + ); + + event AssertionEventInt( + bool passed, + string message, + string methodName, + int256 returned, + int256 expected + ); + + event AssertionEventBool( + bool passed, + string message, + string methodName, + bool returned, + bool expected + ); + + event AssertionEventAddress( + bool passed, + string message, + string methodName, + address returned, + address expected + ); + + event AssertionEventBytes32( + bool passed, + string message, + string methodName, + bytes32 returned, + bytes32 expected + ); + + event AssertionEventString( + bool passed, + string message, + string methodName, + string returned, + string expected + ); + + event AssertionEventUintInt( + bool passed, + string message, + string methodName, + uint256 returned, + int256 expected + ); + + event AssertionEventIntUint( + bool passed, + string message, + string methodName, + int256 returned, + uint256 expected + ); + + function ok(bool a, string memory message) public returns (bool result) { + result = a; + emit AssertionEvent(result, message, "ok"); + } + + function equal(uint256 a, uint256 b, string memory message) public returns (bool result) { + result = (a == b); + emit AssertionEventUint(result, message, "equal", a, b); + } + + function equal(int256 a, int256 b, string memory message) public returns (bool result) { + result = (a == b); + emit AssertionEventInt(result, message, "equal", a, b); + } + + function equal(bool a, bool b, string memory message) public returns (bool result) { + result = (a == b); + emit AssertionEventBool(result, message, "equal", a, b); + } + + // TODO: only for certain versions of solc + //function equal(fixed a, fixed b, string message) public returns (bool result) { + // result = (a == b); + // emit AssertionEvent(result, message); + //} + + // TODO: only for certain versions of solc + //function equal(ufixed a, ufixed b, string message) public returns (bool result) { + // result = (a == b); + // emit AssertionEvent(result, message); + //} + + function equal(address a, address b, string memory message) public returns (bool result) { + result = (a == b); + emit AssertionEventAddress(result, message, "equal", a, b); + } + + function equal(bytes32 a, bytes32 b, string memory message) public returns (bool result) { + result = (a == b); + emit AssertionEventBytes32(result, message, "equal", a, b); + } + + function equal(string memory a, string memory b, string memory message) public returns (bool result) { + result = (keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b))); + emit AssertionEventString(result, message, "equal", a, b); + } + + function notEqual(uint256 a, uint256 b, string memory message) public returns (bool result) { + result = (a != b); + emit AssertionEventUint(result, message, "notEqual", a, b); + } + + function notEqual(int256 a, int256 b, string memory message) public returns (bool result) { + result = (a != b); + emit AssertionEventInt(result, message, "notEqual", a, b); + } + + function notEqual(bool a, bool b, string memory message) public returns (bool result) { + result = (a != b); + emit AssertionEventBool(result, message, "notEqual", a, b); + } + + // TODO: only for certain versions of solc + //function notEqual(fixed a, fixed b, string message) public returns (bool result) { + // result = (a != b); + // emit AssertionEvent(result, message); + //} + + // TODO: only for certain versions of solc + //function notEqual(ufixed a, ufixed b, string message) public returns (bool result) { + // result = (a != b); + // emit AssertionEvent(result, message); + //} + + function notEqual(address a, address b, string memory message) public returns (bool result) { + result = (a != b); + emit AssertionEventAddress(result, message, "notEqual", a, b); + } + + function notEqual(bytes32 a, bytes32 b, string memory message) public returns (bool result) { + result = (a != b); + emit AssertionEventBytes32(result, message, "notEqual", a, b); + } + + function notEqual(string memory a, string memory b, string memory message) public returns (bool result) { + result = (keccak256(abi.encodePacked(a)) != keccak256(abi.encodePacked(b))); + emit AssertionEventString(result, message, "notEqual", a, b); + } + + /*----------------- Greater than --------------------*/ + function greaterThan(uint256 a, uint256 b, string memory message) public returns (bool result) { + result = (a > b); + emit AssertionEventUint(result, message, "greaterThan", a, b); + } + + function greaterThan(int256 a, int256 b, string memory message) public returns (bool result) { + result = (a > b); + emit AssertionEventInt(result, message, "greaterThan", a, b); + } + // TODO: safely compare between uint and int + function greaterThan(uint256 a, int256 b, string memory message) public returns (bool result) { + if(b < int(0)) { + // int is negative uint "a" always greater + result = true; + } else { + result = (a > uint(b)); + } + emit AssertionEventUintInt(result, message, "greaterThan", a, b); + } + function greaterThan(int256 a, uint256 b, string memory message) public returns (bool result) { + if(a < int(0)) { + // int is negative uint "b" always greater + result = false; + } else { + result = (uint(a) > b); + } + emit AssertionEventIntUint(result, message, "greaterThan", a, b); + } + /*----------------- Lesser than --------------------*/ + function lesserThan(uint256 a, uint256 b, string memory message) public returns (bool result) { + result = (a < b); + emit AssertionEventUint(result, message, "lesserThan", a, b); + } + + function lesserThan(int256 a, int256 b, string memory message) public returns (bool result) { + result = (a < b); + emit AssertionEventInt(result, message, "lesserThan", a, b); + } + // TODO: safely compare between uint and int + function lesserThan(uint256 a, int256 b, string memory message) public returns (bool result) { + if(b < int(0)) { + // int is negative int "b" always lesser + result = false; + } else { + result = (a < uint(b)); + } + emit AssertionEventUintInt(result, message, "lesserThan", a, b); + } + + function lesserThan(int256 a, uint256 b, string memory message) public returns (bool result) { + if(a < int(0)) { + // int is negative int "a" always lesser + result = true; + } else { + result = (uint(a) < b); + } + emit AssertionEventIntUint(result, message, "lesserThan", a, b); + } +} diff --git a/apps/remix-ide/project.json b/apps/remix-ide/project.json index 99b463867d..e0cc862959 100644 --- a/apps/remix-ide/project.json +++ b/apps/remix-ide/project.json @@ -39,6 +39,13 @@ "generateIndexHtml": true, "extractCss": false, "vendorChunk": false + }, + "desktop": { + "optimization": false, + "generateIndexHtml": true, + "extractCss": false, + "vendorChunk": false, + "baseHref": "./" } } }, diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 27e2e5de88..60d76fed6b 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -45,6 +45,14 @@ import { FileDecorator } from './app/plugins/file-decorator' import { CodeFormat } from './app/plugins/code-format' import { SolidityUmlGen } from './app/plugins/solidity-umlgen' import { ContractFlattener } from './app/plugins/contractFlattener' +import { TemplatesPlugin } from './app/plugins/remix-templates' +import { fsPlugin } from './app/plugins/electron/fsPlugin' +import { isoGitPlugin } from './app/plugins/electron/isoGitPlugin' +import { electronConfig } from './app/plugins/electron/electronConfigPlugin' +import { electronTemplates } from './app/plugins/electron/templatesPlugin' +import { xtermPlugin } from './app/plugins/electron/xtermPlugin' + + const isElectron = require('is-electron') @@ -52,13 +60,14 @@ const remixLib = require('@remix-project/remix-lib') import { QueryParams } from '@remix-project/remix-lib' import { SearchPlugin } from './app/tabs/search' +import { ElectronProvider } from './app/files/electronProvider' const Storage = remixLib.Storage const RemixDProvider = require('./app/files/remixDProvider') const Config = require('./config') const FileManager = require('./app/files/fileManager') -const FileProvider = require('./app/files/fileProvider') +import FileProvider from "./app/files/fileProvider" const DGitProvider = require('./app/files/dgitProvider') const WorkspaceFileProvider = require('./app/files/workspaceFileProvider') @@ -74,8 +83,11 @@ const Editor = require('./app/editor/editor') const Terminal = require('./app/panels/terminal') const { TabProxy } = require('./app/panels/tab-proxy.js') + + class AppComponent { constructor() { + this.appManager = new RemixAppManager({}) this.queryParams = new QueryParams() this._components = {} @@ -106,6 +118,12 @@ class AppComponent { name: 'fileproviders/workspace' }) + this._components.filesProviders.electron = new ElectronProvider(this.appManager) + Registry.getInstance().put({ + api: this._components.filesProviders.electron, + name: 'fileproviders/electron' + }) + Registry.getInstance().put({ api: this._components.filesProviders, name: 'fileproviders' @@ -181,6 +199,9 @@ class AppComponent { //----- search const search = new SearchPlugin() + //---- templates + const templates = new TemplatesPlugin() + //---------------- Solidity UML Generator ------------------------- const solidityumlgen = new SolidityUmlGen(appManager) @@ -257,6 +278,7 @@ class AppComponent { const permissionHandler = new PermissionHandlerPlugin() + this.engine.register([ permissionHandler, this.layout, @@ -302,9 +324,24 @@ class AppComponent { search, solidityumlgen, contractFlattener, - solidityScript + solidityScript, + templates ]) + //---- fs plugin + if (isElectron()) { + const FSPlugin = new fsPlugin() + this.engine.register([FSPlugin]) + const isoGit = new isoGitPlugin() + this.engine.register([isoGit]) + const electronConfigPlugin = new electronConfig() + this.engine.register([electronConfigPlugin]) + const templatesPlugin = new electronTemplates() + this.engine.register([templatesPlugin]) + const xterm = new xtermPlugin() + this.engine.register([xterm]) + } + // LAYOUT & SYSTEM VIEWS const appPanel = new MainPanel() Registry.getInstance().put({ api: this.mainview, name: 'mainview' }) @@ -418,7 +455,11 @@ class AppComponent { await this.appManager.activatePlugin(['hiddenPanel', 'pluginManager', 'codeParser', 'codeFormatter', 'fileDecorator', 'terminal', 'blockchain', 'fetchAndCompile', 'contentImport', 'gistHandler']) await this.appManager.activatePlugin(['settings']) await this.appManager.activatePlugin(['walkthrough', 'storage', 'search', 'compileAndRun', 'recorder']) - await this.appManager.activatePlugin(['solidity-script']) + await this.appManager.activatePlugin(['solidity-script', 'remix-templates']) + + if(isElectron()){ + await this.appManager.activatePlugin(['fs', 'isogit', 'electronconfig', 'electronTemplates', 'xterm']) + } this.appManager.on( 'filePanel', @@ -432,6 +473,7 @@ class AppComponent { } ) + await this.appManager.activatePlugin(['filePanel']) // Set workspace after initial activation this.appManager.on('editor', 'editorMounted', () => { diff --git a/apps/remix-ide/src/app/files/dgitProvider.js b/apps/remix-ide/src/app/files/dgitProvider.ts similarity index 62% rename from apps/remix-ide/src/app/files/dgitProvider.js rename to apps/remix-ide/src/app/files/dgitProvider.ts index 9fd3fa7e37..aa14683a77 100644 --- a/apps/remix-ide/src/app/files/dgitProvider.js +++ b/apps/remix-ide/src/app/files/dgitProvider.ts @@ -10,10 +10,11 @@ import { } from 'file-saver' import http from 'isomorphic-git/http/web' -const JSZip = require('jszip') -const path = require('path') -const FormData = require('form-data') -const axios = require('axios') +import JSZip from 'jszip' +import path from 'path' +import FormData from 'form-data' +import axios from 'axios' +import isElectron from 'is-electron' const profile = { name: 'dGitProvider', @@ -21,11 +22,17 @@ const profile = { description: 'Decentralized git provider', icon: 'assets/img/fileManager.webp', version: '0.0.1', - methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem'], + methods: ['init', 'localStorageUsed', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'version'], kind: 'file-system' } class DGitProvider extends Plugin { - constructor () { + ipfsconfig: { host: string; port: number; protocol: string; ipfsurl: string } + globalIPFSConfig: { host: string; port: number; protocol: string; ipfsurl: string } + remixIPFS: { host: string; port: number; protocol: string; ipfsurl: string } + ipfsSources: any[] + ipfs: any + filesToSend: any[] + constructor() { super(profile) this.ipfsconfig = { host: 'jqgt.remixproject.org', @@ -48,7 +55,15 @@ class DGitProvider extends Plugin { this.ipfsSources = [this.remixIPFS, this.globalIPFSConfig, this.ipfsconfig] } - async getGitConfig () { + async getGitConfig() { + + if (isElectron()) { + return { + fs: window.remixFileSystem, + dir: '/' + } + } + const workspace = await this.call('filePanel', 'getCurrentWorkspace') if (!workspace) return @@ -58,7 +73,7 @@ class DGitProvider extends Plugin { } } - async parseInput (input) { + async parseInput(input) { return { corsProxy: 'https://corsproxy.remixproject.org/', http, @@ -73,7 +88,15 @@ class DGitProvider extends Plugin { } } - async init (input) { + async init(input?) { + if (isElectron()) { + await this.call('isogit', 'init', { + defaultBranch: (input && input.branch) || 'main' + }) + this.emit('init') + return + } + await git.init({ ...await this.getGitConfig(), defaultBranch: (input && input.branch) || 'main' @@ -81,51 +104,117 @@ class DGitProvider extends Plugin { this.emit('init') } - async status (cmd) { + async version() { + if (isElectron()) { + return await this.call('isogit', 'version') + } + + const version = 'built-in' + return version + } + + async status(cmd) { + + if (isElectron()) { + const status = await this.call('isogit', 'status', cmd) + + return status + } + + const status = await git.statusMatrix({ ...await this.getGitConfig(), ...cmd }) + return status } - async add (cmd) { - await git.add({ - ...await this.getGitConfig(), - ...cmd - }) + async add(cmd) { + + if (isElectron()) { + await this.call('isogit', 'add', cmd) + } else { + await git.add({ + ...await this.getGitConfig(), + ...cmd + }) + } + this.emit('add') } - async rm (cmd) { - await git.remove({ - ...await this.getGitConfig(), - ...cmd - }) + async rm(cmd) { + + if (isElectron()) { + await this.call('isogit', 'rm', cmd) + } else { + await git.remove({ + ...await this.getGitConfig(), + ...cmd + }) + this.emit('rm') + + } } - async checkout (cmd, refresh = true) { - await git.checkout({ - ...await this.getGitConfig(), - ...cmd - }) + async reset(cmd) { + + if (isElectron()) { + await this.call('isogit', 'reset', cmd) + } else { + await git.resetIndex({ + ...await this.getGitConfig(), + ...cmd + }) + this.emit('rm') + + } + } + + async checkout(cmd, refresh = true) { + + if (isElectron()) { + await this.call('isogit', 'checkout', cmd) + } else { + await git.checkout({ + ...await this.getGitConfig(), + ...cmd + }) + } if (refresh) { - setTimeout(async () => { + setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) } this.emit('checkout') } - async log (cmd) { + async log(cmd) { + + if (isElectron()) { + const status = await this.call('isogit', 'log', { + ...cmd, + depth: 10 + }) + + return status + } + + const status = await git.log({ ...await this.getGitConfig(), - ...cmd + ...cmd, + depth: 10 }) return status } - async remotes (config) { + async remotes(config) { + if (isElectron()) { + return await this.call('isogit', 'remotes', config) + } + let remotes = [] try { remotes = await git.listRemotes({ ...config ? config : await this.getGitConfig() }) @@ -135,13 +224,19 @@ class DGitProvider extends Plugin { return remotes } - async branch (cmd, refresh = true) { - const status = await git.branch({ - ...await this.getGitConfig(), - ...cmd - }) + async branch(cmd, refresh = true) { + + let status + if (isElectron()) { + status = await this.call('isogit', 'branch', cmd) + } else { + status = await git.branch({ + ...await this.getGitConfig(), + ...cmd + }) + } if (refresh) { - setTimeout(async () => { + setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) } @@ -149,20 +244,32 @@ class DGitProvider extends Plugin { return status } - async currentbranch (config) { - try{ + async currentbranch(config) { + + + + if (isElectron()) { + return await this.call('isogit', 'currentbranch') + } + + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const name = await git.currentBranch(cmd) return name - }catch(e){ + } catch (e) { return '' } } - async branches (config) { - try{ + async branches(config) { + + if (isElectron()) { + return await this.call('isogit', 'branches') + } + + try { const defaultConfig = await this.getGitConfig() const cmd = config ? defaultConfig ? { ...defaultConfig, ...config } : config : defaultConfig const remotes = await this.remotes(config) @@ -174,26 +281,44 @@ class DGitProvider extends Plugin { branches = [...branches, ...remotebranches] } return branches - }catch(e){ + } catch (e) { return [] } } - async commit (cmd) { - await this.init() - try { - const sha = await git.commit({ - ...await this.getGitConfig(), - ...cmd - }) - this.emit('commit') - return sha - } catch (e) { - throw new Error(e) + async commit(cmd) { + + if (isElectron()) { + try { + await this.call('isogit', 'init') + const sha = await this.call('isogit', 'commit', cmd) + this.emit('commit') + return sha + } catch (e) { + throw new Error(e) + } + } else { + + await this.init() + try { + const sha = await git.commit({ + ...await this.getGitConfig(), + ...cmd + }) + this.emit('commit') + return sha + } catch (e) { + throw new Error(e) + } } } - async lsfiles (cmd) { + async lsfiles(cmd) { + + if (isElectron()) { + return await this.call('isogit', 'lsfiles', cmd) + } + const filesInStaging = await git.listFiles({ ...await this.getGitConfig(), ...cmd @@ -201,7 +326,12 @@ class DGitProvider extends Plugin { return filesInStaging } - async resolveref (cmd) { + async resolveref(cmd) { + + if (isElectron()) { + return await this.call('isogit', 'resolveref', cmd) + } + const oid = await git.resolveRef({ ...await this.getGitConfig(), ...cmd @@ -209,22 +339,27 @@ class DGitProvider extends Plugin { return oid } - async readblob (cmd) { + async readblob(cmd) { + if (isElectron()) { + const readBlobResult = await this.call('isogit', 'readblob', cmd) + return readBlobResult + } const readBlobResult = await git.readBlob({ ...await this.getGitConfig(), ...cmd }) + return readBlobResult } - async setIpfsConfig (config) { + async setIpfsConfig(config) { this.ipfsconfig = config return new Promise((resolve) => { resolve(this.checkIpfsConfig()) }) } - async checkIpfsConfig (config) { + async checkIpfsConfig(config?) { this.ipfs = IpfsHttpClient(config || this.ipfsconfig) try { await this.ipfs.config.getAll() @@ -234,43 +369,68 @@ class DGitProvider extends Plugin { } } - async addremote (input) { + async addremote(input) { + if (isElectron()) { + await this.call('isogit', 'addremote', { url: input.url, remote: input.remote }) + return + } await git.addRemote({ ...await this.getGitConfig(), url: input.url, remote: input.remote }) } - async delremote (input) { + async delremote(input) { + if (isElectron()) { + await this.call('isogit', 'delremote', { remote: input.remote }) + return + } await git.deleteRemote({ ...await this.getGitConfig(), remote: input.remote }) } - async localStorageUsed () { + async localStorageUsed() { return this.calculateLocalStorage() } - async clone (input, workspaceName, workspaceExists = false) { - const permission = await this.askUserPermission('clone', 'Import multiple files into your workspaces.') - if (!permission) return false - if (this.calculateLocalStorage() > 10000) throw new Error('The local storage of the browser is full.') - if (!workspaceExists) await this.call('filePanel', 'createWorkspace', workspaceName || `workspace_${Date.now()}`, true) - const cmd = { - url: input.url, - singleBranch: input.singleBranch, - ref: input.branch, - depth: input.depth || 10, - ...await this.parseInput(input), - ...await this.getGitConfig() - } + async clone(input, workspaceName, workspaceExists = false) { - const result = await git.clone(cmd) - if (!workspaceExists) { - setTimeout(async () => { - await this.call('fileManager', 'refresh') - }, 1000) + if (isElectron()) { + const folder = await this.call('fs', 'selectFolder') + if (!folder) return false + const cmd = { + url: input.url, + singleBranch: input.singleBranch, + ref: input.branch, + depth: input.depth || 10, + dir: folder, + input + } + const result = await this.call('isogit', 'clone', cmd) + this.call('fs', 'openWindow', folder) + return result + } else { + const permission = await this.askUserPermission('clone', 'Import multiple files into your workspaces.') + if (!permission) return false + if (parseFloat(this.calculateLocalStorage()) > 10000) throw new Error('The local storage of the browser is full.') + if (!workspaceExists) await this.call('filePanel', 'createWorkspace', workspaceName || `workspace_${Date.now()}`, true) + const cmd = { + url: input.url, + singleBranch: input.singleBranch, + ref: input.branch, + depth: input.depth || 10, + ...await this.parseInput(input), + ...await this.getGitConfig() + } + + const result = await git.clone(cmd) + if (!workspaceExists) { + setTimeout(async () => { + await this.call('fileManager', 'refresh') + }, 1000) + } + this.emit('clone') + return result } - this.emit('clone') - return result } - async push (input) { + async push(input) { const cmd = { force: input.force, ref: input.ref, @@ -280,13 +440,25 @@ class DGitProvider extends Plugin { name: input.name, email: input.email }, - ...await this.parseInput(input), - ...await this.getGitConfig() + input, + } + if (isElectron()) { + return await this.call('isogit', 'push', cmd) + } else { + + const cmd2 = { + ...cmd, + ...await this.parseInput(input), + } + return await git.push({ + ...await this.getGitConfig(), + ...cmd2 + }) + } - return await git.push(cmd) } - async pull (input) { + async pull(input) { const cmd = { ref: input.ref, remoteRef: input.remoteRef, @@ -295,17 +467,29 @@ class DGitProvider extends Plugin { email: input.email }, remote: input.remote, - ...await this.parseInput(input), - ...await this.getGitConfig() + input, + } + let result + if (isElectron()) { + result = await this.call('isogit', 'pull', cmd) + } + else { + const cmd2 = { + ...cmd, + ...await this.parseInput(input), + } + result = await git.pull({ + ...await this.getGitConfig(), + ...cmd2 + }) } - const result = await git.pull(cmd) setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) return result } - async fetch (input) { + async fetch(input) { const cmd = { ref: input.ref, remoteRef: input.remoteRef, @@ -314,17 +498,28 @@ class DGitProvider extends Plugin { email: input.email }, remote: input.remote, - ...await this.parseInput(input), - ...await this.getGitConfig() + input + } + let result + if (isElectron()) { + result = await this.call('isogit', 'fetch', cmd) + } else { + const cmd2 = { + ...cmd, + ...await this.parseInput(input), + } + result = await git.fetch({ + ...await this.getGitConfig(), + ...cmd2 + }) } - const result = await git.fetch(cmd) setTimeout(async () => { await this.call('fileManager', 'refresh') }, 1000) return result } - async export (config) { + async export(config) { if (!this.checkIpfsConfig(config)) return false const workspace = await this.call('filePanel', 'getCurrentWorkspace') const files = await this.getDirectory('/') @@ -344,7 +539,7 @@ class DGitProvider extends Plugin { return r.cid.string } - async pin (pinataApiKey, pinataSecretApiKey) { + async pin(pinataApiKey, pinataSecretApiKey) { const workspace = await this.call('filePanel', 'getCurrentWorkspace') const files = await this.getDirectory('/') this.filesToSend = [] @@ -397,21 +592,21 @@ class DGitProvider extends Plugin { .post(url, data, { maxBodyLength: 'Infinity', headers: { - 'Content-Type': `multipart/form-data; boundary=${data._boundary}`, + 'Content-Type': `multipart/form-data; boundary=${(data as any)._boundary}`, pinata_api_key: pinataApiKey, pinata_secret_api_key: pinataSecretApiKey } - }).catch((e) => { + } as any).catch((e) => { console.log(e) }) // also commit to remix IPFS for availability after pinning to Pinata - return await this.export(this.remixIPFS) || result.data.IpfsHash + return await this.export(this.remixIPFS) || (result as any).data.IpfsHash } catch (error) { throw new Error(error) } } - async pinList (pinataApiKey, pinataSecretApiKey) { + async pinList(pinataApiKey, pinataSecretApiKey) { const url = 'https://api.pinata.cloud/data/pinList?status=pinned' try { const result = await axios @@ -421,16 +616,16 @@ class DGitProvider extends Plugin { pinata_api_key: pinataApiKey, pinata_secret_api_key: pinataSecretApiKey } - }).catch((e) => { + } as any).catch((e) => { console.log('Pinata unreachable') }) - return result.data + return (result as any).data } catch (error) { throw new Error(error) } } - async unPin (pinataApiKey, pinataSecretApiKey, hashToUnpin) { + async unPin(pinataApiKey, pinataSecretApiKey, hashToUnpin) { const url = `https://api.pinata.cloud/pinning/unpin/${hashToUnpin}` try { await axios @@ -446,7 +641,7 @@ class DGitProvider extends Plugin { } } - async importIPFSFiles (config, cid, workspace) { + async importIPFSFiles(config, cid, workspace) { const ipfs = IpfsHttpClient(config) let result = false try { @@ -475,9 +670,9 @@ class DGitProvider extends Plugin { return result } - calculateLocalStorage () { - var _lsTotal = 0 - var _xLen; var _x + calculateLocalStorage() { + let _lsTotal = 0 + let _xLen; let _x for (_x in localStorage) { // eslint-disable-next-line no-prototype-builtins if (!localStorage.hasOwnProperty(_x)) { @@ -489,10 +684,10 @@ class DGitProvider extends Plugin { return (_lsTotal / 1024).toFixed(2) } - async import (cmd) { + async import(cmd) { const permission = await this.askUserPermission('import', 'Import multiple files into your workspaces.') if (!permission) return false - if (this.calculateLocalStorage() > 10000) throw new Error('The local storage of the browser is full.') + if (parseFloat(this.calculateLocalStorage()) > 10000) throw new Error('The local storage of the browser is full.') const cid = cmd.cid await this.call('filePanel', 'createWorkspace', `workspace_${Date.now()}`, true) const workspace = await this.call('filePanel', 'getCurrentWorkspace') @@ -508,13 +703,13 @@ class DGitProvider extends Plugin { if (!result) throw new Error(`Cannot pull files from IPFS at ${cid}`) } - async getItem (name) { + async getItem(name) { if (typeof window !== 'undefined') { return window.localStorage.getItem(name) } } - async setItem (name, content) { + async setItem(name, content) { try { if (typeof window !== 'undefined') { window.localStorage.setItem(name, content) @@ -526,7 +721,7 @@ class DGitProvider extends Plugin { return true } - async zip () { + async zip() { const zip = new JSZip() const workspace = await this.call('filePanel', 'getCurrentWorkspace') const files = await this.getDirectory('/') @@ -543,7 +738,7 @@ class DGitProvider extends Plugin { }) } - async createDirectories (strdirectories) { + async createDirectories(strdirectories) { const ignore = ['.', '/.', ''] if (ignore.indexOf(strdirectories) > -1) return false const directories = strdirectories.split('/') @@ -561,7 +756,7 @@ class DGitProvider extends Plugin { } } - async getDirectory (dir) { + async getDirectory(dir) { let result = [] const files = await this.call('fileManager', 'readdir', dir) const fileArray = normalize(files) @@ -585,7 +780,7 @@ class DGitProvider extends Plugin { } const addSlash = (file) => { - if (!file.startsWith('/'))file = '/' + file + if (!file.startsWith('/')) file = '/' + file return file } diff --git a/apps/remix-ide/src/app/files/electronProvider.ts b/apps/remix-ide/src/app/files/electronProvider.ts new file mode 100644 index 0000000000..3543f756a4 --- /dev/null +++ b/apps/remix-ide/src/app/files/electronProvider.ts @@ -0,0 +1,84 @@ +import FileProvider from "./fileProvider" + + +declare global { + interface Window { + remixFileSystem: any + } +} + +export class ElectronProvider extends FileProvider { + _appManager: any + constructor(appManager) { + super('') + this._appManager = appManager + + } + + async init() { + this._appManager.on('fs', 'change', (event, path) => { + switch (event) { + case 'add': + this.event.emit('fileAdded', path) + break + case 'unlink': + this.event.emit('fileRemoved', path) + break + case 'change': + this.get(path, (_error, content) => { + this.event.emit('fileExternallyChanged', path, content, false) + }) + break + case 'rename': + this.event.emit('fileRenamed', path) + break + case 'addDir': + this.event.emit('folderAdded', path) + break + case 'unlinkDir': + this.event.emit('fileRemoved', path) + } + }) + } + + // isDirectory is already included + // this is a more efficient version of the default implementation + async resolveDirectory(path, cb) { + path = this.removePrefix(path) + if (path.indexOf('/') !== 0) path = '/' + path + try { + const files = await window.remixFileSystem.readdir(path) + const ret = {} + if (files) { + for (const element of files) { + path = path.replace(/^\/|\/$/g, '') // remove first and last slash + const file = element.file.replace(/^\/|\/$/g, '') // remove first and last slash + const absPath = (path === '/' ? '' : path) + '/' + file + ret[absPath.indexOf('/') === 0 ? absPath.substr(1, absPath.length) : absPath] = { isDirectory: element.isDirectory } + // ^ ret does not accept path starting with '/' + } + } + //console.log(ret, 'ret resolveDirectory ELECTRON') + if (cb) cb(null, ret) + return ret + } catch (error) { + if (cb) cb(error, null) + } + } + + /** + * Removes the folder recursively + * @param {*} path is the folder to be removed + */ + async remove(path: string) { + console.log('remove', path) + try { + await window.remixFileSystem.rmdir(path) + return true + } catch (error) { + console.log(error) + return false + } + } + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/files/fileManager.ts b/apps/remix-ide/src/app/files/fileManager.ts index db42bc3335..e8df1f79d8 100644 --- a/apps/remix-ide/src/app/files/fileManager.ts +++ b/apps/remix-ide/src/app/files/fileManager.ts @@ -9,6 +9,8 @@ import { fileChangedToastMsg, recursivePasteToastMsg, storageFullMessage } from import helper from '../../lib/helper.js' import { RemixAppManager } from '../../remixAppManager' +import isElectron from 'is-electron' + /* attach to files event (removed renamed) trigger: currentFileChanged @@ -22,7 +24,7 @@ const profile = { permission: true, version: packageJson.version, methods: ['closeAllFiles', 'closeFile', 'file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'copyDir', 'rename', 'mkdir', - 'readdir', 'dirList', 'fileList', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile', 'refresh', + 'readdir', 'dirList', 'fileList', 'remove', 'getCurrentFile', 'getFile', 'selectFolder', 'setFile', 'switchFile', 'refresh', 'getProviderOf', 'getProviderByName', 'getPathFromUrl', 'getUrlFromPath', 'saveCurrentFile', 'setBatchFiles', 'isGitRepo'], kind: 'file-system' } @@ -153,8 +155,12 @@ class FileManager extends Plugin { refresh() { const provider = this.fileProviderOf('/') // emit rootFolderChanged so that File Explorer reloads the file tree - provider.event.emit('rootFolderChanged', provider.workspace || '/') - this.emit('rootFolderChanged', provider.workspace || '/') + if(isElectron()){ + provider.event.emit('refresh') + }else{ + provider.event.emit('rootFolderChanged', provider.workspace || '/') + this.emit('rootFolderChanged', provider.workspace || '/') + } } /** @@ -189,8 +195,8 @@ class FileManager extends Plugin { path = this.normalize(path) path = this.limitPluginScope(path) path = this.getPathFromUrl(path).file - await this._handleExists(path, `Cannot open file ${path}`) - await this._handleIsFile(path, `Cannot open file ${path}`) + //await this._handleExists(path, `Cannot open file ${path}`) + //await this._handleIsFile(path, `Cannot open file ${path}`) await this.openFile(path) } @@ -408,7 +414,6 @@ class FileManager extends Plugin { return new Promise((resolve, reject) => { const provider = this.fileProviderOf(path) - provider.resolveDirectory(path, (error, filesProvider) => { if (error) reject(error) resolve(filesProvider) @@ -442,7 +447,8 @@ class FileManager extends Plugin { browserExplorer: this._components.registry.get('fileproviders/browser').api, localhostExplorer: this._components.registry.get('fileproviders/localhost').api, workspaceExplorer: this._components.registry.get('fileproviders/workspace').api, - filesProviders: this._components.registry.get('fileproviders').api + filesProviders: this._components.registry.get('fileproviders').api, + electronExplorer: this._components.registry.get('fileproviders/electron').api, } this._deps.config.set('currentFile', '') // make sure we remove the current file from the previous session @@ -460,6 +466,11 @@ class FileManager extends Plugin { this._deps.workspaceExplorer.event.on('fileRemoved', (path) => { this.fileRemovedEvent(path) }) this._deps.workspaceExplorer.event.on('fileAdded', (path) => { this.fileAddedEvent(path) }) + this._deps.electronExplorer.event.on('fileChanged', (path) => { this.fileChangedEvent(path) }) + this._deps.electronExplorer.event.on('fileRenamed', (oldName, newName, isFolder) => { this.fileRenamedEvent(oldName, newName, isFolder) }) + this._deps.electronExplorer.event.on('fileRemoved', (path) => { this.fileRemovedEvent(path) }) + this._deps.electronExplorer.event.on('fileAdded', (path) => { this.fileAddedEvent(path) }) + this.getCurrentFile = this.file this.getFile = this.readFile this.getFolder = this.readdir @@ -721,8 +732,9 @@ class FileManager extends Plugin { if (file.startsWith('localhost') || this.mode === 'localhost') { return this._deps.filesProviders.localhost } - if (file.startsWith('browser')) { - return this._deps.filesProviders.browser + + if(isElectron()){ + return this._deps.filesProviders.electron } return this._deps.filesProviders.workspace } @@ -846,6 +858,10 @@ class FileManager extends Plugin { } currentWorkspace() { + if(isElectron()){ + return '' + } + if (this.mode !== 'localhost') { const file = this.currentFile() || '' const provider = this.fileProviderOf(file) diff --git a/apps/remix-ide/src/app/files/fileProvider.js b/apps/remix-ide/src/app/files/fileProvider.ts similarity index 92% rename from apps/remix-ide/src/app/files/fileProvider.js rename to apps/remix-ide/src/app/files/fileProvider.ts index 9b7e63efdf..6f82421f61 100644 --- a/apps/remix-ide/src/app/files/fileProvider.js +++ b/apps/remix-ide/src/app/files/fileProvider.ts @@ -1,12 +1,17 @@ 'use strict' import { CompilerImports } from '@remix-project/core-plugin' -const EventManager = require('events') -const remixLib = require('@remix-project/remix-lib') -const pathModule = require('path') -const Storage = remixLib.Storage +import EventManager from 'events' +import { Storage } from '@remix-project/remix-lib' +import pathModule from 'path' -class FileProvider { + +export default class FileProvider { + event: any + type: any + providerExternalsStorage: any + externalFolders: string[] + reverseKey: string constructor (name) { this.event = new EventManager() this.type = name @@ -79,7 +84,7 @@ class FileProvider { async _exists (path) { path = this.getPathFromUrl(path) || path // ensure we actually use the normalized path from here - var unprefixedpath = this.removePrefix(path) + const unprefixedpath = this.removePrefix(path) return path === this.type ? true : await window.remixFileSystem.exists(unprefixedpath) } @@ -90,7 +95,7 @@ class FileProvider { async get (path, cb) { cb = cb || function () { /* do nothing. */ } path = this.getPathFromUrl(path) || path // ensure we actually use the normalized path from here - var unprefixedpath = this.removePrefix(path) + const unprefixedpath = this.removePrefix(path) try { const content = await window.remixFileSystem.readFile(unprefixedpath, 'utf8') if (cb) cb(null, content) @@ -103,13 +108,13 @@ class FileProvider { async set (path, content, cb) { cb = cb || function () { /* do nothing. */ } - var unprefixedpath = this.removePrefix(path) + const unprefixedpath = this.removePrefix(path) const exists = await window.remixFileSystem.exists(unprefixedpath) if (exists && await window.remixFileSystem.readFile(unprefixedpath, 'utf8') === content) { if (cb) cb() return null } - await this.createDir(path.substr(0, path.lastIndexOf('/'))) + await this.createDir(path.substr(0, path.lastIndexOf('/')), null) try { await window.remixFileSystem.writeFile(unprefixedpath, content, 'utf8') } catch (e) { @@ -152,7 +157,7 @@ class FileProvider { // this will not add a folder as readonly but keep the original url to be able to restore it later async addExternal (path, content, url) { if (url) this.addNormalizedName(path, url) - return await this.set(path, content) + return await this.set(path, content, null) } isReadOnly (path) { @@ -161,7 +166,8 @@ class FileProvider { async isDirectory (path) { const unprefixedpath = this.removePrefix(path) - return path === this.type ? true : (await window.remixFileSystem.stat(unprefixedpath)).isDirectory() + const isDirectory = path === this.type ? true : (await window.remixFileSystem.stat(unprefixedpath)).isDirectory() + return isDirectory } async isFile (path) { @@ -174,7 +180,7 @@ class FileProvider { * Removes the folder recursively * @param {*} path is the folder to be removed */ - async remove (path) { + async remove (path: string) { path = this.removePrefix(path) if (await window.remixFileSystem.exists(path)) { const stat = await window.remixFileSystem.stat(path) @@ -225,7 +231,7 @@ class FileProvider { visitFolder({ path }) if (items.length !== 0) { for (const item of items) { - const file = {} + const file: any = {} const curPath = `${path}${path.endsWith('/') ? '' : '/'}${item}` if ((await window.remixFileSystem.stat(curPath)).isDirectory()) { file.children = await this._copyFolderToJsonInternal(curPath, visitFile, visitFolder) @@ -266,8 +272,8 @@ class FileProvider { } async rename (oldPath, newPath, isFolder) { - var unprefixedoldPath = this.removePrefix(oldPath) - var unprefixednewPath = this.removePrefix(newPath) + const unprefixedoldPath = this.removePrefix(oldPath) + const unprefixednewPath = this.removePrefix(newPath) if (await this._exists(unprefixedoldPath)) { await window.remixFileSystem.rename(unprefixedoldPath, unprefixednewPath) this.event.emit('fileRenamed', @@ -321,4 +327,3 @@ class FileProvider { } } -module.exports = FileProvider diff --git a/apps/remix-ide/src/app/files/remixDProvider.js b/apps/remix-ide/src/app/files/remixDProvider.js index c52055e04f..62171fdc5b 100644 --- a/apps/remix-ide/src/app/files/remixDProvider.js +++ b/apps/remix-ide/src/app/files/remixDProvider.js @@ -1,5 +1,5 @@ 'use strict' -const FileProvider = require('./fileProvider') +import FileProvider from "./fileProvider" module.exports = class RemixDProvider extends FileProvider { constructor (appManager) { diff --git a/apps/remix-ide/src/app/files/workspaceFileProvider.js b/apps/remix-ide/src/app/files/workspaceFileProvider.js index 6193e7b486..3b3981cb47 100644 --- a/apps/remix-ide/src/app/files/workspaceFileProvider.js +++ b/apps/remix-ide/src/app/files/workspaceFileProvider.js @@ -1,7 +1,7 @@ 'use strict' const EventManager = require('events') -const FileProvider = require('./fileProvider') +import FileProvider from "./fileProvider" class WorkspaceFileProvider extends FileProvider { constructor () { diff --git a/apps/remix-ide/src/app/panels/file-panel.js b/apps/remix-ide/src/app/panels/file-panel.js index b391daf5bd..4aacb4053a 100644 --- a/apps/remix-ide/src/app/panels/file-panel.js +++ b/apps/remix-ide/src/app/panels/file-panel.js @@ -30,7 +30,7 @@ const { SlitherHandle } = require('../files/slither-handle.js') const profile = { name: 'filePanel', displayName: 'File explorer', - methods: ['createNewFile', 'uploadFile', 'getCurrentWorkspace', 'getAvailableWorkspaceName', 'getWorkspaces', 'createWorkspace', 'setWorkspace', 'registerContextMenuItem', 'renameWorkspace', 'deleteWorkspace'], + methods: ['createNewFile', 'uploadFile', 'getCurrentWorkspace', 'getAvailableWorkspaceName', 'getWorkspaces', 'createWorkspace', 'setWorkspace', 'registerContextMenuItem', 'renameWorkspace', 'deleteWorkspace', 'loadTemplate', 'clone'], events: ['setWorkspace', 'workspaceRenamed', 'workspaceDeleted', 'workspaceCreated'], icon: 'assets/img/fileManager.webp', description: 'Remix IDE file explorer', diff --git a/apps/remix-ide/src/app/panels/terminal.js b/apps/remix-ide/src/app/panels/terminal.js index dac831c0c8..e2cbd06fb0 100644 --- a/apps/remix-ide/src/app/panels/terminal.js +++ b/apps/remix-ide/src/app/panels/terminal.js @@ -6,14 +6,16 @@ import * as packageJson from '../../../../../package.json' import Registry from '../state/registry' import { PluginViewWrapper } from '@remix-ui/helper' import vm from 'vm' +import isElectron from 'is-electron' const EventManager = require('../../lib/events') import { CompilerImports } from '@remix-project/core-plugin' // eslint-disable-line +import { RemixUiXterminals } from '@remix-ui/xterm' const KONSOLES = [] -function register (api) { KONSOLES.push(api) } +function register(api) { KONSOLES.push(api) } const profile = { displayName: 'Terminal', @@ -25,7 +27,7 @@ const profile = { } class Terminal extends Plugin { - constructor (opts, api) { + constructor(opts, api) { super(profile) this.fileImport = new CompilerImports() this.event = new EventManager() @@ -81,26 +83,26 @@ class Terminal extends Plugin { this.call('debugger', 'debug', hash) }) this.dispatch = null - + } - + onActivation() { this.renderComponent() } - onDeactivation () { + onDeactivation() { this.off('scriptRunner', 'log') this.off('scriptRunner', 'info') this.off('scriptRunner', 'warn') this.off('scriptRunner', 'error') } - logHtml (html) { + logHtml(html) { this.terminalApi.logHtml(html) } - log (message, type) { + log(message, type) { this.terminalApi.log(message, type) } @@ -108,18 +110,20 @@ class Terminal extends Plugin { this.dispatch = dispatch } - render () { - return
+ render() { + return
} updateComponent(state) { - return + return isElectron() ? + + : } - renderComponent () { + renderComponent() { const onReady = (api) => { this.terminalApi = api } this.dispatch({ plugin: this, @@ -127,7 +131,7 @@ class Terminal extends Plugin { }) } - scroll2bottom () { + scroll2bottom() { setTimeout(function () { // do nothing. }, 0) diff --git a/apps/remix-ide/src/app/plugins/electron/electronConfigPlugin.ts b/apps/remix-ide/src/app/plugins/electron/electronConfigPlugin.ts new file mode 100644 index 0000000000..3289b4a845 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/electronConfigPlugin.ts @@ -0,0 +1,19 @@ +import { ElectronPlugin } from '@remixproject/engine-electron'; + +export class electronConfig extends ElectronPlugin { + constructor() { + super({ + displayName: 'electronconfig', + name: 'electronconfig', + description: 'electronconfig', + }) + this.methods = [] + + } + + onActivation(): void { + + } + + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/electron/fsPlugin.ts b/apps/remix-ide/src/app/plugins/electron/fsPlugin.ts new file mode 100644 index 0000000000..e016f922d7 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/fsPlugin.ts @@ -0,0 +1,143 @@ +import { ElectronPlugin } from '@remixproject/engine-electron'; + +let workingDir = null + +const fixPath = (path: string) => { + return path +} + +export class fsPlugin extends ElectronPlugin { + public fs: any + public fsSync: any + + constructor() { + super({ + displayName: 'fs', + name: 'fs', + description: 'fs', + }) + this.methods = ['readdir', 'readFile', 'writeFile', 'mkdir', 'rmdir', 'unlink', 'rename', 'stat', 'lstat', 'exists', 'setWorkingDir', 'getRecentFolders', 'glob', 'openWindow'] + + // List of commands all filesystems are expected to provide. `rm` is not + // included since it may not exist and must be handled as a special case + const commands = [ + 'readFile', + 'writeFile', + 'mkdir', + 'rmdir', + 'unlink', + 'stat', + 'lstat', + 'readdir', + 'readlink', + 'symlink', + ] + + this.fs = { + + exists: async (path: string) => { + path = fixPath(path) + const exists = await this.call('fs', 'exists', path) + return exists + }, + rmdir: async (path: string) => { + path = fixPath(path) + return await this.call('fs', 'rmdir', path) + }, + readdir: async (path: string) => { + path = fixPath(path) + const files = await this.call('fs', 'readdir', path) + return files + }, + glob: async (path: string, pattern: string, options?: any) => { + path = fixPath(path) + const files = await this.call('fs', 'glob', path, pattern, options) + return files + }, + unlink: async (path: string) => { + path = fixPath(path) + return await this.call('fs', 'unlink', path) + }, + mkdir: async (path: string) => { + path = fixPath(path) + return await this.call('fs', 'mkdir', path) + }, + readFile: async (path: string, options) => { + try { + path = fixPath(path) + const file = await this.call('fs', 'readFile', path, options) + return file + } catch (e) { + return undefined + } + } + , + rename: async (from: string, to: string) => { + return await this.call('fs', 'rename', from, to) + }, + writeFile: async (path: string, content: string, options: any) => { + path = fixPath(path) + return await this.call('fs', 'writeFile', path, content, options) + } + , + stat: async (path: string) => { + try { + path = fixPath(path) + const stat = await this.call('fs', 'stat', path) + if(!stat) return undefined + stat.isDirectory = () => stat.isDirectoryValue + stat.isFile = () => !stat.isDirectoryValue + return stat + } catch (e) { + return undefined + } + }, + lstat: async (path: string) => { + try { + path = fixPath(path) + const stat = await this.call('fs', 'lstat', path) + if(!stat) return undefined + stat.isDirectory = () => stat.isDirectoryValue + stat.isFile = () => !stat.isDirectoryValue + return stat + } catch (e) { + return undefined + } + }, + readlink: async (path: string) => { + path = fixPath(path) + return await this.call('fs', 'readlink', path) + }, + symlink: async (target: string, path: string) => { + path = fixPath(path) + return await this.call('fs', 'symlink', target, path) + } + + + + + + } + + + + + + + } + + + + + async onActivation() { + + (window as any).remixFileSystem = this.fs; + + + this.on('fs', 'workingDirChanged', async (path: string) => { + workingDir = path + await this.call('fileManager', 'refresh') + }) + } + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/electron/isoGitPlugin.ts b/apps/remix-ide/src/app/plugins/electron/isoGitPlugin.ts new file mode 100644 index 0000000000..a0429da83e --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/isoGitPlugin.ts @@ -0,0 +1,29 @@ +import { ElectronPlugin } from '@remixproject/engine-electron'; + +export class isoGitPlugin extends ElectronPlugin { + constructor() { + super({ + displayName: 'isogit', + name: 'isogit', + description: 'isogit', + }) + this.methods = [] + + } + + async onActivation(): Promise { + + setTimeout(async () => { + const version = await this.call('isogit', 'version') + if(version){ + //this.call('terminal', 'log', version) + }else{ + //this.call('terminal', 'log', 'Git is not installed on the system. Using builtin git instead. Performance will be affected. It is better to install git on the system and configure the credentials to connect to GitHub etc.') + } + + + }, 5000) + } + + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/electron/templatesPlugin.ts b/apps/remix-ide/src/app/plugins/electron/templatesPlugin.ts new file mode 100644 index 0000000000..3d00a906fb --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/templatesPlugin.ts @@ -0,0 +1,15 @@ +import { ElectronPlugin } from '@remixproject/engine-electron'; + +export class electronTemplates extends ElectronPlugin { + constructor() { + super({ + displayName: 'electronTemplates', + name: 'electronTemplates', + description: 'templates', + }) + } + + onActivation(): void { + + } +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/electron/xtermPlugin.ts b/apps/remix-ide/src/app/plugins/electron/xtermPlugin.ts new file mode 100644 index 0000000000..c21a796af6 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/xtermPlugin.ts @@ -0,0 +1,11 @@ +import { ElectronPlugin } from '@remixproject/engine-electron'; + +export class xtermPlugin extends ElectronPlugin { + constructor(){ + super({ + displayName: 'xterm', + name: 'xterm', + description: 'xterm', + }) + } +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/parser/services/code-parser-antlr-service.ts b/apps/remix-ide/src/app/plugins/parser/services/code-parser-antlr-service.ts index ee28b2cc1b..bbf5938e0c 100644 --- a/apps/remix-ide/src/app/plugins/parser/services/code-parser-antlr-service.ts +++ b/apps/remix-ide/src/app/plugins/parser/services/code-parser-antlr-service.ts @@ -4,6 +4,7 @@ import { AstNode } from "@remix-project/remix-solidity" import { CodeParser } from "../code-parser" import { antlr } from '../types' import { pathToFileURL } from 'url' +import isElectron from 'is-electron' const SolidityParser = (window as any).SolidityParser = (window as any).SolidityParser || [] @@ -45,7 +46,7 @@ export default class CodeParserAntlrService { this.worker = new Worker(new URL('./antlr-worker', import.meta.url)) this.worker.postMessage({ cmd: 'load', - url: document.location.protocol + '//' + document.location.host + '/assets/js/parser/antlr.js', + url: isElectron()? 'assets/js/parser/antlr.js': document.location.protocol + '//' + document.location.host + '/assets/js/parser/antlr.js', }); const self = this diff --git a/apps/remix-ide/src/app/plugins/parser/services/code-parser-imports.ts b/apps/remix-ide/src/app/plugins/parser/services/code-parser-imports.ts index bdc0837b45..1af4591ba1 100644 --- a/apps/remix-ide/src/app/plugins/parser/services/code-parser-imports.ts +++ b/apps/remix-ide/src/app/plugins/parser/services/code-parser-imports.ts @@ -1,7 +1,8 @@ 'use strict' import { CodeParser } from "../code-parser"; +import isElectron from 'is-electron' -export type CodeParserImportsData= { +export type CodeParserImportsData = { files?: string[], modules?: string[], packages?: string[], @@ -16,7 +17,7 @@ export default class CodeParserImports { this.init() } - async getImports(){ + async getImports() { return this.data } @@ -27,31 +28,44 @@ export default class CodeParserImports { .filter(x => x !== '') .map(x => x.replace('./node_modules/', '')) .filter(x => { - if(x.includes('@openzeppelin')) { + if (x.includes('@openzeppelin')) { return !x.includes('mock') - }else{ + } else { return true - } + } }) - // get unique first words of the values in the array this.data.packages = [...new Set(this.data.modules.map(x => x.split('/')[0]))] } setFileTree = async () => { - this.data.files = await this.getDirectory('/') - this.data.files = this.data.files.filter(x => x.endsWith('.sol') && !x.startsWith('.deps') && !x.startsWith('.git')) + + if (isElectron()) { + const files = await this.plugin.call('fs', 'glob', '/', '**/*.sol') + // only get path property of files + this.data.files = files.map(x => x.path) + + } else { + + this.data.files = await this.getDirectory('/') + this.data.files = this.data.files.filter(x => x.endsWith('.sol') && !x.startsWith('.deps') && !x.startsWith('.git')) + + + } } getDirectory = async (dir: string) => { + + console.log('getDirectorySEARCH', dir) let result = [] + let files = {} try { if (await this.plugin.call('fileManager', 'exists', dir)) { files = await this.plugin.call('fileManager', 'readdir', dir) } - } catch (e) {} - + } catch (e) { } + const fileArray = this.normalize(files) for (const fi of fileArray) { if (fi) { @@ -63,10 +77,12 @@ export default class CodeParserImports { } } } + return result } normalize = filesList => { + console.log('normalize', filesList) const folders = [] const files = [] Object.keys(filesList || {}).forEach(key => { diff --git a/apps/remix-ide/src/app/plugins/remix-templates.ts b/apps/remix-ide/src/app/plugins/remix-templates.ts new file mode 100644 index 0000000000..e7846fbf47 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/remix-templates.ts @@ -0,0 +1,30 @@ +import { Plugin } from '@remixproject/engine' +import * as templateWithContent from '@remix-project/remix-ws-templates' + +const profile = { + name: 'remix-templates', + displayName: 'remix-templates', + description: 'Remix Templates plugin', + methods: ['getTemplate', 'loadTemplateInNewWindow'], +} + +export class TemplatesPlugin extends Plugin { + + constructor() { + super(profile) + } + + async getTemplate (template: string, opts?: any) { + const templateList = Object.keys(templateWithContent) + if (!templateList.includes(template)) return + // @ts-ignore + const files = await templateWithContent[template](opts) + return files + } + // electron only method + async loadTemplateInNewWindow (template: string, opts?: any) { + const files = await this.getTemplate(template, opts) + this.call('electronTemplates', 'loadTemplateInNewWindow', files) + } +} + diff --git a/apps/remix-ide/src/app/plugins/remixd-handle.tsx b/apps/remix-ide/src/app/plugins/remixd-handle.tsx index a39c52c3d3..f12c82519e 100644 --- a/apps/remix-ide/src/app/plugins/remixd-handle.tsx +++ b/apps/remix-ide/src/app/plugins/remixd-handle.tsx @@ -50,6 +50,7 @@ export class RemixdHandle extends WebsocketPlugin { } async activate() { + console.trace('activate remixd') this.connectToLocalhost() return true } diff --git a/apps/remix-ide/src/app/tabs/locales/en/electron.json b/apps/remix-ide/src/app/tabs/locales/en/electron.json new file mode 100644 index 0000000000..cdf0a75a59 --- /dev/null +++ b/apps/remix-ide/src/app/tabs/locales/en/electron.json @@ -0,0 +1,4 @@ +{ + "electron.openFolder": "Open Folder", + "electron.recentFolders": "Recent Folders" +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/tabs/locales/en/index.js b/apps/remix-ide/src/app/tabs/locales/en/index.js index a5b807a902..e01a36e939 100644 --- a/apps/remix-ide/src/app/tabs/locales/en/index.js +++ b/apps/remix-ide/src/app/tabs/locales/en/index.js @@ -10,6 +10,7 @@ import terminalJson from './terminal.json'; import udappJson from './udapp.json'; import solidityUnitTestingJson from './solidityUnitTesting.json'; import permissionHandlerJson from './permissionHandler.json'; +import electronJson from './electron.json'; export default { ...debuggerJson, @@ -24,4 +25,5 @@ export default { ...udappJson, ...solidityUnitTestingJson, ...permissionHandlerJson, + ...electronJson } diff --git a/apps/remix-ide/src/app/tabs/theme-module.js b/apps/remix-ide/src/app/tabs/theme-module.js index f6e77705ba..f7bc93f440 100644 --- a/apps/remix-ide/src/app/tabs/theme-module.js +++ b/apps/remix-ide/src/app/tabs/theme-module.js @@ -3,6 +3,7 @@ import { EventEmitter } from 'events' import { QueryParams } from '@remix-project/remix-lib' import * as packageJson from '../../../../../package.json' import Registry from '../state/registry' +const isElectron = require('is-electron') const _paq = window._paq = window._paq || [] const themes = [ @@ -30,7 +31,7 @@ const profile = { } export class ThemeModule extends Plugin { - constructor () { + constructor() { super(profile) this.events = new EventEmitter() this._deps = { @@ -39,8 +40,8 @@ export class ThemeModule extends Plugin { this.themes = {} themes.map((theme) => { this.themes[theme.name.toLocaleLowerCase()] = { - ...theme, - url: window.location.origin + ( window.location.pathname.startsWith('/address/') || window.location.pathname.endsWith('.sol') ? '/' : window.location.pathname ) + theme.url + ...theme, + url: isElectron() ? theme.url : window.location.origin + (window.location.pathname.startsWith('/address/') || window.location.pathname.endsWith('.sol') ? '/' : window.location.pathname) + theme.url } }) this._paq = _paq @@ -58,22 +59,26 @@ export class ThemeModule extends Plugin { /** Return the active theme * @return {{ name: string, quality: string, url: string }} - The active theme */ - currentTheme () { + currentTheme() { + if (isElectron()) { + const theme = 'https://remix.ethereum.org/' + this.themes[this.active].url.replace(/\\/g, '/').replace(/\/\//g, '/').replace(/\/$/g, '') + return { ...this.themes[this.active], url: theme } + } return this.themes[this.active] } /** Returns all themes as an array */ - getThemes () { + getThemes() { return Object.keys(this.themes).map(key => this.themes[key]) } /** * Init the theme */ - initTheme (callback) { // callback is setTimeOut in app.js which is always passed + initTheme(callback) { // callback is setTimeOut in app.js which is always passed if (callback) this.initCallback = callback if (this.active) { - document.getElementById('theme-link') ? document.getElementById('theme-link').remove():null + document.getElementById('theme-link') ? document.getElementById('theme-link').remove() : null const nextTheme = this.themes[this.active] // Theme document.documentElement.style.setProperty('--theme', nextTheme.quality) @@ -85,6 +90,7 @@ export class ThemeModule extends Plugin { if (callback) callback() }) document.head.insertBefore(theme, document.head.firstChild) + //if (callback) callback() } } @@ -92,8 +98,8 @@ export class ThemeModule extends Plugin { * Change the current theme * @param {string} [themeName] - The name of the theme */ - switchTheme (themeName) { - themeName = themeName && themeName.toLocaleLowerCase() + switchTheme(themeName) { + themeName = themeName && themeName.toLocaleLowerCase() if (themeName && !Object.keys(this.themes).includes(themeName)) { throw new Error(`Theme ${themeName} doesn't exist`) } @@ -102,7 +108,7 @@ export class ThemeModule extends Plugin { _paq.push(['trackEvent', 'themeModule', 'switchTo', next]) const nextTheme = this.themes[next] // Theme if (!this.forced) this._deps.config.set('settings/theme', next) - document.getElementById('theme-link') ? document.getElementById('theme-link').remove():null + document.getElementById('theme-link') ? document.getElementById('theme-link').remove() : null const theme = document.createElement('link') theme.setAttribute('rel', 'stylesheet') @@ -116,15 +122,21 @@ export class ThemeModule extends Plugin { document.documentElement.style.setProperty('--theme', nextTheme.quality) if (themeName) this.active = themeName // TODO: Only keep `this.emit` (issue#2210) - this.emit('themeChanged', nextTheme) - this.events.emit('themeChanged', nextTheme) + if (isElectron()) { + const theme = 'https://remix.ethereum.org/' + nextTheme.url.replace(/\\/g, '/').replace(/\/\//g, '/').replace(/\/$/g, '') + this.emit('themeChanged', { ...nextTheme, url: theme }) + this.events.emit('themeChanged', { ...nextTheme, url: theme }) + } else { + this.emit('themeChanged', nextTheme) + this.events.emit('themeChanged', nextTheme) + } } /** * fixes the invertion for images since this should be adjusted when we switch between dark/light qualified themes * @param {element} [image] - the dom element which invert should be fixed to increase visibility */ - fixInvert (image) { + fixInvert(image) { const invert = this.currentTheme().quality === 'dark' ? 1 : 0 if (image) { image.style.filter = `invert(${invert})` diff --git a/apps/remix-ide/src/index.tsx b/apps/remix-ide/src/index.tsx index 92a0206003..37bee1f5aa 100644 --- a/apps/remix-ide/src/index.tsx +++ b/apps/remix-ide/src/index.tsx @@ -16,13 +16,14 @@ import { Storage } from '@remix-project/remix-lib' } catch (e) { } const theme = new ThemeModule() theme.initTheme() - + render( , document.getElementById('root') ) + })() diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js index 9c9f365f23..49e5d23ece 100644 --- a/apps/remix-ide/src/remixAppManager.js +++ b/apps/remix-ide/src/remixAppManager.js @@ -2,10 +2,11 @@ import { PluginManager } from '@remixproject/engine' import { EventEmitter } from 'events' import { QueryParams } from '@remix-project/remix-lib' import { IframePlugin } from '@remixproject/engine-web' +const isElectron = require('is-electron') const _paq = window._paq = window._paq || [] // requiredModule removes the plugin from the plugin manager list on UI -const requiredModules = [ // services + layout views + system views +let requiredModules = [ // services + layout views + system views 'manager', 'config', 'compilerArtefacts', 'compilerMetadata', 'contextualListener', 'editor', 'offsetToLineColumnConverter', 'network', 'theme', 'locale', 'fileManager', 'contentImport', 'blockchain', 'web3Provider', 'scriptRunner', 'fetchAndCompile', 'mainPanel', 'hiddenPanel', 'sidePanel', 'menuicons', 'filePanel', 'terminal', 'settings', 'pluginManager', 'tabs', 'udapp', 'dGitProvider', 'solidity', 'solidity-logic', 'gistHandler', 'layout', @@ -14,6 +15,11 @@ const requiredModules = [ // services + layout views + system views 'vm-shanghai', 'compileAndRun', 'search', 'recorder', 'fileDecorator', 'codeParser', 'codeFormatter', 'solidityumlgen', 'contractflattener', 'solidity-script'] +if (isElectron()) { + requiredModules = [...requiredModules, 'fs', 'electronTemplates', 'isogit', 'remix-templates', 'electronconfig'] +} + + // dependentModules shouldn't be manually activated (e.g hardhat is activated by remixd) const dependentModules = ['foundry', 'hardhat', 'truffle', 'slither'] @@ -178,6 +184,7 @@ export class RemixAppManager extends PluginManager { } return plugins.map(plugin => { + if (plugin.name === 'dgit') { plugin.url = 'https://dgit4-76cc9.web.app/' } if (plugin.name === testPluginName) plugin.url = testPluginUrl return new IframePlugin(plugin) }) diff --git a/apps/remix-ide/src/remixEngine.js b/apps/remix-ide/src/remixEngine.js index 3a0c905acd..6f1b159781 100644 --- a/apps/remix-ide/src/remixEngine.js +++ b/apps/remix-ide/src/remixEngine.js @@ -20,6 +20,8 @@ export class RemixEngine extends Engine { if (name === 'fetchAndCompile') return { queueTimeout: 60000 * 4 } if (name === 'walletconnect') return { queueTimeout: 60000 * 4 } if (name === 'udapp') return { queueTimeout: 60000 * 4 } + if (name === 'fs') return { queueTimeout: 60000 * 4 } + if (name === 'isogit') return { queueTimeout: 60000 * 4 } return { queueTimeout: 10000 } } diff --git a/apps/remix-ide/webpack.config.js b/apps/remix-ide/webpack.config.js index b34b7dcb11..ee9f810553 100644 --- a/apps/remix-ide/webpack.config.js +++ b/apps/remix-ide/webpack.config.js @@ -15,24 +15,24 @@ const versionData = { } const loadLocalSolJson = async () => { - // execute apps/remix-ide/ci/downloadsoljson.sh - const child = require('child_process').execSync('bash ./apps/remix-ide/ci/downloadsoljson.sh', { encoding: 'utf8', cwd: process.cwd(), shell: true }) + //execute apps/remix-ide/ci/downloadsoljson.sh + const child = require('child_process').execSync('bash ' + __dirname + '/ci/downloadsoljson.sh', { encoding: 'utf8', cwd: process.cwd(), shell: true }) // show output console.log(child) } -fs.writeFileSync('./apps/remix-ide/src/assets/version.json', JSON.stringify(versionData)) +fs.writeFileSync(__dirname + '/src/assets/version.json', JSON.stringify(versionData)) loadLocalSolJson() -const project = fs.readFileSync('./apps/remix-ide/project.json', 'utf8') +const project = fs.readFileSync(__dirname + '/project.json', 'utf8') const implicitDependencies = JSON.parse(project).implicitDependencies const copyPatterns = implicitDependencies.map((dep) => { try { fs.statSync(__dirname + `/../../dist/apps/${dep}`).isDirectory() - return { from: `../../dist/apps/${dep}`, to: `plugins/${dep}` } + return { from: __dirname + `/../../dist/apps/${dep}`, to: `plugins/${dep}` } } catch (e) { console.log('error', e) @@ -77,7 +77,11 @@ module.exports = composePlugins(withNx(), withReact(), (config) => { } // add public path - config.output.publicPath = '/' + if(process.env.NX_DESKTOP_FROM_DIST){ + config.output.publicPath = './' + }else{ + config.output.publicPath = '/' + } // set filename config.output.filename = `[name].${versionData.version}.${versionData.timestamp}.js` @@ -130,6 +134,7 @@ module.exports = composePlugins(withNx(), withReact(), (config) => { ignored: /node_modules/ } + console.log('config', process.env.NX_DESKTOP_FROM_DIST) return config; }); diff --git a/apps/remixdesktop/README.md b/apps/remixdesktop/README.md new file mode 100644 index 0000000000..692b5b3c4d --- /dev/null +++ b/apps/remixdesktop/README.md @@ -0,0 +1,22 @@ +# REMIX DESKTOP + +## Development + +In the main repo yarn, then run yarn serve +In this directory apps/remixdesktop, yarn, then run: yarn start:dev to boot the electron app +In chrome chrome://inspect/#devices you can add localhost:5858 to the network targets and then you will see an inspect button electron/js2c/browser_init +file:/// +You can use that to inspect the output of the electron app + +If you run into issues with yarn when native node modules are being rebuilt you need +- Windows: install Visual Studio Tools with Desktop Development C++ enabled in the Workloads +- MacOS: install Xcode or Xcode Command Line Tools +- Linux: unknown, probably a C++ compiler + +## Builds + +Builds can be found in the artefacts of CI. + +## CI + +CI will only run the builds is the branch is master or contains the word: desktop \ No newline at end of file diff --git a/apps/remixdesktop/assets/icon.png b/apps/remixdesktop/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..75103918e6108420ba9a2dcedcf159183c89761f GIT binary patch literal 14458 zcmcJ0hg(xmuyzUp0TBU_UX(xp>Aj;!3svb#jfjYV^eQFM2qH-DU8P8oA_5T*B1jhy zq)81;q=(+gckuW91@}IeCpu+VxkUz5>cHckO##Akd}n=l|fO8<*GsA&a+$g}1TWBX2*H zrvu2(&rihZsk4_o%H2W4&C@YsU5OP0;sznrZ<+XKu1y9s*q8?YB^lDk-=yb88QlCM zfARXISKNY>HP7!emYB|rJgGGQxHsm!(^nU@cS2p8QJfUX^|z} zYQ6|TajJ1&1k+2LoLMYNA!aTf|L(JCnL6GM`Px{{u$k%j@oVb%VCcjV zU%U!F1mB3y#`oeyu+gD=-$U*7#t&E4~LWjMwKO<>aZQg0!7hFR_!ej1M&6UUMOuESlU#4c9e&-T6%&O1gp!M|RMu?N5E{Nh}O4m8yY_KI511KKNBN z{6Te{2M(F$fs>ES<=rllVE{RKT0+|)h^X&R14`bDuTwNqTY;=7l@e3(T+tCb@E;)MoZIXSHzA7%2e;5KIPPHQB`J&uB2Z@|+QS7gG+NzOE;gC=~`n zA3dRNW<2Y}J7Yd>nQ74}>oYUTamg`RBm=-KdZ0msB^UvAhvK;5|U4)j)M#Wj&#_79D^lsmwm51b(jdA%)x(lKhRh%SZK#L$-Zlx#u z$R}}!_-B}$1k&=rV>c`6pv#CCI!2p&6usZCg}nc5aUoMbRY(vi`2AutwvigvhhAJ4 zihA0fgm=PQ!IAfbAS!yJp(=ibb~~cU&`^!hntSnycpEJ0tgvGm#@u$lxeg+#9)G13 zg%cl4Iau9e|GelV&kr&3t=S)wNW9bp46r+&Cy$Q zb~30$aywnM@Xx{(lO27ol?ktx0tryOpQpL{DGHLyT*FhE5+WGV7Usc)ntv$Ze%#Ub zZ1m@hD3nv*B1ae&f#2g%Wr92d)yEuuq09;8Y8$~!Q>=Gc)A{5e9HpIDiM|9kN+h~q zj~PWebf%1noa_zjJzEMIDt5hE!NwN<`~~_2<~G`O%e2Illj00PL^fwbjjr&4o^+|; zRcGxD817L_sQsN!sd(FBtAk^jps267#v=D{ewqT5u~2IAO@v}f!-B;){Ddb6w&51{blikuX-rWT}nDbAN*i+hTZPZhpG(nv%ZAXYvXt01v75pmN&*3N3-y@3}L%jQkK~-FeI7@^|L;mE(>T-R7J=O zxJDJl=~%HJ3u<=g?&wl&=L5pUqoj*g)a+9?$B_e74R456p6d+OtNyXXiCx{zkPs%N zoC@Zlta*}4YqTl0vyiVOp0!ebM#XtO!SaWNZmNYZRfUFRPeHRD;s=Xd#=7BsWm+c7 zc&WToG~l0FB;!8)qm7NqeNj1UK;YGvPR$FEXY>br`&3{rjCz|k zGTY@9EK4JI^*{o3ptSE;wPZmPblDB2UHn+Y{pz8ijeffhVFU9u!&%U$<9hSspFH!V zQW=hEJR?7^{){|U!__mVB0Y+NQnGn6QQPzfPwB?bY6Ru_b-h=Kd5-ewKkxlfxhu^m z%V74#%P40#^-?C8mD*XKr}5?$REh!e$Z!LieT@Vwj=-_Y(QP~{mTw15BS?<*5f&6D z@+z}}yHhTNs(DobX}S@5-|?zBb0Mw%EOmk<{^U`HmXW0pM1+?V@pu%6A)cH?0iyJu z9{9da(r+%Ar{tGhaISF1b?&hyi7}(*hr(P7#v<+gXEc?Z-)LUuP5ED_0OF91GO#Fw zR;52>E(&wPS{nMrlIriunt_{!yj!#dy9GY`eM_juD*yC*++dnF({oMf>Cu(LrW-yF zCbds_eSRLpY_}#5=?Wfn?%Lb>*QM9xvFgpx2uF^%4k3c!sNfG%56Kc#hNn?MQ z34&Xp;mhAcFKbG{t4FV5eKx#u?vTGJ#L&`l8YhlDAtxSx_F`MpMPKNVjmW$5hrR~a z6MUUTDuhZX`X{H6NF+KGLGp9{iK7}-QG2HS`mys^Ep|z#c{LFoWAzzj4qI@=+)bVPri;k@=-F)Dk+O>%Xzid>9}J+?TT56}8xexK|Yp z>OU_w)F)Q_`Svkw<(d;cHB5K*Pveshth8XahynVw&#x-LJxkcM`4KwKQ1(21Rr;c* zztC(HrQNJ*g&rz1bX5tkTEDS@%~o&7+Wn{%1G{N{;cHHh>*>oHJahPq+cfYZckjRB z_;dNHg8~%C>>u@LY!_^|O}Trz8@61_>7N>V<%Ev-!0r+DsOH-+o~e^$UCO#YH-|Iw z@V#c`w4id!Bw`3_Q0`VA*TZx1efF)?%tNWov4cU%-6rk_!R8RvYZu?-khw6vJ>ykO zt7vvu-*}Yde;Ki)(>jWAFPGkrc&lSY%YLpDj&)3vyKvo{c=7d+_Z+no#xPx(sXtkdvD%a=7pHz*?YYHyz2%J zn^KwKBb8)JSORU#`*A}K7tK^sW%|kVNYSi_U7uVJx04_>`bKBy^;AJlzKbiqL*4{^ zdr>Il7I|L)*-Z2K^|B*rkd>0{w*XOGsK0(C6-FY}~k!>fIl*X{RO zZ_T@HN6g*|dj==wL84Lb4wf#r56QTJv$;bv46inED=l3Yh;KrWn1YKhEi(2;H|iZH zG)*ERjl<+>Hm=?wMa*j5W;bVBGdwgr4oY}xIFR^B{>6zcv2%8DXWNFLGVgZW`ELE| z7L@;);c=uhr+G#XMdR(Wnj9e&hPA)>*@1||rqP7fFFSJ~B>z2l=&>QAXqksqj$rOo zLaU!MyD`&`+>`x3Q5F=UyFDea{UNW=BE)OSrTt4G_3oc!WYGiZ7p_Z3;THx2isjtUb4$gtP{TOV zS7y=dYgP@~#VEQ35%MiE;+TKGT6VSDC-kFQ@iK`b9IP>@vmYVuv#O$Kp0h z(HRs-XvXc-hNNR^C7TIaCDp07S{}@s2I}K+B;}%`#-1{FC0^AdS((QBGZxFE(e4hD z1>^URAx+mw&m?RnG#?uy8TEK3s(MaaIYh^55C=6_c`9eh_g4|>{Py6(>6GHlJ*xKY zuaMX847QPQ}PwGZ;L91pt>IOMNbE85tIdUJl zglVnN_==XfWSV4_?qR%P2k9(|sflS5mv1(n<7iu%eA&D|+NW`!*XpCGe1VVDe(Bcg zYlmcdlEOESAB7VLgSN=fbOL~Mk@&b(VuP==RPN*3PxfiI(@NyZ$Za^!fyUA+O3c

-$fB%GoCz^>P0g?zJwz zHJgyoz-8KyHFI_JK5}&D$x-a?D0dzSX#8%UZF^o9QfR_ zix+_oZ&a%LI4eYRhZHj3IBOVCWcWeei!>=`#II0%u+*`XJjqNen3J%AYb$T7Y=v&N zwJ9gocl0?^no|jk&t0->0xzf5h3L1=ecoOURVF$nO|hg>Sf%2gu29~%lRR4KYN+k$ z)dY;mxw|nIf*rRKeWppMW-9mm-%;*OG9$@_-LQIbv&}mN3VZTr<}ddh!0yO41)EE& z_ugg~t^GJC;r#Qu8h_&*XQc@`4KLb3ddc=?2w!$^qvOTy;Pb%{>X!Ph zH~;DQ#KOUQQlDeq1E8~B#A(A2W8PS)j7^}d;#6E$*l5{Bia~I z^bFZj6dXaTN3>zrv{>Z!J8g^Px;r(DYtldSWntruPS(Di1_f4^q9c!kB0ddE=4f=B zdDV75th{vK#xU6ATJqQD+LUbXG0~`N!qDDjf{ImXtXv$6%sLb8Z&x<6^`~Ai!0PuF%FL7eQ$NYHrjZ9_pR7r+ zGTj-z@Y-a2Gf}cMSQ!O=XSAv@`b5sJ{vs<0-&WFCy~#YrxxxDD%#C*)a#wtorE84S zPsTy`%8sH3t@&%WOADoY`*IG->wfTrjc+!AncZQh&@$m%mEcIfsL!X*I`=<3X7J!! z5W3dDgOUkZm$_$%ORC~upV9FM&OEWr+r`qolGRihzSWQ>R<8okvN3_Y1m--d8e79L zP5il>`rqZT`LA`|$rhAYh;DH)rmz28?qW$kiR@@s_z-$6G((E9R$`*&Q<#S;>P@Us z;^*5-NI>h!gg3!xD>PsjI{iMgB=RnWac=`9us<^vev;U7Z{96s7pvv6sG(w3beEKL zVw>47+P4=MQ(fj3*A#q_$4}{2+PIsWL8fc%ih9<^oO~f)UOim*X?_5ef5^N&M_YI2 zv}RbGqROo=zVD-gMTSA)S^yN?VjPLOD%+i_+&h1QPdtjfGE732nssG&-mP#Kt8AhZ za9@pe#ABZHuC!2@+NmM##MOcM%dGC_7S*_>kHb|n{f0$y8Q_svlI|Aw+C3dF1$W8A z@gHKI-?tx!f5E?*cPpnrf8^nE7M1@j(clNAa42gDR7(yD{S#|4`Mn|raS+m$eP4UlPmnRDD;)mlK6M%}T5BH(@bIS`#vU?cK&(aHSb5DRh z^SD#FwZL3`pvx*WsThYou?MDRWIc%3>2d=EjPmw_mSu+17roK%n0W0S`m8G*r91&t9G&7=b-_%s^KA z=pJvWOnQ~FTjA+@fhR=_z<$VSu9VctezShxS2n71_Puv^PJEO8G~+3MzP=uhQcK46 zi%?oI)jiB3ca=j!!LWYsQoe~l%ke$@b4oakRp^=m6NL3g2D(LJWM&fk8OC?YUmMIt z_D4fi2X^4P6*8IwclnjpB7+~NyusDB!#1z##HMMysXzOS^RVW}Bt0&s!S$rDKgQ^* zEEM;$foq2r@G~MfAn%ehI_GjWMYMQH0INI4q2WYWzdHME_DGE6XvN(=iRM`UOJ7FF zfrara?fwR!;Z{ARqSpek47R)@g_@lbkUG8)v`DtVqM0$vB;`y?@NOQMo=e(?ZVAOo za^QlVE9AdcjS5LzuD;Q63=Y*jxy?R;!E$^nD4sTU(IyZ3ijd6^YmwcDO^Ag>B(O}a zE4czj3P~pC;rb07tc>t~MZ*Kln36qpnXO}P6WhE}!NWElCdTzAs9E{Q#3vw8 zN%!*N6oSBb-k2EL`Rsb<=7Mt3qu`9!&(M-EhO`1Og=1L^>LPs(-)J&XZsjGmTGDf9 zQB~WGlX$b|NQQ2)O;z1zQfbRT?Rfkk{6NT(p6~L4N%?WWkzS*m#3nPXt1P=ud> zbw2|g)M6LjR5KFO^&D!SbKuDf9|;}1(WmS`8R(-*PMr20Fzh{6#Xj4T&x|jcFe6^Q zSs{=57Inzd)p%77>unp$f*-=qsxKe~`ExQwafXEAnf2;Pe&ew!z7)HV&$+-Z4fS^}_%uX6&DUoyctiWxW!;K!M%j*H);yk7 z&Xc6U$q#twF^=%bHJW*nasMz<7BT*93tzi9^sA$)51qGlA}*$Q_udL@{Mlj!Gm|1) z3Jlcn(sAQxcIfww|yMc zH?U7e*v0mWS0m8naG{Nl_$gR-!XPK@chJ52dn@MYy1@k>VtXUHxya z{Wv2oONl8r60;(iXql%H18N9U$|7aq9bnyx(x`j!V@sgs*LeaH$U5p={Qx$*C=~=q zKAbdy5Zc&>{r(Dn|VvQ+sOyidxVIBpXa=;X1HYwF8YjYqDzR=m zyh6S&MlzAwJ*dDl^4AC%_Xq{|E|FwWLRo?emNPz#@A42O8WEmH`N%06e?dGHG=GVU zR?0A9PoE_S`ct5gy%QO6%wcgV$(L(7dR(7vWrlNJo8H>cSem26i{LRVU0-21h1*}| z4uyzMnlI<(o#8IaQQ>a*X`mhOw33O6IbuvD`$wsudDgSTeZ2*P`FbqFH{~xkt_ws| zQAUIoYjhMJ+%NF7O)8prw<8Yj@F9^b)4H;L(5ulC?4KL?eMI~?J>=M0Ym<$0a}*qj zK<{jb<5{pAMK$_X>r~CBWzrGdAG_Mg@}J(bonTD+PJ=&-=(eI>1u13XCf<1m zklAs*wYR*PO8kUC-J2N9QpFxW&G$XK%-6~u69dz+-jYML{)$%&?U1Ardr_gYoQ;3# z^7lqf*PRrXF&RjOa)s!O{&-qN>i55Whgey6l?shADgy!sUUjid{lYIa?Hg>~UR}6* zQ&VC@dxCs+g{~daj7}uVEb1gER?K57q#2^=2a;vrEOhw@oNWlB7a@HVmk>Y3ro(@J zsqG1DPM~l-%58uiXa$*QK6&qqwnccGxK_v$FN?|gX*}_V;9k13%~3TAmYYYP?9V2} zgMRQ%gof}EC7R1jte1ky_~4SRUP?q$yY30bIFsKmv6fl9Jv-&IY*@NT5ete5ZU66^ z&+x6-II=gDH{2D7&}Mht^;Yo*t+q0QHuCIhxYr$%VPPmejvU^;ONILWqKD(6W~J9w zLk_OlH5IUyzNrC+&>qlT)9pHK%X^g~JK%Y^YA~v*=%>gUCLU4>?aiIsyB4Zg@VXmA z3yNfQ`f^o{`G9@0aezzIjKP=FrTzjoE`4IniMg#!yslk~X~OVqPmjeJ7GulxTYWC+ zFFzsZ$g8@^>BQxLPpD0ZVB0xe5Qf6~W5pbcZ!~J2$@DO$KnpK(8oGSF4YO4K^K@`x zv$jR%A*z5bjMb~Q1hu2QUXa<-n!W|zs&!t+vC0LGhW&6*apzl?l4W&cE|ZU3c=|jn zPPB|q>HdVY==IR?Wco$pw&*uWr&m#FlM^)NMndex8r{B1Gk4!lxVkV0zup*_99n(^ zzR@||mjC@de#5wT?r3g|{y^%Gt>iP#CsormVj3Q*$fjvKt58>^(xo19^UPO7ScJ@% z^_@OKYBk)6iJ(NNAYUGkPMI&m$Nr(`H2xh&oUzm%RkH8z=*vQXtr{{|&Vf?K%&Ume z?}NK3s}{Mqh0GO?HV~3S9u_Htf`=Ij(PBsz_(SIK&QR__}-$vEKeQ!I+AN zs398N=NF%glQ@sPZk18#u#QMIZ*Lu&984C%3}F+x+E)sW`~=2AX0CMiVv{aRYvX7J zU)Akjy~I`YT}IzD??p8Cq&-@(Vx~9rUE(dB9~p|^*SDZ>(LbTN77cCGc$Pv+9ON{l z7lE5;ia4@VSkFt0xk#g`3M0dU-!4JV&aOAl!FXW4EZ+)d#3`IKqxE6KR=Bxi4 zP`paqz<#|SCZP=xOQ>)`m1OJxfDcg|v_^Er!6|EH>@DMSqiV)q$C6$25m(WM5L58f z;R2;vMnP!Dcs{n2yt|@0cfxo;L#r2p9;GsUNC!1wEA-wMBR9b+iBDam;6=(tQJ_?i z$v$70g-4AJL=1WWe_5_+l6r*)bcv*^<4QLZ_c^tUS1->@ItTP;=&(f)hF3%{4hL*z z--k^k=dv?^kn-OfX^8Ms3uLuGJ&3DxJKUHTB#9x}EWUiU`e@)`IUgwAQ(K&t&_?Fq z-FZxzu}Sl=n2hidzwYzomwhdQ-(D-o7QPVoK*Im^_T!Wv6jPFax%87jnP%l8Uz2BF zDDG_M#GCw@C36tczoR+Q5Gm$Z{;8854fRO<60Jy|=yCJ81l&n!96GKk(n5#+rc5E{ z8>^Zs1eOcH)$N$QrY(b^^D_4$PmXkXnnKLKdc@jh3xWN2V;Pr9@?l+K;Ml}pXK}XE zbm%~XhiI)mgbt{t#q`he{q)?6=iaq)g8i@f%XzX`f4(e-TNX7;1U0zFlMERwHBa=> zHN2}GyvQ%#Il&+|=%8spbz6kO;i9xjT%!jhH%~_w=COt~0?F2gJNesxOi(RU0lxz5ktsJuW z0r}=W)SWDs(+v!-2|HjgV+UM{A6;n!EHYfP1UbVJM5R)%q!j~QAOD>*$(t-UdyEH^ zM6zH*#ucT5v;`wzH`4%AH0&ma06p-`8<5n3x}*jv(F|aUl z@S1yCt#nHf3a{8UpLpK6fvl48HLZt~Uxz~xAjxerEu*)|Kq^4lPLlyHRp4cCKS6L` zgMk;60u7fn%L=ie`O#|~0ds+}>uQtRP`ISkD#S~$DSjs1?#gl{-LNYMHq~hqA8=l) z>I_1hZe=20?`}Oz3Wp{5^@3$6q5&4SX5p}W6=tA`PjiwFo1CXS4pDqItIh+O2H8yN zSqC~$6P6~DnDO4tRu~4%G-$8Kk^@N-$c%gCuA)k75m&2FEyQy=zg%<7%ZM;A@E*D^ z|Kg`+%{yxtUV(t%*=(1KxbvjG=Hi-pwdp$5=Q|5$<7Bz_EWxyY%D!JNV~dCZ*E9T~ zZn!F!F15n0&HCfMnwIL=5=qd_hqYRMvzBfBUDxTpIyG3HA~##ap+pyB2ogmI9c@;Y zR>w(YN22F2P5G8ts@^L>>G80eeAcJJ$-!kf`7B}G=rx(9Fk*JTKU6eYXVW0k_^v-@1IX2CSn;~iP<7WHGE@%gfw zxBoyKL9)<7@y$hbBl&0^p{(P8x=nvK^WH*W65eG3ekMbEqLbc)E6rcO)6#{OyCHkh zFEwNlInMYUJ{l-|sL3((VhJR}TY`31Q|lqOfIa&Dc~cC?M1D2~{Pymo;44*|AwEI|nM-ZJC6r-VC}ASp+>CD4<=v-W-8~ z5m(Yyt_zecf~OJiqe#h-d_k@2D*&6_1r!EGQ$Pd5vyZ7t@fT(HTL$Nl`*v8R6eZd; z8PQ~cO5ac37+d(n?{|SuoI{QUhY^$i;2a~QQ~ZeU+F?_KyLd&w)Uw`(`E947VFq7l z>BCR$_3IpsB44X$Dty*;qUJ0JR0J2hksm&BCSixzNK6LIkd#=n-@g9k#!t0ww5e(6 zZ?fEg`h_w)^D%?M=?1v3$BGH*5O`^3DW{v#@@0yhr4{9eXv~o-1NzTeTs;IU+Lwlx z#-c)jxse*f#UR5tCh29ZBNtQCul(ZV6YS=;XNY?(_r$MyMt?4bjXi!OgM6Hr`Cq+e z*XQhdpk)s-?kaY!2`B80(-q479i7Z@?jq$!bRyTE@>-eXO(l;2b4eRL8WTpple4E| zHAROvq})F`9ngL`hvHOrSwghv%8a_K9>fy=x^GI(4=Vupg$$_!ce~Buq^ZlusDhS50_!rw)2W}j~x`;C9Jd^cnXCH{)66=*c zmdaRmXbW^e!}OtTj^=5=9VniQkALn0tn2T)aP%?x>3hM*lZ%WP=H?s1S z{}#&>soW8nrCJ;h8Vp47B0`OIK#kEzvn_nDTXLEo#OsMFO^5$!u+c_H;& zH~~)<%Na6!-Mcp+E1J^s?b%u2&VOJ4#AkQ>!uJh|XtGD@BJWGy@q)VDZ{^lS8{BDg z!1KVm;s$M}4en^ZrY;Z(eEkXr!W*tM;NsyRXG|nRB2Q7yFl1WyPBiSMaudjG^qb;8m`7r!8yHg4`%xP)_s~OFM!eun7TL2@}X$GyoOw@-JqRIcP7ZWN3SN zc&I&>sQYVo%@7tGQRopV;=X z(no_zDH;{^P|CjW3ZLhmjn7MDbe^=CGbDy5xYoh+Fd3Qr@9f2(X2s%Uk7Lwur7xU>u;V$tO~CGe^#S49iZDeGDN| zqG$tY)=lx5WDA-4I9WK-Cm(l|L*5_)Ab88V4^@atJO(^nKvAz1eaTB(_2eS<00VNl zU??x(WaC2KJ;AS$jcOJ-j{H9KXfGmFRhdaG`0U!bKZ`5)EwTl<6I)xJ+Q1c+X8~Z9 zy1VUEb_hGudCvm6_31UXFYL%kFCiyi=C3TH2!PRxtwNSYY17n^43zoUY$S*WWY>W;aH9SxgeXl|;uHLN+fCP`_uc^~lJ$pb>?7g0T0X!% z)_PER21tqgM9VnoZ<;xjnm)0LU6wN5WRf8-?X-!7m;virdS^>-w&1EhNd_Vq>zlrF zd;~=x1iL%Y@x@2iooa$r!K2pzqjvW78%M=p_!uXG{P%1fA2xzfPz+q(RhihS?vSrQ z^68->Os5BZL(zlKhO$PHXYy2|H}2l!GBkBstMTph z!0^us(X8X0GSoFO7zqlmc&he3OdrJkFxpU>s1RHQC61{(1k+ihe-J{hZKXtX$y3Sk z-@RwO-OnsKrVeozCHB!Y7;t^PaaX<%6qu2pnM{Hphwek}n=nIoQ zy-@S`@9xn9DY$4Wb|mn)qOjIQYH`FOxbyX?`NoC-{7(kWt0 zcJ*WqNWt+HN<~tuOu|oDCB!YjVx#7C#k*3{5Rkj74QjZOmsk%Rh#~7*Rp3c0RD=d~ zhp%*sB!ym{2aB{l(V&~DPPsnk2eE*2B)F^1VOeJ%pcv=JA$ea`qA!R5 zt3lMMY_r$8=I#OVV{)`3E#VX!xbT#%MXW8x0n7W_5F+!Q-IgzO{IhUx@z8*DD=U~e zcx@YFt|jz7(gqx)>c`tQ(}6aLjxXD3uTn*+;mk=xr&Ru&GyOz^QH>q1yo=pwt}Xq<>2v{oRxY-k`L^&)VL{n)rr^@(URPtTX} zGX2f7`@)m-T!>IWMWlG-$M3X@%x%Q}HiOX8zJw;4@hj8Z>uU$AkLVxOERj#J?EMBvLT9>DdJJGpQ9I`bEZzc!!SV<*--}m*m8iWq^&$~_6eAgko3hbG98VT#}{}Tco zyIc#dT9Nj;u^Q2d?mzwOS*SY9JMXq4^PQDYEj^B7h`x{wC$aU1`MdSVJY@s0bo)~P ztd)-GKd!H;@rqAsJPO%qlyuHy^L8u@4EZ9WP!e{Z#gB%UV$v@FkD2#Gm4`u1)>Us5 zm)x6E`1aY115c*wXePjXP|eQ%5g-C2ASd(fj>UzBw?L-mZwy{}KJ_Q4J&e3NnL z)9BL4I^|C^DC5WpH;YaW&$Zz-nFKJ8=ID~)dMjRGtI06GjS<_PZQAcmh`|(gkp3hw z`_W%D8ThV89))T)XiD#KN7Y6=pdp%jAJeUWxP(XAGPF(uDWJjj5_Tpq#nW%Wu_qgr z5gs(k)&yV>Q$B+)h8XLdgO6-%PGs-2N~(2UR#7wGm7DD#W`Enxgo@Qmi4Jzl4v#k9d?X0V!0MMlxB&(=S>X zp6w4lR$1N2*p=C8D*R&4K~yI6_+LwIy$&Sl=I{7jT{gx)N3j{PiL?9#oNO1T!R4H6 zxRo97&NMrhqu4%O0aD&`!S$E-uKLRpCG2WTt0U}%-4);3*I_EccciiHdRN*XG~1`R zUDwkw{mpq@Ni(Roqfa`Z%6Q6I!+F z?pNH!W^Rv#X)T)3ts^GELL7$y)NiYroaRa9oP1D+PrpQ4^qNgKF?bbhWW}Ub$U4|1 z?&G5&WevFz8;X;}pG(uRRcZp>;$Y^!r&!v>2X?B>!q_Yfht~B+ilx^tB7xJjZZrk# z_rfW*H$=dl3zdp=kYwrTHfRb4l8}rlC`U0BSmGW}rTe_&syb>%DTsC^=otgbWLKe? za;2_gfvHdwhJW~oUL}?qbBO(&Sq0l4k#$_AUC?Rf5jOm=7-!gil={i$bEUEB$6L+qBKSW@K$!tb|pY+RZNkVr#W3sTB!H@v>_;lLE)If z{fepbz9?3-!yGdW59%Deh`21nW-#wO<C!mRH>m@dm2Z5emV;F&hIP@SE{S zy9ji!glVDMqUe&UeiB*g#qUG4fL2q0sp7d-pON%=!;+FtbXLeV`P$Cf39tU+pK$y` z?y?#L)c2@|ZG1_!gRl{i)szPt(ue4g&py$Wuq&KyK>Y(qqRBW1HNF2&R`8D+>MVE; z>MX^Aqf3ez2pIF&2yyP9GOZkk9BXR!7ZK~Yl5?Ib)@6Y8H}ktD zm&Olub@==MhTI9ArE@-BbDi^&iO$M-$-(&kd8r_2>|C>}Z1B9DPtw$RNlwk>ZW+U>3ZI(1ZV0osNg4;+GrW>IttC6(6|gyV!XzR-qO}k&J0%Qf#L2Ku61+ z7oq7iK?x@aVp%H#J_RESvV=B~pGa0TpzC~uL%>2e1t&gFFvhltQ_E5K>#x7ohSpI5 z?~cg%Y2+29f-b7=hjqgo38+3Z$7YKR#ww};B^;QJNjIs--jjD zzzZT*0r49^+yjUo0OHZZl3hS7!w2r_>9x(WgXGFc!0w3no-G51pVdi7v{BWzc_Dz; zqX$WR4S34fMuUwSooQ2vH{nkJ@tBPs>Ke`HL81y;dTrzHH^cFd1p$wX8~_pOpQsCt z|G)+e+(A!1a9i%VzZ@ufI};ipOv}s(Ap2sV1M;FJU}Ah!=OQ^k^y^%dEd~?QJVyv@ zgX8}RBw&Bt&guHn$aX{l5+oXVGY9CZ_|J3+==E^GI43JU@Z>r2K%O3?jtOAR(*Z6R z&Mz>jWS>>fTU7%Wvga4K#bJ+a0l;`5i{)oFKmnKTg6EzO2)G7{{?60$s&^7F{(oG^ zRIH~{k2IhO!+0tjF-GE5^oR}2LF1WXw;<^!LzWlO-$ads1tXh659P!Dp>sO&&* z2LxbQ;D6qr($&W^yYf{@l`d@}DpN z*_g*Vmiezn3Jdf*U@craSO34pG*52-YivZu`;P{$Ve;TV0fd+LpDM43+J6Fa`F~Et zOLWEkM}z*)SL6lc{}<$@{s(#?@;|{KME^g!YHf!9YJ{cq{sRLZpZxP;8GY+NTNUzv zi2(?e5ruy8Klnk^+ { + return await appManager.call(plugin, 'createClient', event.sender.id) +}) + +ipcMain.on('fs:openFolder', async (event) => { + fsPlugin.openFolder(event) +}) + + +ipcMain.on('terminal:new', async (event) => { + xtermPlugin.new(event) +}) + +ipcMain.on('template:open', async (event) => { + templatesPlugin.openTemplate(event) +}) + +ipcMain.on('git:startclone', async (event) => { + isoGitPlugin.startClone(event) +}) + + + +ipcMain.handle('getWebContentsID', (event, message) => { + return event.sender.id +}) + + +app.on('before-quit', async (event) => { + await appManager.call('fs', 'removeCloseListener') + await appManager.call('fs', 'closeWatch') + await appManager.call('xterm', 'closeTerminals') +}) diff --git a/apps/remixdesktop/src/main.ts b/apps/remixdesktop/src/main.ts new file mode 100644 index 0000000000..a9d4db8b6f --- /dev/null +++ b/apps/remixdesktop/src/main.ts @@ -0,0 +1,114 @@ +import { app, BrowserWindow, dialog, Menu, MenuItem } from 'electron'; +import path from 'path'; + + +export let isPackaged = false; + +if ( + process.mainModule && + process.mainModule.filename.indexOf('app.asar') !== -1 +) { + isPackaged = true; +} else if (process.argv.filter(a => a.indexOf('app.asar') !== -1).length > 0) { + isPackaged = true; +} + +// get system home dir +const homeDir = app.getPath('userData') + +const windowSet = new Set([]); +export const createWindow = async (dir?: string): Promise => { + // Create the browser window. + const mainWindow = new BrowserWindow({ + height: 800, + width: 1024, + webPreferences: { + preload: path.join(__dirname, 'preload.js') + }, + }); + if (dir && dir.endsWith('/')) dir = dir.slice(0, -1) + let params = dir ? `?opendir=${encodeURIComponent(dir)}` : ''; + // and load the index.html of the app. + mainWindow.loadURL( + process.env.NODE_ENV === 'production' || isPackaged ? `file://${__dirname}/remix-ide/index.html` + params : + 'http://localhost:8080' + params) + + mainWindow.maximize(); + + if (dir) { + mainWindow.setTitle(dir) + } + + // on close + mainWindow.on('close', (event) => { + windowSet.delete(mainWindow) + }) + + windowSet.add(mainWindow) + //mainWindow.webContents.openDevTools(); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', async () => { + require('./engine') +}); + +// Quit when all windows are closed, except on macOS. There, it's common +// for applications and their menu bar to stay active until the user quits +// explicitly with Cmd + Q. +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); + +const showAbout = () => { + + + void dialog.showMessageBox({ + title: `About Remix`, + message: `Remix`, + detail: `Remix`, + buttons: [], + }); +}; + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and import them here. + +const isMac = process.platform === 'darwin' + +import FileMenu from './menus/file'; +import darwinMenu from './menus/darwin'; +import WindowMenu from './menus/window'; +import EditMenu from './menus/edit'; +import GitMenu from './menus/git'; +import ViewMenu from './menus/view'; +import { execCommand } from './menus/commands'; + + +const commandKeys: Record = { + 'window:new': 'CmdOrCtrl+N', + 'folder:open': 'CmdOrCtrl+O', +}; + +const menu = [...(process.platform === 'darwin' ? [darwinMenu(commandKeys, execCommand, showAbout)] : []), +FileMenu(commandKeys, execCommand), +GitMenu(commandKeys, execCommand), +EditMenu(commandKeys, execCommand), +ViewMenu(commandKeys, execCommand), +WindowMenu(commandKeys, execCommand, []), +] + +Menu.setApplicationMenu(Menu.buildFromTemplate(menu)) + diff --git a/apps/remixdesktop/src/menus/commands.ts b/apps/remixdesktop/src/menus/commands.ts new file mode 100644 index 0000000000..80c00766d6 --- /dev/null +++ b/apps/remixdesktop/src/menus/commands.ts @@ -0,0 +1,39 @@ +import {app, Menu, BrowserWindow, ipcMain} from 'electron'; +import { createWindow } from '../main'; + + +const commands: Record void> = { + 'window:new': () => { + // If window is created on the same tick, it will consume event too + setTimeout(createWindow, 0); + }, + 'folder:open': (focusedWindow) => { + if (focusedWindow) { + ipcMain.emit('fs:openFolder', focusedWindow.webContents.id); + } + }, + 'terminal:new': (focusedWindow) => { + if (focusedWindow) { + ipcMain.emit('terminal:new', focusedWindow.webContents.id); + } + }, + 'template:open': (focusedWindow) => { + if (focusedWindow) { + ipcMain.emit('template:open', focusedWindow.webContents.id); + } + }, + 'git:startclone': (focusedWindow) => { + if (focusedWindow) { + ipcMain.emit('git:startclone', focusedWindow.webContents.id); + } + } + +}; + + +export const execCommand = (command: string, focusedWindow?: BrowserWindow) => { + const fn = commands[command]; + if (fn) { + fn(focusedWindow); + } +}; diff --git a/apps/remixdesktop/src/menus/darwin.ts b/apps/remixdesktop/src/menus/darwin.ts new file mode 100644 index 0000000000..410691fbde --- /dev/null +++ b/apps/remixdesktop/src/menus/darwin.ts @@ -0,0 +1,28 @@ +// This menu label is overrided by OSX to be the appName +// The label is set to appName here so it matches actual behavior +import {app, BrowserWindow, MenuItemConstructorOptions} from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void, + showAbout: () => void +): MenuItemConstructorOptions => { + return { + label: `${app.name}`, + submenu: [ + { + label: 'About Remix', + click() { + showAbout(); + } + }, + { + type: 'separator' + }, + { + role: 'quit', + label: 'Quit Remix' + } + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/edit.ts b/apps/remixdesktop/src/menus/edit.ts new file mode 100644 index 0000000000..8ac5b299a4 --- /dev/null +++ b/apps/remixdesktop/src/menus/edit.ts @@ -0,0 +1,53 @@ +import { BrowserWindow, MenuItemConstructorOptions } from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +) => { + const submenu: MenuItemConstructorOptions[] = [ + { + role: 'copy', + command: 'editor:copy', + accelerator: commandKeys['editor:copy'], + registerAccelerator: true + } as any, + { + role: 'paste', + accelerator: commandKeys['editor:paste'], + registerAccelerator: true + }, + { + role: 'cut', + accelerator: commandKeys['editor:cut'], + registerAccelerator: true + }, + { + role: 'selectAll', + accelerator: commandKeys['editor:selectall'], + registerAccelerator: true + }, + { + role: 'undo', + accelerator: commandKeys['editor:undo'], + registerAccelerator: true + }, + ]; + + if (process.platform !== 'darwin') { + submenu.push( + { type: 'separator' }, + { + label: 'Preferences...', + accelerator: commandKeys['window:preferences'], + click() { + execCommand('window:preferences'); + } + } + ); + } + + return { + label: 'Edit', + submenu + }; +}; diff --git a/apps/remixdesktop/src/menus/file.ts b/apps/remixdesktop/src/menus/file.ts new file mode 100644 index 0000000000..431f1b560e --- /dev/null +++ b/apps/remixdesktop/src/menus/file.ts @@ -0,0 +1,49 @@ +import { BrowserWindow, MenuItemConstructorOptions } from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +): MenuItemConstructorOptions => { + const isMac = process.platform === 'darwin'; + + return { + label: 'File', + submenu: [ + { + label: 'New Window', + accelerator: commandKeys['window:new'], + click(item, focusedWindow) { + execCommand('window:new', focusedWindow); + } + }, + { + label: 'Open Folder', + accelerator: commandKeys['folder:open'], + click(item, focusedWindow) { + execCommand('folder:open', focusedWindow); + } + }, + { + label: 'Load Template in New Window', + click(item, focusedWindow) { + execCommand('template:open', focusedWindow); + } + }, + { + role: 'recentDocuments', + submenu: [ + { + role: 'clearRecentDocuments' + } + ] + }, + { + role: 'close', + accelerator: commandKeys['window:close'] + }, + { + role: 'quit', + } + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/git.ts b/apps/remixdesktop/src/menus/git.ts new file mode 100644 index 0000000000..a3b31f85b8 --- /dev/null +++ b/apps/remixdesktop/src/menus/git.ts @@ -0,0 +1,20 @@ +import {BrowserWindow, MenuItemConstructorOptions} from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +): MenuItemConstructorOptions => { + const isMac = process.platform === 'darwin'; + + return { + label: 'Git', + submenu: [ + { + label: 'Clone Repository in New Window', + click(item, focusedWindow) { + execCommand('git:startclone', focusedWindow); + } + } + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/main.ts b/apps/remixdesktop/src/menus/main.ts new file mode 100644 index 0000000000..8fa154eea6 --- /dev/null +++ b/apps/remixdesktop/src/menus/main.ts @@ -0,0 +1,26 @@ +import {BrowserWindow, MenuItemConstructorOptions} from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +): MenuItemConstructorOptions => { + const isMac = process.platform === 'darwin'; + + return { + label: 'REMIX', + submenu: [ + { + label: 'Close', + accelerator: commandKeys['pane:close'], + click(item, focusedWindow) { + execCommand('pane:close', focusedWindow); + } + }, + { + label: isMac ? 'Close Window' : 'Quit', + role: 'close', + accelerator: commandKeys['window:close'] + } + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/terminal.ts b/apps/remixdesktop/src/menus/terminal.ts new file mode 100644 index 0000000000..4059ae5bde --- /dev/null +++ b/apps/remixdesktop/src/menus/terminal.ts @@ -0,0 +1,20 @@ +import {BrowserWindow, MenuItemConstructorOptions} from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +): MenuItemConstructorOptions => { + const isMac = process.platform === 'darwin'; + + return { + label: 'Terminal', + submenu: [ + { + label: 'New Terminal', + click(item, focusedWindow) { + execCommand('terminal:new', focusedWindow); + } + } + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/view.ts b/apps/remixdesktop/src/menus/view.ts new file mode 100644 index 0000000000..e79f682b78 --- /dev/null +++ b/apps/remixdesktop/src/menus/view.ts @@ -0,0 +1,87 @@ +import {BrowserWindow, MenuItemConstructorOptions} from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void +): MenuItemConstructorOptions => { + const isMac = process.platform === 'darwin'; + + return { + label: 'View', + submenu: [ + { + label: 'Toggle Developer Tools', + accelerator: (function() { + if (process.platform === 'darwin') + return 'Alt+Command+I'; + else + return 'Ctrl+Shift+I'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.webContents.toggleDevTools(); + } + }, + { + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.reload(); + } + }, + { + label: 'Toggle Full Screen', + accelerator: (function() { + if (process.platform === 'darwin') + + return 'Ctrl+Command+F'; + else + return 'F11'; + })(), + click: function(item, focusedWindow) { + if (focusedWindow) + focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); + } + }, + { + label: 'Zoom In', + accelerator: 'CmdOrCtrl+=', + click: function(item, focusedWindow) { + if (focusedWindow){ + let factor = focusedWindow.webContents.getZoomFactor() + if (factor < 4) { + factor = factor + 0.25 + focusedWindow.webContents.setZoomFactor(factor) + } + } + } + }, + { + label: 'Zoom Out', + accelerator: 'CmdOrCtrl+-', + click: function(item, focusedWindow) { + if (focusedWindow){ + let factor = focusedWindow.webContents.getZoomFactor() + if (factor > 1.25) { + factor = factor - 1.25 + focusedWindow.webContents.setZoomFactor(factor) + } + + } + } + }, + { + label: 'Reset Zoom', + accelerator: 'CmdOrCtrl+0', + click: function(item, focusedWindow) { + if (focusedWindow) + { + focusedWindow.webContents.setZoomFactor(1) + } + } + }, + + ] + }; +}; diff --git a/apps/remixdesktop/src/menus/window.ts b/apps/remixdesktop/src/menus/window.ts new file mode 100644 index 0000000000..30e2ef8125 --- /dev/null +++ b/apps/remixdesktop/src/menus/window.ts @@ -0,0 +1,63 @@ +import { BrowserWindow, MenuItemConstructorOptions } from 'electron'; + +export default ( + commandKeys: Record, + execCommand: (command: string, focusedWindow?: BrowserWindow) => void, + openedWindows: BrowserWindow[] +): MenuItemConstructorOptions => { + + const submenu: MenuItemConstructorOptions[] = [ + { + role: 'minimize', + accelerator: commandKeys['window:minimize'] + }, + { + type: 'separator' + }, + { + // It's the same thing as clicking the green traffc-light on macOS + role: 'zoom', + accelerator: commandKeys['window:zoom'] + }, + { + type: 'separator' + }, + { + type: 'separator' + }, + { + role: 'front' + }, + { + label: 'Toggle Always on Top', + click: (item, focusedWindow) => { + execCommand('window:toggleKeepOnTop', focusedWindow); + } + }, + { + role: 'togglefullscreen', + accelerator: commandKeys['window:toggleFullScreen'] + }, + { + type: 'separator' + }, + ] + + if(openedWindows.length > 1) { + submenu.push({ + label: 'Close', + accelerator: commandKeys['pane:close'], + click(item, focusedWindow) { + execCommand('pane:close', focusedWindow); + } + }) + } + + + + return { + role: 'window', + id: 'window', + submenu + } +}; diff --git a/apps/remixdesktop/src/plugins/configPlugin.ts b/apps/remixdesktop/src/plugins/configPlugin.ts new file mode 100644 index 0000000000..213e6a1e41 --- /dev/null +++ b/apps/remixdesktop/src/plugins/configPlugin.ts @@ -0,0 +1,50 @@ +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" + +import { Profile } from "@remixproject/plugin-utils"; +import { readConfig, writeConfig } from "../utils/config"; + +const profile: Profile = { + displayName: 'electronconfig', + name: 'electronconfig', + description: 'Electron Config' +} + +export class ConfigPlugin extends ElectronBasePlugin { + clients: ConfigPluginClient[] = [] + constructor() { + super(profile, clientProfile, ConfigPluginClient) + this.methods = [...super.methods, 'writeConfig', 'readConfig'] + } + + async writeConfig(data: any): Promise { + writeConfig(data) + } + + async readConfig(webContentsId: any): Promise { + return readConfig() + } + +} + +const clientProfile: Profile = { + name: 'electronconfig', + displayName: 'electronconfig', + description: 'Electron Config', + methods: ['writeConfig', 'readConfig'] +} + +class ConfigPluginClient extends ElectronBasePluginClient { + + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + } + + async writeConfig(data: any): Promise { + writeConfig(data) + } + + async readConfig(): Promise { + return readConfig() + } + +} \ No newline at end of file diff --git a/apps/remixdesktop/src/plugins/fsPlugin.ts b/apps/remixdesktop/src/plugins/fsPlugin.ts new file mode 100644 index 0000000000..391b3f9b7e --- /dev/null +++ b/apps/remixdesktop/src/plugins/fsPlugin.ts @@ -0,0 +1,377 @@ +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" +import fs from 'fs/promises' +import { Profile } from "@remixproject/plugin-utils"; +import chokidar from 'chokidar' +import { dialog } from "electron"; +import { createWindow, isPackaged } from "../main"; +import { writeConfig } from "../utils/config"; +import { glob, GlobOptions } from 'glob' +import { Path } from 'path-scurry' +import path from "path"; + +const profile: Profile = { + displayName: 'fs', + name: 'fs', + description: 'fs' +} + +const convertPathToPosix = (pathName: string): string => { + return pathName.split(path.sep).join(path.posix.sep) +} + +const getBaseName = (pathName: string): string => { + return path.basename(pathName) +} + + +export class FSPlugin extends ElectronBasePlugin { + clients: FSPluginClient[] = [] + constructor() { + super(profile, clientProfile, FSPluginClient) + this.methods = [...super.methods, 'closeWatch', 'removeCloseListener'] + } + + async onActivation(): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + const openedFolders = config && config.openedFolders || [] + this.call('electronconfig', 'writeConfig', { 'openedFolders': openedFolders }) + const foldersToDelete: string[] = [] + if (openedFolders && openedFolders.length) { + for (const folder of openedFolders) { + try { + const stat = await fs.stat(folder) + if (stat.isDirectory()) { + createWindow(folder) + } + } catch (e) { + console.log('error opening folder', folder, e) + foldersToDelete.push(folder) + } + } + if (foldersToDelete.length) { + const newFolders = openedFolders.filter((f: string) => !foldersToDelete.includes(f)) + this.call('electronconfig', 'writeConfig', { 'recentFolders': newFolders }) + } + }else{ + createWindow() + } + } + + async removeCloseListener(): Promise { + for (const client of this.clients) { + client.window.removeAllListeners() + } + } + + async closeWatch(): Promise { + for (const client of this.clients) { + await client.closeWatch() + } + } + + openFolder(webContentsId: any): void { + const client = this.clients.find(c => c.webContentsId === webContentsId) + if (client) { + client.openFolder() + } + } + +} + +const clientProfile: Profile = { + name: 'fs', + displayName: 'fs', + description: 'fs', + methods: ['readdir', 'readFile', 'writeFile', 'mkdir', 'rmdir', 'unlink', 'rename', 'stat', 'lstat', 'exists', 'currentPath', 'watch', 'closeWatch', 'setWorkingDir', 'openFolder', 'openFolderInSameWindow', 'getRecentFolders', 'removeRecentFolder', 'glob', 'openWindow', 'selectFolder'] +} + +class FSPluginClient extends ElectronBasePluginClient { + watcher: chokidar.FSWatcher + workingDir: string = '' + trackDownStreamUpdate: Record = {} + + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + this.onload(() => { + if(!isPackaged) { + this.window.webContents.openDevTools() + } + this.window.on('close', async () => { + await this.removeFromOpenedFolders(this.workingDir) + await this.closeWatch() + }) + + }) + } + + // best for non recursive + async readdir(path: string): Promise { + // call node fs.readdir + if (!path) return [] + const startTime = Date.now() + const files = await fs.readdir(this.fixPath(path), { + withFileTypes: true + }) + + const result: any[] = [] + for (const file of files) { + const isDirectory = file.isDirectory() + result.push({ + file: file.name, + isDirectory + }) + } + return result + } + + async glob(path: string, pattern: string, options?: GlobOptions): Promise { + + path = convertPathToPosix(this.fixPath(path)) + const files = await glob(path + pattern, { + withFileTypes: true, + ...options + }) + + const result: any[] = [] + + for (const file of files) { + let pathWithoutWorkingDir = (file as Path).path.replace(this.workingDir, '') + if (!pathWithoutWorkingDir.endsWith('/')) { + pathWithoutWorkingDir = pathWithoutWorkingDir + '/' + } + if (pathWithoutWorkingDir.startsWith('/')) { + pathWithoutWorkingDir = pathWithoutWorkingDir.slice(1) + } + if(pathWithoutWorkingDir.startsWith('\\')) { + pathWithoutWorkingDir = pathWithoutWorkingDir.slice(1) + } + result.push({ + path: pathWithoutWorkingDir + (file as Path).name, + isDirectory: (file as Path).isDirectory(), + }) + } + return result + } + + async readFile(path: string, options: any): Promise { + // hacky fix for TS error + if (!path) return undefined + try { + return (fs as any).readFile(this.fixPath(path), options) + } catch (e) { + return undefined + } + } + + async writeFile(path: string, content: string, options: any): Promise { + this.trackDownStreamUpdate[path] = content + return (fs as any).writeFile(this.fixPath(path), content, options) + } + + async mkdir(path: string): Promise { + return fs.mkdir(this.fixPath(path)) + } + + async rmdir(path: string): Promise { + return fs.rm(this.fixPath(path), { + recursive: true + }) + } + + async unlink(path: string): Promise { + return fs.unlink(this.fixPath(path)) + } + + async rename(oldPath: string, newPath: string): Promise { + return fs.rename(this.fixPath(oldPath), this.fixPath(newPath)) + } + + async stat(path: string): Promise { + try { + const stat = await fs.stat(this.fixPath(path)) + const isDirectory = stat.isDirectory() + return { + ...stat, + isDirectoryValue: isDirectory + } + } catch (e) { + return undefined + } + } + + async lstat(path: string): Promise { + try { + const stat = await fs.lstat(this.fixPath(path)) + const isDirectory = stat.isDirectory() + return { + ...stat, + isDirectoryValue: isDirectory + } + } catch (e) { + return undefined + } + } + + + + async exists(path: string): Promise { + return fs.access(this.fixPath(path)).then(() => true).catch(() => false) + } + + async currentPath(): Promise { + return process.cwd() + } + + async watch(): Promise { + if (this.watcher) this.watcher.close() + this.watcher = + chokidar.watch(this.workingDir, { + ignorePermissionErrors: true, ignoreInitial: true, + ignored: [ + '**/node_modules/**', + '**/.git/index.lock', // this file is created and unlinked all the time when git is running on Windows + ] + }).on('all', async (eventName, path, stats) => { + + + let pathWithoutPrefix = path.replace(this.workingDir, '') + pathWithoutPrefix = convertPathToPosix(pathWithoutPrefix) + if (pathWithoutPrefix.startsWith('/')) pathWithoutPrefix = pathWithoutPrefix.slice(1) + + if (eventName === 'change') { + // remove workingDir from path + const newContent = await fs.readFile(path, 'utf-8') + + const currentContent = this.trackDownStreamUpdate[pathWithoutPrefix] + + if (currentContent !== newContent) { + try { + this.emit('change', eventName, pathWithoutPrefix) + } catch (e) { + console.log('error emitting change', e) + } + } + } else { + try { + + this.emit('change', eventName, pathWithoutPrefix) + } catch (e) { + console.log('error emitting change', e) + } + } + }) + } + + async closeWatch(): Promise { + if (this.watcher) this.watcher.close() + } + + async updateRecentFolders(path: string): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + config.recentFolders = config.recentFolders || [] + config.recentFolders = config.recentFolders.filter((p: string) => p !== path) + config.recentFolders.push(path) + writeConfig(config) + } + + async updateOpenedFolders(path: string): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + config.openedFolders = config.openedFolders || [] + config.openedFolders = config.openedFolders.filter((p: string) => p !== path) + config.openedFolders.push(path) + writeConfig(config) + } + + async removeFromOpenedFolders(path: string): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + config.openedFolders = config.openedFolders || [] + config.openedFolders = config.openedFolders.filter((p: string) => p !== path) + writeConfig(config) + } + + async getRecentFolders(): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + return config.recentFolders || [] + } + + async removeRecentFolder(path: string): Promise { + const config = await this.call('electronconfig' as any, 'readConfig') + config.recentFolders = config.recentFolders || [] + config.recentFolders = config.recentFolders.filter((p: string) => p !== path) + writeConfig(config) + } + + + async selectFolder(path?: string): Promise { + let dirs: string[] | undefined + if (!path) { + dirs = dialog.showOpenDialogSync(this.window, { + properties: ['openDirectory', 'createDirectory', "showHiddenFiles"] + }) + } + path = dirs && dirs.length && dirs[0] ? dirs[0] : path + if (!path) return '' + return path + } + + + + async openFolder(path?: string): Promise { + let dirs: string[] | undefined + if (!path) { + dirs = dialog.showOpenDialogSync(this.window, { + properties: ['openDirectory', 'createDirectory', "showHiddenFiles"] + }) + } + path = dirs && dirs.length && dirs[0] ? dirs[0] : path + if (!path) return + + await this.updateRecentFolders(path) + await this.updateOpenedFolders(path) + this.openWindow(path) + } + + async openFolderInSameWindow(path?: string): Promise { + let dirs: string[] | undefined + if (!path) { + dirs = dialog.showOpenDialogSync(this.window, { + properties: ['openDirectory', 'createDirectory', "showHiddenFiles"] + }) + } + path = dirs && dirs.length && dirs[0] ? dirs[0] : path + if (!path) return + this.workingDir = path + await this.updateRecentFolders(path) + await this.updateOpenedFolders(path) + this.window.setTitle(this.workingDir) + this.watch() + this.emit('workingDirChanged', path) + } + + async setWorkingDir(path: string): Promise { + this.workingDir = path + await this.updateRecentFolders(path) + await this.updateOpenedFolders(path) + this.window.setTitle(getBaseName(this.workingDir)) + this.watch() + this.emit('workingDirChanged', path) + await this.call('fileManager', 'closeAllFiles') + } + + fixPath(path: string): string { + if (this.workingDir === '') throw new Error('workingDir is not set') + if (path) { + if (path.startsWith('/')) { + path = path.slice(1) + } + } + path = this.workingDir + (!this.workingDir.endsWith('/') ? '/' : '') + path + return path + } + + openWindow(path: string): void { + createWindow(path) + } + + +} \ No newline at end of file diff --git a/apps/remixdesktop/src/plugins/isoGitPlugin.ts b/apps/remixdesktop/src/plugins/isoGitPlugin.ts new file mode 100644 index 0000000000..aa59dfe5fe --- /dev/null +++ b/apps/remixdesktop/src/plugins/isoGitPlugin.ts @@ -0,0 +1,368 @@ +import { PluginClient } from "@remixproject/plugin"; +import { Profile } from "@remixproject/plugin-utils"; +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" +import fs from 'fs/promises' +import git from 'isomorphic-git' +import { dialog } from "electron"; +import http from 'isomorphic-git/http/web' +import { gitProxy } from "../tools/git"; + +const profile: Profile = { + name: 'isogit', + displayName: 'isogit', + description: 'isogit plugin', +} + +export class IsoGitPlugin extends ElectronBasePlugin { + clients: IsoGitPluginClient[] = [] + constructor() { + super(profile, clientProfile, IsoGitPluginClient) + } + + startClone(webContentsId: any): void { + const client = this.clients.find(c => c.webContentsId === webContentsId) + if (client) { + client.startClone() + } + } +} + +const parseInput = (input: any) => { + return { + corsProxy: 'https://corsproxy.remixproject.org/', + http, + onAuth: (url: any) => { + url + const auth = { + username: input.token, + password: '' + } + return auth + } + } +} + +const clientProfile: Profile = { + name: 'isogit', + displayName: 'isogit', + description: 'isogit plugin', + methods: ['init', 'localStorageUsed', 'version', 'addremote', 'delremote', 'remotes', 'fetch', 'clone', 'export', 'import', 'status', 'log', 'commit', 'add', 'remove', 'reset', 'rm', 'lsfiles', 'readblob', 'resolveref', 'branches', 'branch', 'checkout', 'currentbranch', 'push', 'pin', 'pull', 'pinList', 'unPin', 'setIpfsConfig', 'zip', 'setItem', 'getItem', 'openFolder'] +} + +class IsoGitPluginClient extends ElectronBasePluginClient { + workingDir: string = '' + gitIsInstalled: boolean = false + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + this.onload(() => { + this.on('fs' as any, 'workingDirChanged', async (path: string) => { + this.workingDir = path + this.gitIsInstalled = await gitProxy.version() ? true : false + }) + }) + } + + async version() { + return gitProxy.version() + } + + async getGitConfig() { + return { + fs, + dir: this.workingDir, + } + } + + async status(cmd: any) { + + + if (this.workingDir === '') { + return [] + } + + if (this.gitIsInstalled) { + const status = await gitProxy.status(this.workingDir) + return status + } + + const status = await git.statusMatrix({ + ...await this.getGitConfig(), + ...cmd + }) + //console.log('STATUS', status, await this.getGitConfig()) + return status + } + + async log(cmd: any) { + + /* we will use isomorphic git for now + if(this.gitIsInstalled){ + const log = await gitProxy.log(this.workingDir, cmd.ref) + console.log('LOG', log) + return log + } + */ + + if (this.workingDir === '') { + return [] + } + + const log = await git.log({ + ...await this.getGitConfig(), + ...cmd + }) + + return log + } + + async add(cmd: any) { + const add = await git.add({ + ...await this.getGitConfig(), + ...cmd + }) + + return add + } + + async rm(cmd: any) { + + const rm = await git.remove({ + ...await this.getGitConfig(), + ...cmd + }) + + return rm + } + + async reset(cmd: any) { + + const reset = await git.resetIndex({ + ...await this.getGitConfig(), + ...cmd + }) + + return reset + } + + + async commit(cmd: any) { + + if (this.gitIsInstalled) { + const status = await gitProxy.commit(this.workingDir, cmd.message) + return status + } + + const commit = await git.commit({ + ...await this.getGitConfig(), + ...cmd + }) + + return commit + } + + async init(input: any) { + await git.init({ + ...await this.getGitConfig(), + defaultBranch: (input && input.branch) || 'main' + }) + } + + async branch(cmd: any) { + + const branch = await git.branch({ + ...await this.getGitConfig(), + ...cmd + }) + + return branch + } + + async lsfiles(cmd: any) { + + const lsfiles = await git.listFiles({ + ...await this.getGitConfig(), + ...cmd + }) + return lsfiles + } + + async resolveref(cmd: any) { + + const resolveref = await git.resolveRef({ + ...await this.getGitConfig(), + ...cmd + }) + + return resolveref + } + + + async readblob(cmd: any) { + + const readblob = await git.readBlob({ + ...await this.getGitConfig(), + ...cmd + }) + + return readblob + } + + async checkout(cmd: any) { + + const checkout = await git.checkout({ + ...await this.getGitConfig(), + ...cmd + }) + + return checkout + } + + async push(cmd: any) { + + + + if (this.gitIsInstalled) { + await gitProxy.push(this.workingDir, cmd.remote, cmd.ref, cmd.remoteRef, cmd.force) + + } else { + + const push = await git.push({ + ...await this.getGitConfig(), + ...cmd, + ...parseInput(cmd.input) + }) + return push + } + + } + + async pull(cmd: any) { + + if (this.gitIsInstalled) { + await gitProxy.pull(this.workingDir, cmd.remote, cmd.ref, cmd.remoteRef) + + } else { + + const pull = await git.pull({ + ...await this.getGitConfig(), + ...cmd, + ...parseInput(cmd.input) + }) + + return pull + + } + } + + async fetch(cmd: any) { + + if (this.gitIsInstalled) { + await gitProxy.fetch(this.workingDir, cmd.remote, cmd.remoteRef) + + } else { + + const fetch = await git.fetch({ + ...await this.getGitConfig(), + ...cmd, + ...parseInput(cmd.input) + }) + + return fetch + } + } + + async clone(cmd: any) { + + + if (this.gitIsInstalled) { + await gitProxy.clone(cmd.url, cmd.dir) + + } else { + try { + const clone = await git.clone({ + ...await this.getGitConfig(), + ...cmd, + ...parseInput(cmd.input), + dir: cmd.dir || this.workingDir + }) + + return clone + } catch (e) { + console.log('CLONE ERROR', e) + throw e + } + } + } + + async addremote(cmd: any) { + + const addremote = await git.addRemote({ + ...await this.getGitConfig(), + ...cmd + }) + + return addremote + } + + async delremote(cmd: any) { + + const delremote = await git.deleteRemote({ + ...await this.getGitConfig(), + ...cmd + }) + + return delremote + } + + + + remotes = async () => { + let remotes = [] + remotes = await git.listRemotes({ ...await this.getGitConfig() }) + return remotes + } + + async currentbranch() { + try { + const defaultConfig = await this.getGitConfig() + const name = await git.currentBranch(defaultConfig) + + return name + } catch (e) { + return '' + } + } + + + async branches() { + try { + let cmd: any = { ...await this.getGitConfig() } + const remotes = await this.remotes() + let branches = [] + branches = (await git.listBranches(cmd)).map((branch) => { return { remote: undefined, name: branch } }) + for (const remote of remotes) { + cmd = { + ...cmd, + remote: remote.remote + } + + const remotebranches = (await git.listBranches(cmd)).map((branch) => { return { remote: remote.remote, name: branch } }) + branches = [...branches, ...remotebranches] + + } + + return branches + } catch (e) { + return [] + } + } + + + async startClone() { + this.call('filePanel' as any, 'clone') + } + +} + + + diff --git a/apps/remixdesktop/src/plugins/templates.ts b/apps/remixdesktop/src/plugins/templates.ts new file mode 100644 index 0000000000..b5882ea947 --- /dev/null +++ b/apps/remixdesktop/src/plugins/templates.ts @@ -0,0 +1,72 @@ +import { PluginClient } from "@remixproject/plugin"; +import { Profile } from "@remixproject/plugin-utils"; +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" +import * as templateWithContent from '@remix-project/remix-ws-templates' +import fs from 'fs/promises' +import { createWindow } from "../main"; +import path from 'path' + +const profile: Profile = { + name: 'electronTemplates', + displayName: 'electronTemplates', + description: 'Templates plugin', +} + +export class TemplatesPlugin extends ElectronBasePlugin { + clients: TemplatesPluginClient[] = [] + constructor() { + super(profile, clientProfile, TemplatesPluginClient) + } + + openTemplate(webContentsId: any): void { + const client = this.clients.find(c => c.webContentsId === webContentsId) + if (client) { + client.openTemplate() + } + } + +} + +const clientProfile: Profile = { + name: 'electronTemplates', + displayName: 'electronTemplates', + description: 'Templates plugin', + methods: ['loadTemplateInNewWindow', 'openTemplate'], +} + +export type WorkspaceTemplate = 'gist-template' | 'code-template' | 'remixDefault' | 'blank' | 'ozerc20' | 'zeroxErc20' | 'ozerc721' + +class TemplatesPluginClient extends ElectronBasePluginClient { + + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + } + + async loadTemplateInNewWindow (files: any) { + + let folder = await this.call('fs' as any, 'selectFolder') + if (!folder || folder === '') return + // @ts-ignore + + for (const file in files) { + try { + if(!folder.endsWith('/')) folder += '/' + + await fs.mkdir(path.dirname(folder + file), { recursive: true}) + await fs.writeFile(folder + file, files[file], { + encoding: 'utf8' + }) + } catch (error) { + console.error(error) + } + } + createWindow(folder) + } + + async openTemplate(){ + this.call('filePanel' as any, 'loadTemplate') + } + +} + + diff --git a/apps/remixdesktop/src/plugins/xtermPlugin.ts b/apps/remixdesktop/src/plugins/xtermPlugin.ts new file mode 100644 index 0000000000..fe717e4b33 --- /dev/null +++ b/apps/remixdesktop/src/plugins/xtermPlugin.ts @@ -0,0 +1,153 @@ +import { PluginClient } from "@remixproject/plugin"; +import { Profile } from "@remixproject/plugin-utils"; +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" + +import os from 'os'; +import * as pty from "node-pty" + +import process from 'node:process'; +import { userInfo } from 'node:os'; +import { findExecutable } from "../utils/findExecutable"; + +export const detectDefaultShell = () => { + const { env } = process; + + if (process.platform === 'win32') { + return env.SHELL || 'powershell.exe'; + } + + try { + const { shell } = userInfo(); + if (shell) { + return shell; + } + } catch { } + + if (process.platform === 'darwin') { + return env.SHELL || '/bin/zsh'; + } + + return env.SHELL || '/bin/sh'; +}; + +// Stores default shell when imported. +const defaultShell = detectDefaultShell(); + + +export default defaultShell; + + +const profile: Profile = { + name: 'xterm', + displayName: 'xterm', + description: 'xterm plugin', +} + +export class XtermPlugin extends ElectronBasePlugin { + clients: XtermPluginClient[] = [] + constructor() { + super(profile, clientProfile, XtermPluginClient) + this.methods = [...super.methods, 'closeTerminals'] + } + + new(webContentsId: any): void { + const client = this.clients.find(c => c.webContentsId === webContentsId) + if (client) { + client.new() + } + } + + async closeTerminals(): Promise { + for (const client of this.clients) { + await client.closeAll() + } + } + +} + +const clientProfile: Profile = { + name: 'xterm', + displayName: 'xterm', + description: 'xterm plugin', + methods: ['createTerminal', 'close', 'keystroke', 'getShells'] +} + +class XtermPluginClient extends ElectronBasePluginClient { + + terminals: pty.IPty[] = [] + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + this.onload(() => { + this.emit('loaded') + }) + } + + async keystroke(key: string, pid: number): Promise { + this.terminals[pid].write(key) + } + + async getShells(): Promise { + if(os.platform() === 'win32') { + const bash = await findExecutable('bash.exe') + if(bash) { + const shells = ['powershell.exe', 'cmd.exe', ...bash] + // filter out duplicates + return shells.filter((v, i, a) => a.indexOf(v) === i) + } + return ['powershell.exe', 'cmd.exe'] + } + return [defaultShell] + } + + + async createTerminal(path?: string, shell?: string): Promise { + + + // filter undefined out of the env + const env = Object.keys(process.env) + .filter(key => process.env[key] !== undefined) + .reduce((env, key) => { + env[key] = process.env[key] || ''; + return env; + }, {} as Record); + + + const ptyProcess = pty.spawn(shell || defaultShell, [], { + name: 'xterm-color', + cols: 80, + rows: 20, + cwd: path || process.cwd(), + env: env + }); + + ptyProcess.onData((data: string) => { + this.sendData(data, ptyProcess.pid); + }) + this.terminals[ptyProcess.pid] = ptyProcess + + return ptyProcess.pid + } + + async close(pid: number): Promise { + this.terminals[pid].kill() + delete this.terminals[pid] + this.emit('close', pid) + } + + async closeAll(): Promise { + for (const pid in this.terminals) { + this.terminals[pid].kill() + delete this.terminals[pid] + this.emit('close', pid) + } + } + + + async sendData(data: string, pid: number) { + this.emit('data', data, pid) + } + + async new(): Promise { + } + +} \ No newline at end of file diff --git a/apps/remixdesktop/src/preload.ts b/apps/remixdesktop/src/preload.ts new file mode 100644 index 0000000000..9d5c983900 --- /dev/null +++ b/apps/remixdesktop/src/preload.ts @@ -0,0 +1,33 @@ + +import { Message } from '@remixproject/plugin-utils' +import { contextBridge, ipcRenderer } from 'electron' + +console.log('preload.ts') + +/* preload script needs statically defined API for each plugin */ + +const exposedPLugins = ['fs', 'git', 'xterm', 'isogit', 'electronconfig', 'electronTemplates'] + +let webContentsId: number | undefined + +ipcRenderer.invoke('getWebContentsID').then((id: number) => { + webContentsId = id +}) + +contextBridge.exposeInMainWorld('electronAPI', { + activatePlugin: (name: string) => { + return ipcRenderer.invoke('manager:activatePlugin', name) + }, + + getWindowId: () => ipcRenderer.invoke('getWindowID'), + + plugins: exposedPLugins.map(name => { + return { + name, + on: (cb:any) => ipcRenderer.on(`${name}:send`, cb), + send: (message: Partial) => { + ipcRenderer.send(`${name}:on:${webContentsId}`, message) + } + } + }) +}) \ No newline at end of file diff --git a/apps/remixdesktop/src/tools/git.ts b/apps/remixdesktop/src/tools/git.ts new file mode 100644 index 0000000000..b63f0544ab --- /dev/null +++ b/apps/remixdesktop/src/tools/git.ts @@ -0,0 +1,151 @@ +import { exec } from 'child_process'; +import { CommitObject, ReadCommitResult } from 'isomorphic-git'; +import { promisify } from 'util'; +const execAsync = promisify(exec); + +const statusTransFormMatrix = (status: string) => { + switch (status) { + case '??': + return [0, 2, 0] + case 'A ': + return [0, 2, 2] + case 'M ': + return [1, 2, 2] + case 'MM': + return [1, 2, 3] + case ' M': + return [1, 2, 0] + case ' D': + return [1, 0, 1] + case 'D ': + return [1, 0, 0] + case 'AM': + return [0, 2, 3] + default: + return [-1, -1, -1] + } +} + +export const gitProxy = { + + version: async () => { + try { + const result = await execAsync('git --version'); + return result.stdout + } catch (error) { + return false; + } + }, + + + + clone: async (url: string, path: string) => { + const { stdout, stderr } = await execAsync(`git clone ${url} ${path}`); + }, + + async push(path: string, remote: string, src: string, branch: string, force: boolean = false) { + const { stdout, stderr } = await execAsync(`git push ${force ? ' -f' : ''} ${remote} ${src}:${branch}`, { cwd: path }); + }, + + async pull(path: string, remote: string, src: string, branch: string) { + const { stdout, stderr } = await execAsync(`git pull ${remote} ${src}:${branch}`, { cwd: path }); + }, + + async fetch(path: string, remote: string, branch: string) { + const { stdout, stderr } = await execAsync(`git fetch ${remote} ${branch}`, { cwd: path }); + }, + + async commit(path: string, message: string) { + + await execAsync(`git commit -m ${message}`, { cwd: path }); + const { stdout, stderr } = await execAsync(`git rev-parse HEAD`, { cwd: path }); + return stdout; + + }, + + + status: async (path: string) => { + const result = await execAsync('git status --porcelain -uall', { cwd: path }) + //console.log('git status --porcelain -uall', result.stdout) + // parse the result.stdout + const lines = result.stdout.split('\n') + const files: any = [] + const fileNames: any = [] + //console.log('lines', lines) + lines.forEach((line: string) => { + // get the first two characters of the line + const status = line.slice(0, 2) + + const file = line.split(' ').pop() + + //console.log('line', line) + if (status && file) { + fileNames.push(file) + files.push([ + file, + ...statusTransFormMatrix(status) + ]) + } + } + ) + // sort files by first column + files.sort((a: any, b: any) => { + if (a[0] < b[0]) { + return -1 + } + if (a[0] > b[0]) { + return 1 + } + return 0 + }) + + + return files + }, + + + // buggy, doesn't work properly yet on windows + log: async (path: string, ref: string) => { + const result = await execAsync('git log ' + ref + ' --pretty=format:"{ oid:%H, message:"%s", author:"%an", email: "%ae", timestamp:"%at", tree: "%T", committer: "%cn", committer-email: "%ce", committer-timestamp: "%ct", parent: "%P" }" -n 20', { cwd: path }) + console.log('git log', result.stdout) + const lines = result.stdout.split('\n') + const commits: ReadCommitResult[] = [] + console.log('lines', lines) + lines.forEach((line: string) => { + console.log('line', normalizeJson(line)) + line = normalizeJson(line) + const data = JSON.parse(line) + let commit: ReadCommitResult = {} as ReadCommitResult + commit.oid = data.oid + commit.commit = {} as CommitObject + commit.commit.message = data.message + commit.commit.tree = data.tree + commit.commit.committer = {} as any + commit.commit.committer.name = data.committer + commit.commit.committer.email = data['committer-email'] + commit.commit.committer.timestamp = data['committer-timestamp'] + commit.commit.author = {} as any + commit.commit.author.name = data.author + commit.commit.author.email = data.email + commit.commit.author.timestamp = data.timestamp + commit.commit.parent = [data.parent] + console.log('commit', commit) + commits.push(commit) + + }) + + return commits + + } +} + +function normalizeJson(str: string) { + return str.replace(/[\s\n\r\t]/gs, '').replace(/,([}\]])/gs, '$1') + .replace(/([,{\[]|)(?:("|'|)([\w_\- ]+)\2:|)("|'|)(.*?)\4([,}\]])/gs, (str, start, q1, index, q2, item, end) => { + item = item.replace(/"/gsi, '').trim(); + if (index) { index = '"' + index.replace(/"/gsi, '').trim() + '"'; } + if (!item.match(/^[0-9]+(\.[0-9]+|)$/) && !['true', 'false'].includes(item)) { item = '"' + item + '"'; } + if (index) { return start + index + ':' + item + end; } + return start + item + end; + }); +} diff --git a/apps/remixdesktop/src/utils/config.ts b/apps/remixdesktop/src/utils/config.ts new file mode 100644 index 0000000000..7ce7244dcd --- /dev/null +++ b/apps/remixdesktop/src/utils/config.ts @@ -0,0 +1,39 @@ +import fs from 'fs' +import os from 'os' +import path from 'path' + +const cacheDir = path.join(os.homedir(), '.cache_remix_ide') + +console.log('cacheDir', cacheDir) + +try { + if (!fs.existsSync(cacheDir)) { + fs.mkdirSync(cacheDir) + } + if(!fs.existsSync(cacheDir + '/remixdesktop.json')) { + fs.writeFileSync(cacheDir + '/remixdesktop.json', JSON.stringify({})) + } +} catch (e) { +} +export const writeConfig = (data: any) => { + const cache = readConfig() + try { + fs.writeFileSync(cacheDir + '/remixdesktop.json', JSON.stringify({ ...cache, ...data })) + } catch (e) { + console.error('Can\'t write config file', e) + } +} + +export const readConfig = () => { + if (fs.existsSync(cacheDir + '/remixdesktop.json')) { + try { + // read the cache file + const cache = fs.readFileSync(cacheDir + '/remixdesktop.json') + const data = JSON.parse(cache.toString()) + return data + } catch (e) { + console.error('Can\'t read config file', e) + } + } + return undefined +} \ No newline at end of file diff --git a/apps/remixdesktop/src/utils/findExecutable.ts b/apps/remixdesktop/src/utils/findExecutable.ts new file mode 100644 index 0000000000..aea1d7412a --- /dev/null +++ b/apps/remixdesktop/src/utils/findExecutable.ts @@ -0,0 +1,86 @@ +import path from "path"; +import process from "process"; +import { Stats } from "fs"; +import fs from 'fs/promises' + +export async function findExecutable(command: string, cwd?: string, paths?: string[]): Promise { + // If we have an absolute path then we take it. + if (path.isAbsolute(command)) { + return [command]; + } + if (cwd === undefined) { + cwd = process.cwd(); + } + + + const dir = path.dirname(command); + if (dir !== '.') { + // We have a directory and the directory is relative (see above). Make the path absolute + // to the current working directory. + return [path.join(cwd, command)]; + } + + + + if (paths === undefined && typeof process.env['PATH'] === 'string') { + paths = (process && process.env['PATH'] && process.env['PATH'].split(path.delimiter)) || []; + } + // No PATH environment. Make path absolute to the cwd. + if (paths === undefined || paths.length === 0) { + return []; + } + + + + async function fileExists(path: string): Promise { + + try { + if (await fs.stat(path)) { + let statValue: Stats | undefined; + try { + statValue = await fs.stat(path); + } catch (e: any) { + if (e.message.startsWith('EACCES')) { + // it might be symlink + statValue = await fs.lstat(path); + } + } + + return statValue ? !statValue.isDirectory() : false; + } + } catch (e) { + } + return false; + } + + // We have a simple file name. We get the path variable from the env + // and try to find the executable on the path. + + const results = []; + + for (const pathEntry of paths) { + + // The path entry is absolute. + let fullPath: string; + if (path.isAbsolute(pathEntry)) { + fullPath = path.join(pathEntry, command); + } else { + fullPath = path.join(cwd, pathEntry, command); + } + if (await fileExists(fullPath)) { + results.push(fullPath); + } + let withExtension = fullPath + '.com'; + if (await fileExists(withExtension)) { + results.push(withExtension); + } + withExtension = fullPath + '.exe'; + if (await fileExists(withExtension)) { + results.push(withExtension); + } + } + if (results.length > 0) { + return results; + } + return []; +} \ No newline at end of file diff --git a/apps/remixdesktop/tsconfig.json b/apps/remixdesktop/tsconfig.json new file mode 100644 index 0000000000..63acb26bd4 --- /dev/null +++ b/apps/remixdesktop/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "skipLibCheck": true, + "esModuleInterop": true, + "noImplicitAny": true, + "allowSyntheticDefaultImports": true, + "sourceMap": true, + "strictPropertyInitialization": false, + "strict": true, + "outDir": "build", + "rootDir": "./src/", + "noEmitOnError": true, + "typeRoots": ["node_modules/@types", "./types"] + } +} \ No newline at end of file diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock new file mode 100644 index 0000000000..155261924c --- /dev/null +++ b/apps/remixdesktop/yarn.lock @@ -0,0 +1,5069 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"7zip-bin@~5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876" + integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ== + +"@develar/schema-utils@~2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" + integrity sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig== + dependencies: + ajv "^6.12.0" + ajv-keywords "^3.4.1" + +"@electron/get@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" + integrity sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^11.8.5" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + +"@electron/rebuild@^3.2.13": + version "3.2.13" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.2.13.tgz#98fbb98981b1a86162546a2ab91b2355569cca4c" + integrity sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + fs-extra "^10.0.0" + got "^11.7.0" + node-abi "^3.0.0" + node-api-version "^0.1.4" + node-gyp "^9.0.0" + ora "^5.1.0" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" + integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + asar "^3.1.0" + debug "^4.3.1" + dir-compare "^2.4.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + +"@ethereumjs/common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.1" + +"@ethereumjs/common@^2.5.0": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/tx@3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== + dependencies: + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" + +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" + integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== + dependencies: + cross-spawn "^7.0.1" + +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + +"@malept/flatpak-bundler@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" + integrity sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.0" + lodash "^4.17.15" + tmp-promise "^3.0.2" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@openzeppelin/contracts@^4.7.3": + version "4.9.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.2.tgz#1cb2d5e4d3360141a17dbc45094a8cad6aac16c1" + integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== + +"@openzeppelin/wizard@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@openzeppelin/wizard/-/wizard-0.1.1.tgz#8c183e2c5748869bc3a5317c0330aa36a9ad44fe" + integrity sha512-AGyvn3PIh1vCgAEoRKAXKhtlk4fkA8AHE7G4PyzLnYcASClYCWpSf43WLJCs6S/LORvTZADX1flvF8x2LciJIg== + dependencies: + array.prototype.flatmap "^1.2.4" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@remix-project/remix-ws-templates@^1.0.19": + version "1.0.19" + resolved "https://registry.yarnpkg.com/@remix-project/remix-ws-templates/-/remix-ws-templates-1.0.19.tgz#d7527e8921e807270f67f2442441542ac924f246" + integrity sha512-Ku/0RCH2LVE08jVLE6LsQjSWBqC+pq+CJjItcde3eLxjNU+xK60L9CfjACYHTPquiJapCtIZEYcVSWzWF4UXBg== + dependencies: + "@openzeppelin/contracts" "^4.7.3" + "@openzeppelin/wizard" "^0.1.1" + ethers "^5.4.2" + web3 "^1.5.1" + +"@remixproject/engine-electron@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/engine-electron/-/engine-electron-0.3.37.tgz#5e14bcf08201603cfccff0761d6f8612b1f3d62f" + integrity sha512-XQea0a5SPtYtOl1XH8qu9AN+Fkc/LSZ8FYuxenFUeczqy9t4gxlPibLrCQXSlrcNEdoGhDE/DW/wltQoX8JLtg== + dependencies: + "@remixproject/engine" "0.3.37" + "@remixproject/plugin-api" "0.3.37" + "@remixproject/plugin-utils" "0.3.37" + +"@remixproject/engine@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/engine/-/engine-0.3.37.tgz#995abd53c505f6f37eaa6550d81ec36f2e60d106" + integrity sha512-+dO32Bdgm2GLlamCnCWIPYX0v57Ft2vWGkFwXil1xiLvPttVOjnSPkqz9Xu0DAqDIqXIr4A15E2pHklVR+shLQ== + dependencies: + "@remixproject/plugin-api" "0.3.37" + "@remixproject/plugin-utils" "0.3.37" + +"@remixproject/plugin-api@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.37.tgz#2b5c628f81632bb0063e4c6afbce62085d20e883" + integrity sha512-bJ8oIpaI4qP3/Ku7jxXW3XRkTyQ2hjWX6N8yob3d/jjHtaJ/IorDx/vieGXQoJTPKAMPol0KVKCVCxx+xmzcUQ== + dependencies: + "@remixproject/plugin-utils" "0.3.37" + +"@remixproject/plugin-electron@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-electron/-/plugin-electron-0.3.37.tgz#e850b6aae55af1e7b0cd74f4583e8eeb946735ce" + integrity sha512-ZmkYLk9LEewPCqXIiMPJC8ZpgRjMW3dh2LbgeSGhKG0ly8pD5VuZj3/07iP/ZvjDNuTliX08gqvCru9/oOskqA== + dependencies: + "@remixproject/engine" "0.3.37" + "@remixproject/plugin" "0.3.37" + "@remixproject/plugin-api" "0.3.37" + "@remixproject/plugin-utils" "0.3.37" + +"@remixproject/plugin-utils@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-utils/-/plugin-utils-0.3.37.tgz#7068523398164976c2470f55837e93c6fa210489" + integrity sha512-Ow4gFf15ym7Sysza4hx4+QEYQHvluu0pDEj3GlNAMWAbvbjBGxb7O81b3Tvu7n8ywESYJlbIifNr++vYY63+PQ== + dependencies: + tslib "2.0.1" + +"@remixproject/plugin@0.3.37": + version "0.3.37" + resolved "https://registry.yarnpkg.com/@remixproject/plugin/-/plugin-0.3.37.tgz#d7b41a7fd03d712717eeb44526399e6c6ce6647c" + integrity sha512-3DgGCPE78ThfqGUJlrWwdArRol2nLZMBHTZpPxLE9K4tpspY7G1KV8HLB55mkX/uPVvVbNTRoFI4TNm87Jjiwg== + dependencies: + "@remixproject/plugin-api" "0.3.37" + "@remixproject/plugin-utils" "0.3.37" + events "3.2.0" + +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/debug@^4.1.6": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + dependencies: + "@types/ms" "*" + +"@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*": + version "20.3.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.2.tgz#fa6a90f2600e052a03c18b8cb3fd83dd4e599898" + integrity sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw== + +"@types/node@^12.12.6": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/node@^18.11.18": + version "18.16.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.18.tgz#85da09bafb66d4bc14f7c899185336d0c1736390" + integrity sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/plist@^3.0.1": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.2.tgz#61b3727bba0f5c462fe333542534a0c3e19ccb01" + integrity sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw== + dependencies: + "@types/node" "*" + xmlbuilder ">=11.0.1" + +"@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/verror@^1.10.3": + version "1.10.6" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.6.tgz#3e600c62d210c5826460858f84bcbb65805460bb" + integrity sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.1": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@vscode/ripgrep@^1.15.4": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.5.tgz#26025884bbc3a8b40dfc29f5bda4b87b47bd7356" + integrity sha512-PVvKNEmtnlek3i4MJMaB910dz46CKQqcIY2gKR3PSlfz/ZPlSYuSuyQMS7iK20KL4hGUdSbWt964B5S5EIojqw== + dependencies: + https-proxy-agent "^5.0.0" + proxy-from-env "^1.1.0" + +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abortcontroller-polyfill@^1.7.3: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.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.10.0, ajv@^6.12.0, ajv@^6.12.3: + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-builder-bin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" + integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== + +app-builder-lib@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8" + integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA== + dependencies: + "7zip-bin" "~5.1.1" + "@develar/schema-utils" "~2.6.5" + "@electron/universal" "1.2.1" + "@malept/flatpak-bundler" "^0.4.0" + async-exit-hook "^2.0.1" + bluebird-lst "^1.0.9" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chromium-pickle-js "^0.2.0" + debug "^4.3.4" + ejs "^3.1.7" + electron-osx-sign "^0.6.0" + electron-publish "23.6.0" + form-data "^4.0.0" + fs-extra "^10.1.0" + hosted-git-info "^4.1.0" + is-ci "^3.0.0" + isbinaryfile "^4.0.10" + js-yaml "^4.1.0" + lazy-val "^1.0.5" + minimatch "^3.1.2" + read-config-file "6.2.0" + sanitize-filename "^1.6.3" + semver "^7.3.7" + tar "^6.1.11" + temp-file "^3.4.0" + +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array.prototype.flatmap@^1.2.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +asar@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" + integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-exit-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" + integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== + +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-lock@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.0.tgz#c8b6630eff68fbbdd8a5b6eb763dac3bfbb8bf02" + integrity sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2, base-x@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1, base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bignumber.js@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" + integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== + +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== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bluebird-lst@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" + integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== + dependencies: + bluebird "^3.5.5" + +bluebird@^3.5.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.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.6, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.16.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +boolean@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" + integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== + +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" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +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.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browserify-aes@^1.2.0: + 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" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" + integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@^5.0.5, buffer@^5.1.0, buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bufferutil@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + dependencies: + node-gyp-build "^4.3.0" + +builder-util-runtime@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" + integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw== + dependencies: + debug "^4.3.4" + sax "^1.2.4" + +builder-util@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9" + integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ== + dependencies: + "7zip-bin" "~5.1.1" + "@types/debug" "^4.1.6" + "@types/fs-extra" "^9.0.11" + app-builder-bin "4.0.0" + bluebird-lst "^1.0.9" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + cross-spawn "^7.0.3" + debug "^4.3.4" + fs-extra "^10.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-ci "^3.0.0" + js-yaml "^4.1.0" + source-map-support "^0.5.19" + stat-mode "^1.0.0" + temp-file "^3.4.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + +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-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + +clean-git-ref@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/clean-git-ref/-/clean-git-ref-2.0.1.tgz#dcc0ca093b90e527e67adb5a5e55b1af6816dcd9" + integrity sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== + dependencies: + graceful-readlink ">= 1.0.0" + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cors@^2.8.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +crc@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + +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.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" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-fetch@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" + integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + dependencies: + node-fetch "^2.6.11" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.6.8: + 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@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@2.0.0, depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +diff3@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/diff3/-/diff3-0.0.3.tgz#d4e5c3a4cdf4e5fe1211ab42e693fcb4321580fc" + integrity sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g== + +dir-compare@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" + integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== + dependencies: + buffer-equal "1.0.0" + colors "1.0.3" + commander "2.9.0" + minimatch "3.0.4" + +dmg-builder@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948" + integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA== + dependencies: + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + fs-extra "^10.0.0" + iconv-lite "^0.6.2" + js-yaml "^4.1.0" + optionalDependencies: + dmg-license "^1.0.11" + +dmg-license@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/dmg-license/-/dmg-license-1.0.11.tgz#7b3bc3745d1b52be7506b4ee80cb61df6e4cd79a" + integrity sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q== + dependencies: + "@types/plist" "^3.0.1" + "@types/verror" "^1.10.3" + ajv "^6.10.0" + crc "^3.8.0" + iconv-corefoundation "^1.1.7" + plist "^3.0.4" + smart-buffer "^4.0.2" + verror "^1.10.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" + integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.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 sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-builder@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b" + integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw== + dependencies: + "@types/yargs" "^17.0.1" + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + dmg-builder "23.6.0" + fs-extra "^10.0.0" + is-ci "^3.0.0" + lazy-val "^1.0.5" + read-config-file "6.2.0" + simple-update-notifier "^1.0.7" + yargs "^17.5.1" + +electron-osx-sign@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" + integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^3.0.1" + +electron-publish@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9" + integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg== + dependencies: + "@types/fs-extra" "^9.0.11" + builder-util "23.6.0" + builder-util-runtime "9.1.1" + chalk "^4.1.1" + fs-extra "^10.0.0" + lazy-val "^1.0.5" + mime "^2.5.2" + +electron@^25.0.1: + version "25.2.0" + resolved "https://registry.yarnpkg.com/electron/-/electron-25.2.0.tgz#ff832d88f78481a82cf9feb72e605ec43553d4ba" + integrity sha512-I/rhcW2sV2fyiveVSBr2N7v5ZiCtdGY0UiNCDZgk2fpSC+irQjbeh7JT2b4vWmJ2ogOXBjqesrN9XszTIG6DHg== + dependencies: + "@electron/get" "^2.0.0" + "@types/node" "^18.11.18" + extract-zip "^2.0.1" + +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +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" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +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" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eth-ens-namehash@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + nano-json-stream-parser "^0.1.2" + servify "^0.1.12" + ws "^3.0.0" + xhr-request-promise "^0.1.2" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^5.4.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +events@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" + integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== + +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" + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +express@^4.14.0: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +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== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +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.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data-encoder@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +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== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +get-caller-file@^2.0.5: + 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-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@9.3.5: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +glob@^10.2.2: + version "10.3.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.0.tgz#763d02a894f3cdfc521b10bbbbc8e0309e750cce" + integrity sha512-AQ1/SB9HH0yCx1jXAT4vmCbTOPe5RQ+kCurjbel5xSCGhebumUv+GJZfa1rEqor3XIViqwSEmlkZCQD43RWrBg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2" + path-scurry "^1.7.0" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globalthis@^1.0.1, globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +got@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== + dependencies: + "@sindresorhus/is" "^4.6.0" + "@szmarczak/http-timer" "^5.0.1" + "@types/cacheable-request" "^6.0.2" + "@types/responselike" "^1.0.0" + cacheable-lookup "^6.0.4" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + form-data-encoder "1.7.1" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^2.0.0" + +got@^11.7.0, got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +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.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.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + 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.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-corefoundation@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" + integrity sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ== + dependencies: + cli-truncate "^2.1.0" + node-addon-api "^1.6.3" + +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" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + +ipaddr.js@1.9.1: + 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-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +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-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.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 sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +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-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isbinaryfile@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" + +isbinaryfile@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" + integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-git@^1.24.2: + version "1.24.2" + resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.24.2.tgz#16ee555f1cc8a812bb1337fa6d90def7f7ad03e6" + integrity sha512-J3TU97JENWUnOgpVMwaRP9a3OQXJq/8fCIzA4yrJ7+ko1IPJwXCYeA69CeC8GtHeBVhcOQrbZGw6fpIpz54Vpw== + dependencies: + async-lock "^1.1.0" + clean-git-ref "^2.0.1" + crc-32 "^1.2.0" + diff3 "0.0.3" + ignore "^5.1.4" + minimisted "^2.0.0" + pako "^1.0.10" + pify "^4.0.1" + readable-stream "^3.4.0" + sha.js "^2.4.9" + simple-get "^4.0.1" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +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== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keccak@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keyv@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== + dependencies: + json-buffer "3.0.1" + +lazy-val@^1.0.4, lazy-val@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" + integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== + +lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +lru-cache@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== + +make-fetch-happen@^11.0.3: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.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 sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.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.5.2: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +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.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +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" + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.2.tgz#397e387fff22f6795844d00badc903a3d5de7057" + integrity sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minimisted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minimisted/-/minimisted-2.0.1.tgz#d059fb905beecf0774bc3b308468699709805cb1" + integrity sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA== + dependencies: + minimist "^1.2.5" + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" + integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== + dependencies: + mkdirp "*" + +mkdirp@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mock-fs@^4.1.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== + dependencies: + buffer "^5.6.0" + varint "^5.0.0" + +multihashes@^0.4.15, multihashes@~0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + +nan@^2.14.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +nano-json-stream-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== + +negotiator@0.6.3, negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-abi@^3.0.0: + version "3.45.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" + integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== + dependencies: + semver "^7.3.5" + +node-addon-api@^1.6.3: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-api-version@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" + integrity sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g== + dependencies: + semver "^7.3.5" + +node-fetch@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +node-gyp@^9.0.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + +node-pty@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.10.1.tgz#cd05d03a2710315ec40221232ec04186f6ac2c6d" + integrity sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg== + dependencies: + nan "^2.14.0" + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +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== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +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.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.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 sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +pako@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +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== + +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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-scurry@^1.6.1, path-scurry@^1.7.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" + integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== + dependencies: + lru-cache "^9.1.1" + minipass "^5.0.0 || ^6.0.2" + +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 sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + 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" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +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== + +plist@^3.0.1, plist@^3.0.4: + version "3.0.6" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" + integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + dependencies: + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +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" + +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +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" + +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.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-config-file@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" + integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== + dependencies: + dotenv "^9.0.2" + dotenv-expand "^5.1.0" + js-yaml "^4.1.0" + json5 "^2.2.0" + lazy-val "^1.0.4" + +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +request@^2.79.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + 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" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +roarr@^2.15.3: + version "2.15.4" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" + integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== + dependencies: + boolean "^3.0.1" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +safe-buffer@5.2.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.1, 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: + 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-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, 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== + +sanitize-filename@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== + +semver@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@^2.4.9: + 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.0.2, smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + +source-map-support@^0.5.19: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + +stat-mode@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" + integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +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" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +swarm-js@^0.1.40: + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^11.8.5" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request "^1.0.1" + +tar@^4.0.2: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-file@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" + integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== + dependencies: + async-exit-hook "^2.0.1" + fs-extra "^10.0.0" + +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + +tmp-promise@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" + integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== + dependencies: + tmp "^0.2.0" + +tmp@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +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" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== + dependencies: + utf8-byte-length "^1.0.1" + +tslib@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +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" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" + integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +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 sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +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" + +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.12.5: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +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== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + +varint@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +verror@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb" + integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +web3-bzz@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.0.tgz#ac74bc71cdf294c7080a79091079192f05c5baed" + integrity sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA== + dependencies: + "@types/node" "^12.12.6" + got "12.1.0" + swarm-js "^0.1.40" + +web3-core-helpers@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz#1016534c51a5df77ed4f94d1fcce31de4af37fad" + integrity sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g== + dependencies: + web3-eth-iban "1.10.0" + web3-utils "1.10.0" + +web3-core-method@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.0.tgz#82668197fa086e8cc8066742e35a9d72535e3412" + integrity sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-utils "1.10.0" + +web3-core-promievent@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz#cbb5b3a76b888df45ed3a8d4d8d4f54ccb66a37b" + integrity sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz#4b34f6e05837e67c70ff6f6993652afc0d54c340" + integrity sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.0" + web3-providers-http "1.10.0" + web3-providers-ipc "1.10.0" + web3-providers-ws "1.10.0" + +web3-core-subscriptions@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz#b534592ee1611788fc0cb0b95963b9b9b6eacb7c" + integrity sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.0" + +web3-core@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.0.tgz#9aa07c5deb478cf356c5d3b5b35afafa5fa8e633" + integrity sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ== + dependencies: + "@types/bn.js" "^5.1.1" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-requestmanager "1.10.0" + web3-utils "1.10.0" + +web3-eth-abi@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz#53a7a2c95a571e205e27fd9e664df4919483cce1" + integrity sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.10.0" + +web3-eth-accounts@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz#2942beca0a4291455f32cf09de10457a19a48117" + integrity sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q== + dependencies: + "@ethereumjs/common" "2.5.0" + "@ethereumjs/tx" "3.3.2" + eth-lib "0.2.8" + ethereumjs-util "^7.1.5" + scrypt-js "^3.0.1" + uuid "^9.0.0" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" + +web3-eth-contract@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz#8e68c7654576773ec3c91903f08e49d0242c503a" + integrity sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w== + dependencies: + "@types/bn.js" "^5.1.1" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-promievent "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-utils "1.10.0" + +web3-eth-ens@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz#96a676524e0b580c87913f557a13ed810cf91cd9" + integrity sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-promievent "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-contract "1.10.0" + web3-utils "1.10.0" + +web3-eth-iban@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz#5a46646401965b0f09a4f58e7248c8a8cd22538a" + integrity sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.0" + +web3-eth-personal@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz#94d525f7a29050a0c2a12032df150ac5ea633071" + integrity sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" + +web3-eth@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.0.tgz#38b905e2759697c9624ab080cfcf4e6c60b3a6cf" + integrity sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA== + dependencies: + web3-core "1.10.0" + web3-core-helpers "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-eth-abi "1.10.0" + web3-eth-accounts "1.10.0" + web3-eth-contract "1.10.0" + web3-eth-ens "1.10.0" + web3-eth-iban "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-utils "1.10.0" + +web3-net@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.0.tgz#be53e7f5dafd55e7c9013d49c505448b92c9c97b" + integrity sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA== + dependencies: + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-utils "1.10.0" + +web3-providers-http@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.0.tgz#864fa48675e7918c9a4374e5f664b32c09d0151b" + integrity sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA== + dependencies: + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.10.0" + +web3-providers-ipc@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz#9747c7a6aee96a51488e32fa7c636c3460b39889" + integrity sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.10.0" + +web3-providers-ws@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz#cb0b87b94c4df965cdf486af3a8cd26daf3975e5" + integrity sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.0" + websocket "^1.0.32" + +web3-shh@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.0.tgz#c2979b87e0f67a7fef2ce9ee853bd7bfbe9b79a8" + integrity sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg== + dependencies: + web3-core "1.10.0" + web3-core-method "1.10.0" + web3-core-subscriptions "1.10.0" + web3-net "1.10.0" + +web3-utils@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.0.tgz#ca4c1b431a765c14ac7f773e92e0fd9377ccf578" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3@^1.5.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.0.tgz#2fde0009f59aa756c93e07ea2a7f3ab971091274" + integrity sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng== + dependencies: + web3-bzz "1.10.0" + web3-core "1.10.0" + web3-eth "1.10.0" + web3-eth-personal "1.10.0" + web3-net "1.10.0" + web3-shh "1.10.0" + web3-utils "1.10.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.2, which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.0.1, xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr@^2.0.4, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + +yallist@^3.0.0, yallist@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.1, yargs@^17.5.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" diff --git a/libs/remix-core-plugin/src/lib/gist-handler.ts b/libs/remix-core-plugin/src/lib/gist-handler.ts index 7c0ed92542..5a1e04d98e 100644 --- a/libs/remix-core-plugin/src/lib/gist-handler.ts +++ b/libs/remix-core-plugin/src/lib/gist-handler.ts @@ -1,6 +1,7 @@ /* global fetch */ 'use strict' import { Plugin } from '@remixproject/engine' +import isElectron from 'is-electron' interface StringByString { [key: string]: string; @@ -118,7 +119,7 @@ export class GistHandler extends Plugin { const path = element.replace(/\.\.\./g, '/') obj['/gist-' + gistId + '/' + path] = data.files[element] }) - this.call('fileManager', 'setBatchFiles', obj, 'workspace', true, async (errorSavingFiles: any) => { + this.call('fileManager', 'setBatchFiles', obj, isElectron()? 'electron':'workspace', true, async (errorSavingFiles: any) => { if (errorSavingFiles) { const modalContent = { id: 'gisthandler', diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index 31cbe3dc79..8d07ce8f5b 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -10,6 +10,7 @@ import DialogViewPlugin from './components/modals/dialogViewPlugin' import { AppContext } from './context/context' import { IntlProvider } from 'react-intl' import { CustomTooltip } from '@remix-ui/helper'; +import { RemixUiXterminals } from '@remix-ui/xterm' interface IRemixAppUi { app: any diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx index c8de93004e..b3071577a1 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeatured.tsx @@ -55,7 +55,7 @@ function HomeTabFeatured() {

- +
@@ -73,7 +73,7 @@ function HomeTabFeatured() {
- +
diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx index 0950ab13f1..5fe998c4dc 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFeaturedPlugins.tsx @@ -59,7 +59,7 @@ function HomeTabFeaturedPlugins ({plugin}: HomeTabFeaturedPluginsProps) { } const startSolidity = async () => { - await plugin.appManager.activatePlugin(['solidity', 'udapp', 'solidityStaticAnalysis', 'solidityUnitTesting']) + //await plugin.appManager.activatePlugin(['solidity', 'udapp', 'solidityStaticAnalysis', 'solidityUnitTesting']) plugin.verticalIcons.select('solidity') _paq.push(['trackEvent', 'hometabActivate', 'userActivate', 'solidity']) } diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabFileElectron.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabFileElectron.tsx new file mode 100644 index 0000000000..1f67cfaff5 --- /dev/null +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabFileElectron.tsx @@ -0,0 +1,41 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +import React, { useState, useRef, useReducer } from 'react' +import { FormattedMessage } from 'react-intl' +import { ModalDialog } from '@remix-ui/modal-dialog' // eslint-disable-line +import { Toaster } from '@remix-ui/toaster' // eslint-disable-line +const _paq = window._paq = window._paq || [] // eslint-disable-line +import { CustomTooltip } from '@remix-ui/helper'; + +interface HomeTabFileProps { + plugin: any +} + +export const HomeTabFileElectron = ({ plugin }: HomeTabFileProps) => { + + const loadTemplate = async () => { + plugin.call('filePanel', 'loadTemplate') + } + + const clone = async () => { + plugin.call('filePanel', 'clone') + } + + const importFromGist = () => { + _paq.push(['trackEvent', 'hometab', 'filesSection', 'importFromGist']) + plugin.call('gistHandler', 'load', '') + plugin.verticalIcons.select('filePanel') + } + + return ( +
+ + +
+ + + + +
+
+ ) +} \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx b/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx index 8b672d8994..96f9ec772f 100644 --- a/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx +++ b/libs/remix-ui/home-tab/src/lib/components/homeTabGetStarted.tsx @@ -7,6 +7,7 @@ import Carousel from 'react-multi-carousel' import WorkspaceTemplate from './workspaceTemplate' import 'react-multi-carousel/lib/styles.css' import CustomNavButtons from './customNavButtons' +import isElectron from 'is-electron' declare global { interface Window { _paq: any @@ -58,6 +59,12 @@ function HomeTabGetStarted ({plugin}: HomeTabGetStartedProps) { } const createWorkspace = async (templateName) => { + if(isElectron()){ + await plugin.call('remix-templates', 'loadTemplateInNewWindow', templateName) + return + } + + await plugin.appManager.activatePlugin('filePanel') const timeStamp = Date.now() let templateDisplayName = TEMPLATE_NAMES[templateName] diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 851d6fe5b1..30b5f58f4e 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -9,6 +9,8 @@ import HomeTabScamAlert from './components/homeTabScamAlert' import HomeTabGetStarted from './components/homeTabGetStarted' import HomeTabFeatured from './components/homeTabFeatured' import HomeTabFeaturedPlugins from './components/homeTabFeaturedPlugins' +import isElectron from 'is-electron' +import { HomeTabFileElectron } from './components/homeTabFileElectron' declare global { interface Window { @@ -50,7 +52,9 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => {
- + {!isElectron()? + : + }
diff --git a/libs/remix-ui/panel/src/lib/dragbar/dragbar.tsx b/libs/remix-ui/panel/src/lib/dragbar/dragbar.tsx index 642786e866..fba81e8528 100644 --- a/libs/remix-ui/panel/src/lib/dragbar/dragbar.tsx +++ b/libs/remix-ui/panel/src/lib/dragbar/dragbar.tsx @@ -18,13 +18,13 @@ const DragBar = (props: IRemixDragBarUi) => { function stopDrag (e: MouseEvent, data: any) { const h = window.innerHeight - data.y props.refObject.current.setAttribute('style', `height: ${h}px;`) - setDragBarPosY(window.innerHeight - props.refObject.current.offsetHeight) + setDragBarPosY(props.refObject.current.offsetTop) setDragState(false) props.setHideStatus(false) } const handleResize = () => { if (!props.refObject.current) return - setDragBarPosY(window.innerHeight - props.refObject.current.offsetHeight) + setDragBarPosY(props.refObject.current.offsetTop) } useEffect(() => { diff --git a/libs/remix-ui/panel/src/lib/main/main-panel.css b/libs/remix-ui/panel/src/lib/main/main-panel.css index 28a24ba01d..d23e7b58f9 100644 --- a/libs/remix-ui/panel/src/lib/main/main-panel.css +++ b/libs/remix-ui/panel/src/lib/main/main-panel.css @@ -1,7 +1,7 @@ .mainview { display : flex; flex-direction : column; - height : 100%; + height : 70%; width : 100%; position : relative; } diff --git a/libs/remix-ui/search/src/lib/components/results/ResultItem.tsx b/libs/remix-ui/search/src/lib/components/results/ResultItem.tsx index 36ebb04a87..5a3bb9bc7a 100644 --- a/libs/remix-ui/search/src/lib/components/results/ResultItem.tsx +++ b/libs/remix-ui/search/src/lib/components/results/ResultItem.tsx @@ -29,7 +29,6 @@ export const ResultItem = (props: ResultItemProps) => { useEffect(() => { if (props.file.forceReload) { - console.log('force reload') clearTimeout(reloadTimeOut.current) clearTimeout(loadTimeout.current) subscribed.current = true diff --git a/libs/remix-ui/search/src/lib/components/results/SearchHelper.ts b/libs/remix-ui/search/src/lib/components/results/SearchHelper.ts index fb6b096df2..7cb34a0d42 100644 --- a/libs/remix-ui/search/src/lib/components/results/SearchHelper.ts +++ b/libs/remix-ui/search/src/lib/components/results/SearchHelper.ts @@ -1,9 +1,18 @@ import { EOL } from 'os' import { SearchResultLineLine } from '../../types' +import isElectron from 'is-electron' export const getDirectory = async (dir: string, plugin: any) => { - let result = [] + let result = [] + + if (isElectron()) { + + const files = await plugin.call('fs', 'glob', dir, '**/*') + // only get path property of files + result = files.map(x => x.path) + } else { + const files = await plugin.call('fileManager', 'readdir', dir) const fileArray = normalize(files) for (const fi of fileArray) { @@ -16,94 +25,95 @@ export const getDirectory = async (dir: string, plugin: any) => { } } } - return result } + return result +} - const normalize = filesList => { - const folders = [] - const files = [] - Object.keys(filesList || {}).forEach(key => { - if (filesList[key].isDirectory) { - folders.push({ - filename: key, - data: filesList[key] - }) - } else { - files.push({ - filename: key, - data: filesList[key] - }) - } - }) - return [...folders, ...files] - } +const normalize = filesList => { + const folders = [] + const files = [] + Object.keys(filesList || {}).forEach(key => { + if (filesList[key].isDirectory) { + folders.push({ + filename: key, + data: filesList[key] + }) + } else { + files.push({ + filename: key, + data: filesList[key] + }) + } + }) + return [...folders, ...files] +} export const findLinesInStringWithMatch = (str: string, re: RegExp) => { - return str - .split(/\r?\n/) - .map(function (line, i) { - const matchResult = matchesInString(line, re) - if (matchResult.length) { - return { - lines: splitLines(matchResult, i), - } - } - }) - .filter(Boolean) + return str + .split(/\r?\n/) + .map(function (line, i) { + const matchResult = matchesInString(line, re) + if (matchResult.length) { + return { + lines: splitLines(matchResult, i), + } + } + }) + .filter(Boolean) } const matchesInString = (str: string, re: RegExp) => { - let a: RegExpExecArray - const results:RegExpExecArray[] = []; - while ((a = re.exec(str || '')) !== null) { - results.push(a); - } - return results + let a: RegExpExecArray + const results: RegExpExecArray[] = []; + while ((a = re.exec(str || '')) !== null) { + results.push(a); + } + return results } const splitLines = (matchResult: RegExpExecArray[], lineNumber: number) => { - return matchResult.map((matchResultPart, i) => { - const result:SearchResultLineLine = { - left: matchResultPart.input.substring(0, matchResultPart.index), - right: matchResultPart.input.substring(matchResultPart.index + matchResultPart[0].length), - center: matchResultPart[0], - position : { - start: { - line: lineNumber, - column: matchResultPart.index, - }, - end: { - line: lineNumber, - column: matchResultPart.index + matchResultPart[0].length, - }, - }, - } - return result - }) + return matchResult.map((matchResultPart, i) => { + const result: SearchResultLineLine = { + left: matchResultPart.input.substring(0, matchResultPart.index), + right: matchResultPart.input.substring(matchResultPart.index + matchResultPart[0].length), + center: matchResultPart[0], + position: { + start: { + line: lineNumber, + column: matchResultPart.index, + }, + end: { + line: lineNumber, + column: matchResultPart.index + matchResultPart[0].length, + }, + }, + } + return result + }) } function getEOL(text) { - const m = text.match(/\r\n|\n/g); - const u = m && m.filter(a => a === '\n').length; - const w = m && m.length - u; - if (u === w) { - return EOL; // use the OS default - } - return u > w ? '\n' : '\r\n'; + const m = text.match(/\r\n|\n/g); + const u = m && m.filter(a => a === '\n').length; + const w = m && m.length - u; + if (u === w) { + return EOL; // use the OS default + } + return u > w ? '\n' : '\r\n'; } -export const replaceAllInFile = (string: string, re:RegExp, newText: string) => { +export const replaceAllInFile = (string: string, re: RegExp, newText: string) => { return string.replace(re, newText) } export const replaceTextInLine = (str: string, searchResultLine: SearchResultLineLine, newText: string) => { - return str + return str .split(/\r?\n/) .map(function (line, i) { - if (i === searchResultLine.position.start.line) { - return searchResultLine.left + newText + searchResultLine.right - } - return line + if (i === searchResultLine.position.start.line) { + return searchResultLine.left + newText + searchResultLine.right + } + return line }).join(getEOL(str)) } diff --git a/libs/remix-ui/search/src/lib/context/context.tsx b/libs/remix-ui/search/src/lib/context/context.tsx index c4cc7ca551..7afb7355eb 100644 --- a/libs/remix-ui/search/src/lib/context/context.tsx +++ b/libs/remix-ui/search/src/lib/context/context.tsx @@ -193,6 +193,7 @@ export const SearchProvider = ({ }, findText: async (path: string) => { + if (!plugin) return try { if (state.find.length < 1) return @@ -327,6 +328,10 @@ export const SearchProvider = ({ setFiles(await getDirectory('/', plugin)) }) + plugin.on('fs', 'workingDirChanged', async () => { + setFiles(await getDirectory('/', plugin)) + }) + plugin.on('fileManager', 'fileAdded', async file => { setFiles(await getDirectory('/', plugin)) await reloadStateForFile(file) diff --git a/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx b/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx index 78570be9b4..fab2ecef46 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx +++ b/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx @@ -13,6 +13,7 @@ import { configFileContent } from './compilerConfiguration' import axios, { AxiosResponse } from 'axios' import './css/style.css' +import isElectron from 'is-electron' const defaultPath = "compiler_config.json" declare global { @@ -560,7 +561,7 @@ export const CompilerContainer = (props: CompilerContainerProps) => { // "Uncaught RangeError: Maximum call stack size exceeded" error on Chromium, // resort to non-worker version in that case. if (selectedVersion === 'builtin') selectedVersion = state.defaultVersion - if (selectedVersion !== 'builtin' && canUseWorker(selectedVersion)) { + if (selectedVersion !== 'builtin' && (canUseWorker(selectedVersion) || isElectron())) { compileTabLogic.compiler.loadVersion(true, url) } else { compileTabLogic.compiler.loadVersion(false, url) diff --git a/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx b/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx index 6eae02296c..e856e5ef9a 100644 --- a/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx +++ b/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx @@ -9,6 +9,7 @@ import { Toaster } from '@remix-ui/toaster' // eslint-disable-line import { format } from 'util' import './css/style.css' import { CustomTooltip } from '@remix-ui/helper' +import isElectron from 'is-electron' const _paq = (window as any)._paq = (window as any)._paq || [] // eslint-disable-line @typescript-eslint/no-explicit-any @@ -550,7 +551,7 @@ export const SolidityUnitTesting = (props: Record) => { // eslint-d currentCompilerUrl, evmVersion, optimize, - usingWorker: canUseWorker(currentVersion), + usingWorker: canUseWorker(currentVersion) || isElectron(), runs } const deployCb = async (file: string, contractAddress: string) => { diff --git a/libs/remix-ui/workspace/src/lib/actions/events.ts b/libs/remix-ui/workspace/src/lib/actions/events.ts index 5c9b03141c..ba93240c1b 100644 --- a/libs/remix-ui/workspace/src/lib/actions/events.ts +++ b/libs/remix-ui/workspace/src/lib/actions/events.ts @@ -49,6 +49,7 @@ export const listenOnPluginEvents = (filePanelPlugin) => { }) plugin.on('fileManager', 'rootFolderChanged', async (path: string) => { + console.log('rootFolderChanged', path) rootFolderChanged(path) }) @@ -96,6 +97,10 @@ export const listenOnProviderEvents = (provider) => (reducerDispatch: React.Disp await switchToWorkspace(workspaceProvider.workspace) }) + provider.event.on('refresh', () => { + fetchWorkspaceDirectory('/') + }) + provider.event.on('connected', () => { plugin.fileManager.setMode('localhost') dispatch(setMode('localhost')) @@ -108,7 +113,7 @@ export const listenOnProviderEvents = (provider) => (reducerDispatch: React.Disp dispatch(loadLocalhostRequest()) }) - provider.event.on('fileExternallyChanged', (path: string, content: string) => { + provider.event.on('fileExternallyChanged', (path: string, content: string, showAlert: boolean = true) => { const config = plugin.registry.get('config').api const editor = plugin.registry.get('editor').api @@ -117,6 +122,7 @@ export const listenOnProviderEvents = (provider) => (reducerDispatch: React.Disp if (config.get('currentFile') === path) { // if it's the current file and the content is different: + if(showAlert){ dispatch(displayNotification( path + ' changed', 'This file has been changed outside of Remix IDE.', @@ -124,7 +130,9 @@ export const listenOnProviderEvents = (provider) => (reducerDispatch: React.Disp () => { editor.setText(path, content) } - )) + ))}else{ + editor.setText(path, content) + } } else { // this isn't the current file, we can silently update the model editor.setText(path, content) diff --git a/libs/remix-ui/workspace/src/lib/actions/index.ts b/libs/remix-ui/workspace/src/lib/actions/index.ts index e34b9db417..ea9f278bec 100644 --- a/libs/remix-ui/workspace/src/lib/actions/index.ts +++ b/libs/remix-ui/workspace/src/lib/actions/index.ts @@ -8,7 +8,7 @@ import { createWorkspaceTemplate, getWorkspaces, loadWorkspacePreset, setPlugin, import { QueryParams } from '@remix-project/remix-lib' import { fetchContractFromEtherscan } from '@remix-project/core-plugin' // eslint-disable-line import JSZip from 'jszip' -import isElectron from 'is-electron' +import isElectron from 'is-electron' export * from './events' export * from './workspace' @@ -23,6 +23,7 @@ export type UrlParametersType = { code: string, url: string, address: string + opendir: string, } const basicWorkspaceInit = async (workspaces: { name: string; isGitRepo: boolean; }[], workspaceProvider) => { @@ -50,9 +51,13 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React. setPlugin(plugin, dispatch) const workspaceProvider = filePanelPlugin.fileProviders.workspace const localhostProvider = filePanelPlugin.fileProviders.localhost + const electrOnProvider = filePanelPlugin.fileProviders.electron const params = queryParams.get() as UrlParametersType - const workspaces = await getWorkspaces() || [] - dispatch(setWorkspaces(workspaces)) + let workspaces = [] + if (!isElectron()) { + workspaces = await getWorkspaces() || [] + dispatch(setWorkspaces(workspaces)) + } if (params.gist) { await createWorkspaceTemplate('gist-sample', 'gist-template') plugin.setWorkspace({ name: 'gist-sample', isLocalhost: false }) @@ -74,11 +79,11 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React. let etherscanKey = await plugin.call('config', 'getAppParameter', 'etherscan-access-token') if (!etherscanKey) etherscanKey = '2HKUX5ZVASZIKWJM8MIQVCRUVZ6JAWT531' const networks = [ - {id: 1, name: 'mainnet'}, - {id: 3, name: 'ropsten'}, - {id: 4, name: 'rinkeby'}, - {id: 42, name: 'kovan'}, - {id: 5, name: 'goerli'} + { id: 1, name: 'mainnet' }, + { id: 3, name: 'ropsten' }, + { id: 4, name: 'rinkeby' }, + { id: 42, name: 'kovan' }, + { id: 5, name: 'goerli' } ] let found = false const workspaceName = 'etherscan-code-sample' @@ -107,15 +112,28 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React. await workspaceProvider.set(filePath, data.compilationTargets[filePath]['content']) } plugin.on('editor', 'editorMounted', async () => await plugin.fileManager.openFile(filePath)) - plugin.call('notification', 'toast', `Added ${count} verified contract${count === 1 ? '': 's'} from ${foundOnNetworks.join(',')} network${foundOnNetworks.length === 1 ? '': 's'} of Etherscan for contract address ${contractAddress} !!`) + plugin.call('notification', 'toast', `Added ${count} verified contract${count === 1 ? '' : 's'} from ${foundOnNetworks.join(',')} network${foundOnNetworks.length === 1 ? '' : 's'} of Etherscan for contract address ${contractAddress} !!`) } catch (error) { await basicWorkspaceInit(workspaces, workspaceProvider) } } else await basicWorkspaceInit(workspaces, workspaceProvider) } else if (isElectron()) { - plugin.call('notification', 'toast', `connecting to localhost...`) - await basicWorkspaceInit(workspaces, workspaceProvider) - await plugin.call('manager', 'activatePlugin', 'remixd') + if (params.opendir) { + params.opendir = decodeURIComponent(params.opendir) + plugin.call('notification', 'toast', `opening ${params.opendir}...`) + await plugin.call('fs', 'setWorkingDir', params.opendir) + } + plugin.setWorkspace({ name: 'electron', isLocalhost: false }) + + dispatch(setCurrentWorkspace({ name: 'electron', isGitRepo: false })) + electrOnProvider.init() + listenOnProviderEvents(electrOnProvider)(dispatch) + listenOnPluginEvents(plugin) + dispatch(setMode('browser')) + dispatch(fsInitializationCompleted()) + plugin.emit('workspaceInitializationCompleted') + return + } else if (localStorage.getItem("currentWorkspace")) { const index = workspaces.findIndex(element => element.name == localStorage.getItem("currentWorkspace")) if (index !== -1) { @@ -123,10 +141,10 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React. workspaceProvider.setWorkspace(name) plugin.setWorkspace({ name: name, isLocalhost: false }) dispatch(setCurrentWorkspace({ name: name, isGitRepo: false })) - }else{ + } else { _paq.push(['trackEvent', 'Storage', 'error', `Workspace in localstorage not found: ${localStorage.getItem("currentWorkspace")}`]) await basicWorkspaceInit(workspaces, workspaceProvider) - } + } } else { await basicWorkspaceInit(workspaces, workspaceProvider) } @@ -134,7 +152,13 @@ export const initWorkspace = (filePanelPlugin) => async (reducerDispatch: React. listenOnPluginEvents(plugin) listenOnProviderEvents(workspaceProvider)(dispatch) listenOnProviderEvents(localhostProvider)(dispatch) - dispatch(setMode('browser')) + listenOnProviderEvents(electrOnProvider)(dispatch) + if (isElectron()) { + dispatch(setMode('browser')) + } else { + dispatch(setMode('browser')) + } + plugin.setWorkspaces(await getWorkspaces()) dispatch(fsInitializationCompleted()) plugin.emit('workspaceInitializationCompleted') @@ -181,11 +205,11 @@ export const publishToGist = async (path?: string, type?: string) => { const accessToken = config.get('settings/gist-access-token') if (!accessToken) { - dispatch(displayNotification('Authorize Token', 'Remix requires an access token (which includes gists creation permission). Please go to the settings tab to create one.', 'Close', null, () => {})) + dispatch(displayNotification('Authorize Token', 'Remix requires an access token (which includes gists creation permission). Please go to the settings tab to create one.', 'Close', null, () => { })) } else { const params = queryParams.get() as SolidityConfiguration const description = 'Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. \n Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=' + - params.version + '&optimize=' + params.optimize + '&runs=' + params.runs + '&gist=' + params.version + '&optimize=' + params.optimize + '&runs=' + params.runs + '&gist=' const gists = new Gists({ token: accessToken }) if (id) { @@ -233,7 +257,7 @@ export const publishToGist = async (path?: string, type?: string) => { } } catch (error) { console.log(error) - dispatch(displayNotification('Publish to gist Failed', 'Failed to create gist: ' + error.message, 'Close', null, async () => {})) + dispatch(displayNotification('Publish to gist Failed', 'Failed to create gist: ' + error.message, 'Close', null, async () => { })) } } @@ -266,7 +290,7 @@ export const createNewFolder = async (path: string, rootDir: string) => { const exists = await fileManager.exists(dirName) if (exists) { - return dispatch(displayNotification('Failed to create folder', `A folder ${extractNameFromKey(path)} already exists at this location. Please choose a different name.`, 'Close', null, () => {})) + return dispatch(displayNotification('Failed to create folder', `A folder ${extractNameFromKey(path)} already exists at this location. Please choose a different name.`, 'Close', null, () => { })) } await fileManager.mkdir(dirName) path = path.indexOf(rootDir + '/') === 0 ? path.replace(rootDir + '/', '') : path @@ -292,7 +316,7 @@ export const renamePath = async (oldPath: string, newPath: string) => { const exists = await fileManager.exists(newPath) if (exists) { - dispatch(displayNotification('Rename File Failed', `A file or folder ${extractNameFromKey(newPath)} already exists at this location. Please choose a different name.`, 'Close', null, () => {})) + dispatch(displayNotification('Rename File Failed', `A file or folder ${extractNameFromKey(newPath)} already exists at this location. Please choose a different name.`, 'Close', null, () => { })) } else { await fileManager.rename(oldPath, newPath) } @@ -450,7 +474,7 @@ const handleGistResponse = (error, data) => { if (data.html_url) { dispatch(displayNotification('Gist is ready', `The gist is at ${data.html_url}. Would you like to open it in a new window?`, 'OK', 'Cancel', () => { window.open(data.html_url, '_blank') - }, () => {})) + }, () => { })) } else { const error = JSON.stringify(data.errors, null, '\t') || '' const message = data.message === 'Not Found' ? data.message + '. Please make sure the API token has right to create a gist.' : data.message diff --git a/libs/remix-ui/workspace/src/lib/actions/payload.ts b/libs/remix-ui/workspace/src/lib/actions/payload.ts index ea804ce2d1..b1d762bce1 100644 --- a/libs/remix-ui/workspace/src/lib/actions/payload.ts +++ b/libs/remix-ui/workspace/src/lib/actions/payload.ts @@ -292,3 +292,10 @@ export const setGitConfig = (config: {username: string, token: string, email: st payload: config } } + +export const setElectronRecentFolders = (folders: string[]) => { + return { + type: 'SET_ELECTRON_RECENT_FOLDERS', + payload: folders + } +} diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index a994416f3c..293c38d7e2 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -2,7 +2,7 @@ import React from 'react' import { bufferToHex } from '@ethereumjs/util' import { hash } from '@remix-project/remix-lib' import axios, { AxiosResponse } from 'axios' -import { addInputFieldSuccess, cloneRepositoryFailed, cloneRepositoryRequest, cloneRepositorySuccess, createWorkspaceError, createWorkspaceRequest, createWorkspaceSuccess, displayNotification, displayPopUp, fetchWorkspaceDirectoryError, fetchWorkspaceDirectoryRequest, fetchWorkspaceDirectorySuccess, hideNotification, setCurrentWorkspace, setCurrentWorkspaceBranches, setCurrentWorkspaceCurrentBranch, setDeleteWorkspace, setMode, setReadOnlyMode, setRenameWorkspace, setCurrentWorkspaceIsGitRepo, setGitConfig } from './payload' +import { addInputFieldSuccess, cloneRepositoryFailed, cloneRepositoryRequest, cloneRepositorySuccess, createWorkspaceError, createWorkspaceRequest, createWorkspaceSuccess, displayNotification, displayPopUp, fetchWorkspaceDirectoryError, fetchWorkspaceDirectoryRequest, fetchWorkspaceDirectorySuccess, hideNotification, setCurrentWorkspace, setCurrentWorkspaceBranches, setCurrentWorkspaceCurrentBranch, setDeleteWorkspace, setMode, setReadOnlyMode, setRenameWorkspace, setCurrentWorkspaceIsGitRepo, setGitConfig, setElectronRecentFolders } from './payload' import { addSlash, checkSlash, checkSpecialChars } from '@remix-ui/helper' import { JSONStandardInput, WorkspaceTemplate } from '../types' @@ -14,6 +14,7 @@ import { IndexedDBStorage } from '../../../../../../apps/remix-ide/src/app/files import { getUncommittedFiles } from '../utils/gitStatusFilter' import { AppModal, ModalTypes } from '@remix-ui/app' import { contractDeployerScripts, etherscanScripts } from '@remix-project/remix-ws-templates' +import isElectron from 'is-electron' declare global { interface Window { remixFileSystemCallback: IndexedDBStorage; } @@ -22,6 +23,7 @@ declare global { const LOCALHOST = ' - connect to localhost - ' const NO_WORKSPACE = ' - none - ' +const ELECTRON = 'electron' const queryParams = new QueryParams() const _paq = window._paq = window._paq || [] //eslint-disable-line let plugin, dispatch: React.Dispatch @@ -83,6 +85,15 @@ const removeSlash = (s: string) => { } export const createWorkspace = async (workspaceName: string, workspaceTemplateName: WorkspaceTemplate, opts = null, isEmpty = false, cb?: (err: Error, result?: string | number | boolean | Record) => void, isGitRepo: boolean = false, createCommit: boolean = true) => { + + if (isElectron()) { + if (workspaceTemplateName) { + await plugin.call('remix-templates', 'loadTemplateInNewWindow', workspaceTemplateName, opts) + } + return + } + + await plugin.fileManager.closeAllFiles() const promise = createWorkspaceTemplate(workspaceName, workspaceTemplateName) dispatch(createWorkspaceRequest(promise)) @@ -165,6 +176,7 @@ export type UrlParametersType = { export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDefault', opts?) => { const workspaceProvider = plugin.fileProviders.workspace + const electronProvider = plugin.fileProviders.electron const params = queryParams.get() as UrlParametersType switch (template) { @@ -242,7 +254,7 @@ export const loadWorkspacePreset = async (template: WorkspaceTemplate = 'remixDe if (!templateList.includes(template)) break _paq.push(['trackEvent', 'workspace', 'template', template]) // @ts-ignore - const files = await templateWithContent[template](opts) + const files = await templateWithContent[template](opts) for (const file in files) { try { await workspaceProvider.set(file, files[file]) @@ -267,12 +279,15 @@ export const workspaceExists = async (name: string) => { } export const fetchWorkspaceDirectory = async (path: string) => { + if (!path) return const provider = plugin.fileManager.currentFileProvider() - const promise = new Promise((resolve) => { + const promise = new Promise((resolve, reject) => { provider.resolveDirectory(path, (error, fileTree) => { - if (error) console.error(error) - + if (error) { + console.error(error) + return reject(error) + } resolve(fileTree) }) }) @@ -341,6 +356,12 @@ export const switchToWorkspace = async (name: string) => { // if there is no other workspace, create remix default workspace plugin.call('notification', 'toast', `No workspace found! Creating default workspace ....`) await createWorkspace('default_workspace', 'remixDefault') + } else if (name === ELECTRON) { + await plugin.fileProviders.workspace.setWorkspace(name) + await plugin.setWorkspace({ name, isLocalhost: false }) + dispatch(setMode('browser')) + dispatch(setCurrentWorkspace({ name, isGitRepo: false })) + } else { const isActive = await plugin.call('manager', 'isActive', 'remixd') @@ -406,8 +427,8 @@ export const uploadFile = async (target, targetFolder: string, cb?: (err: Error, okFn: () => { loadFile(name, file, workspaceProvider, cb) }, - cancelFn: () => {}, - hideFn: () => {} + cancelFn: () => { }, + hideFn: () => { } } plugin.call('notification', 'modal', modalContent) } @@ -415,7 +436,7 @@ export const uploadFile = async (target, targetFolder: string, cb?: (err: Error, } export const uploadFolder = async (target, targetFolder: string, cb?: (err: Error, result?: string | number | boolean | Record) => void) => { - for(const file of [...target.files]) { + for (const file of [...target.files]) { const workspaceProvider = plugin.fileProviders.workspace const name = targetFolder === '/' ? file.webkitRelativePath : `${targetFolder}/${file.webkitRelativePath}` if (!await workspaceProvider.exists(name)) { @@ -431,8 +452,8 @@ export const uploadFolder = async (target, targetFolder: string, cb?: (err: Erro okFn: () => { loadFile(name, file, workspaceProvider, cb) }, - cancelFn: () => {}, - hideFn: () => {} + cancelFn: () => { }, + hideFn: () => { } } plugin.call('notification', 'modal', modalContent) } @@ -484,46 +505,58 @@ export const cloneRepository = async (url: string) => { const token = config.get('settings/gist-access-token') const repoConfig = { url, token } - try { - const repoName = await getRepositoryTitle(url) - - await createWorkspace(repoName, 'blank', null, true, null, true, false) - const promise = plugin.call('dGitProvider', 'clone', repoConfig, repoName, true) - - dispatch(cloneRepositoryRequest()) - promise.then(async () => { - const isActive = await plugin.call('manager', 'isActive', 'dgit') - - if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') - await fetchWorkspaceDirectory(ROOT_PATH) - const workspacesPath = plugin.fileProviders.workspace.workspacesPath - const branches = await getGitRepoBranches(workspacesPath + '/' + repoName) - - dispatch(setCurrentWorkspaceBranches(branches)) - const currentBranch = await getGitRepoCurrentBranch(workspacesPath + '/' + repoName) - - dispatch(setCurrentWorkspaceCurrentBranch(currentBranch)) - dispatch(cloneRepositorySuccess()) - }).catch(() => { - const cloneModal = { + if (isElectron()) { + try { + await plugin.call('dGitProvider', 'clone', repoConfig) + } catch (e) { + console.log(e) + plugin.call('notification', 'alert', { id: 'cloneGitRepository', - title: 'Clone Git Repository', - message: 'An error occurred: Please check that you have the correct URL for the repo. If the repo is private, you need to add your github credentials (with the valid token permissions) in Settings plugin', - modalType: 'modal', - okLabel: 'OK', - okFn: async () => { - await deleteWorkspace(repoName) - dispatch(cloneRepositoryFailed()) - }, - hideFn: async () => { - await deleteWorkspace(repoName) - dispatch(cloneRepositoryFailed()) + message: e + }) + } + } else { + try { + const repoName = await getRepositoryTitle(url) + + await createWorkspace(repoName, 'blank', null, true, null, true, false) + const promise = plugin.call('dGitProvider', 'clone', repoConfig, repoName, true) + + dispatch(cloneRepositoryRequest()) + promise.then(async () => { + const isActive = await plugin.call('manager', 'isActive', 'dgit') + + if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') + await fetchWorkspaceDirectory(ROOT_PATH) + const workspacesPath = plugin.fileProviders.workspace.workspacesPath + const branches = await getGitRepoBranches(workspacesPath + '/' + repoName) + + dispatch(setCurrentWorkspaceBranches(branches)) + const currentBranch = await getGitRepoCurrentBranch(workspacesPath + '/' + repoName) + + dispatch(setCurrentWorkspaceCurrentBranch(currentBranch)) + dispatch(cloneRepositorySuccess()) + }).catch(() => { + const cloneModal = { + id: 'cloneGitRepository', + title: 'Clone Git Repository', + message: 'An error occurred: Please check that you have the correct URL for the repo. If the repo is private, you need to add your github credentials (with the valid token permissions) in Settings plugin', + modalType: 'modal', + okLabel: 'OK', + okFn: async () => { + await deleteWorkspace(repoName) + dispatch(cloneRepositoryFailed()) + }, + hideFn: async () => { + await deleteWorkspace(repoName) + dispatch(cloneRepositoryFailed()) + } } - } - plugin.call('notification', 'modal', cloneModal) - }) - } catch (e) { - dispatch(displayPopUp('An error occured: ' + e)) + plugin.call('notification', 'modal', cloneModal) + }) + } catch (e) { + dispatch(displayPopUp('An error occured: ' + e)) + } } } @@ -574,7 +607,6 @@ export const getGitRepoCurrentBranch = async (workspaceName: string) => { } export const showAllBranches = async () => { - console.log('showAllBranches') const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') plugin.call('menuicons', 'select', 'dgit') @@ -660,21 +692,21 @@ export const createNewBranch = async (branch: string) => { export const createSolidityGithubAction = async () => { const path = '.github/workflows/run-solidity-unittesting.yml' - await plugin.call('fileManager', 'writeFile', path , solTestYml) + await plugin.call('fileManager', 'writeFile', path, solTestYml) plugin.call('fileManager', 'open', path) } export const createTsSolGithubAction = async () => { const path = '.github/workflows/run-js-test.yml' - await plugin.call('fileManager', 'writeFile', path , tsSolTestYml) + await plugin.call('fileManager', 'writeFile', path, tsSolTestYml) plugin.call('fileManager', 'open', path) } export const createSlitherGithubAction = async () => { const path = '.github/workflows/run-slither-action.yml' - await plugin.call('fileManager', 'writeFile', path , slitherYml) + await plugin.call('fileManager', 'writeFile', path, slitherYml) plugin.call('fileManager', 'open', path) } @@ -738,6 +770,21 @@ export const checkoutRemoteBranch = async (branch: string, remote: string) => { } } +export const openElectronFolder = async (path: string) => { + await plugin.call('fs', 'openFolderInSameWindow', path) +} + +export const getElectronRecentFolders = async () => { + const folders = await plugin.call('fs', 'getRecentFolders') + dispatch(setElectronRecentFolders(folders)) + return folders +} + +export const removeRecentElectronFolder = async (path: string) => { + await plugin.call('fs', 'removeRecentFolder', path) + await getElectronRecentFolders() +} + export const hasLocalChanges = async () => { const filesStatus = await plugin.call('dGitProvider', 'status') const uncommittedFiles = getUncommittedFiles(filesStatus) diff --git a/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx b/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx new file mode 100644 index 0000000000..832caba679 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx @@ -0,0 +1,65 @@ +import React, { MouseEventHandler, useContext, useEffect, useState } from "react" +import { FileSystemContext } from "../contexts" +import isElectron from 'is-electron' +import { FormattedMessage } from "react-intl" +import '../css/electron-menu.css' +import { CustomTooltip } from '@remix-ui/helper' + +export const ElectronMenu = () => { + const global = useContext(FileSystemContext) + + useEffect(() => { + if (isElectron()) { + global.dispatchGetElectronRecentFolders() + } + }, []) + + const openFolderElectron = async (path: string) => { + global.dispatchOpenElectronFolder(path) + } + + const lastFolderName = (path: string) => { + const pathArray = path.split('/') + return pathArray[pathArray.length - 1] + } + + return ( + !isElectron() ? null : + (global.fs.browser.isSuccessfulWorkspace ? null : + <> +
{ await openFolderElectron(null) }} className='btn btn-primary'>
+ {global.fs.browser.recentFolders.length > 0 ? + <> + +
    + {global.fs.browser.recentFolders.map((folder, index) => { + return
  • + +
    + { await openFolderElectron(folder) }} className="pl-2 recentfolder_name pr-2">{lastFolderName(folder)} + { await openFolderElectron(folder) }} data-id={{ folder }} className="recentfolder_path pr-2">{folder} + { + global.dispatchRemoveRecentFolder(folder) + }} + className="fas fa-times recentfolder_delete pr-2" + > + + +
    +
    +
  • + })} +
+ + : null} + + ) + ) +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx b/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx index 146721b3b4..445778e2ad 100644 --- a/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx +++ b/libs/remix-ui/workspace/src/lib/components/file-explorer-context-menu.tsx @@ -5,6 +5,7 @@ import { action, FileExplorerContextMenuProps } from '../types' import '../css/file-explorer-context-menu.css' import { customAction } from '@remixproject/plugin-api' import UploadFile from './upload-file' +import isElectron from 'is-electron' declare global { interface Window { @@ -56,7 +57,8 @@ export const FileExplorerContextMenu = (props: FileExplorerContextMenuProps) => } const itemMatchesCondition = (item: action, itemType: string, itemPath: string) => { - if (item.type && Array.isArray(item.type) && (item.type.findIndex(name => name === itemType) !== -1)) return true + if( isElectron() && item.platform && item.platform === 'browser') return false + else if (item.type && Array.isArray(item.type) && (item.type.findIndex(name => name === itemType) !== -1)) return true else if (item.path && Array.isArray(item.path) && (item.path.findIndex(key => key === itemPath) !== -1)) return true else if (item.extension && Array.isArray(item.extension) && (item.extension.findIndex(ext => itemPath.endsWith(ext)) !== -1)) return true else if (item.pattern && Array.isArray(item.pattern) && (item.pattern.filter(value => itemPath.match(new RegExp(value))).length > 0)) return true diff --git a/libs/remix-ui/workspace/src/lib/contexts/index.ts b/libs/remix-ui/workspace/src/lib/contexts/index.ts index 3423323a90..a01c06383e 100644 --- a/libs/remix-ui/workspace/src/lib/contexts/index.ts +++ b/libs/remix-ui/workspace/src/lib/contexts/index.ts @@ -46,6 +46,9 @@ export const FileSystemContext = createContext<{ dispatchCreateTsSolGithubAction: () => Promise, dispatchCreateSlitherGithubAction: () => Promise dispatchCreateHelperScripts: (script: string) => Promise + dispatchOpenElectronFolder: (path: string) => Promise + dispatchGetElectronRecentFolders: () => Promise + dispatchRemoveRecentFolder: (path: string) => Promise }>(null) \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/css/electron-menu.css b/libs/remix-ui/workspace/src/lib/css/electron-menu.css new file mode 100644 index 0000000000..a5b0aff3f0 --- /dev/null +++ b/libs/remix-ui/workspace/src/lib/css/electron-menu.css @@ -0,0 +1,27 @@ +.recentfolder { + display: flex; + min-width: 0; + cursor: pointer; +} + +.recentfolder_path { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.recentfolder_name { + flex-shrink: 0; + color: var(--text); +} + +.recentfolder_name:hover { + color: var(--primary); + text-decoration: underline; +} + +.recentfolder_delete { + flex-shrink: 0; + margin-left: auto; + color: var(--text); +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx index 29399275e1..8a0969132d 100644 --- a/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx +++ b/libs/remix-ui/workspace/src/lib/providers/FileSystemProvider.tsx @@ -8,7 +8,7 @@ import { browserReducer, browserInitialState } from '../reducers/workspace' import { initWorkspace, fetchDirectory, removeInputField, deleteWorkspace, deleteAllWorkspaces, clearPopUp, publishToGist, createNewFile, setFocusElement, createNewFolder, deletePath, renamePath, downloadPath, copyFile, copyFolder, runScript, emitContextMenuEvent, handleClickFile, handleExpandPath, addInputField, createWorkspace, fetchWorkspaceDirectory, renameWorkspace, switchToWorkspace, uploadFile, uploadFolder, handleDownloadWorkspace, handleDownloadFiles, restoreBackupZip, cloneRepository, moveFile, moveFolder, - showAllBranches, switchBranch, createNewBranch, checkoutRemoteBranch, createSolidityGithubAction, createTsSolGithubAction, createSlitherGithubAction, createHelperScripts + showAllBranches, switchBranch, createNewBranch, checkoutRemoteBranch, createSolidityGithubAction, createTsSolGithubAction, createSlitherGithubAction, createHelperScripts, openElectronFolder, getElectronRecentFolders, removeRecentElectronFolder } from '../actions' import { Modal, WorkspaceProps, WorkspaceTemplate } from '../types' // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -187,6 +187,19 @@ export const FileSystemProvider = (props: WorkspaceProps) => { await createHelperScripts(script) } + const dispatchOpenElectronFolder = async (path: string) => { + await openElectronFolder(path) + } + + const dispatchGetElectronRecentFolders = async () => { + await getElectronRecentFolders() + } + + const dispatchRemoveRecentFolder = async (path: string) => { + await removeRecentElectronFolder(path) + } + + useEffect(() => { dispatchInitWorkspace() }, []) @@ -304,7 +317,10 @@ export const FileSystemProvider = (props: WorkspaceProps) => { dispatchCreateSolidityGithubAction, dispatchCreateTsSolGithubAction, dispatchCreateSlitherGithubAction, - dispatchCreateHelperScripts + dispatchCreateHelperScripts, + dispatchOpenElectronFolder, + dispatchGetElectronRecentFolders, + dispatchRemoveRecentFolder } return ( diff --git a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts index cceec06c7f..c51cc18f59 100644 --- a/libs/remix-ui/workspace/src/lib/reducers/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/reducers/workspace.ts @@ -34,6 +34,7 @@ export interface BrowserState { error: string }, fileState: fileDecoration[] + recentFolders: string[] }, localhost: { sharedFolder: string, @@ -86,7 +87,8 @@ export const browserInitialState: BrowserState = { removedMenuItems: [], error: null }, - fileState: [] + fileState: [], + recentFolders: [] }, localhost: { sharedFolder: '', @@ -720,14 +722,25 @@ export const browserReducer = (state = browserInitialState, action: Action) => { } } - case 'SET_GIT_CONFIG' : { + case 'SET_GIT_CONFIG': { const payload: { username: string, token: string, email: string } = action.payload return { ...state, gitConfig: payload } } - + + case 'SET_ELECTRON_RECENT_FOLDERS': { + const payload: string[] = action.payload + return { + ...state, + browser: { + ...state.browser, + recentFolders: payload + } + } + } + default: throw new Error() @@ -849,7 +862,6 @@ const fetchDirectoryContent = (state: BrowserState, payload: { fileTree, path: s const fetchWorkspaceDirectoryContent = (state: BrowserState, payload: { fileTree, path: string }): { [x: string]: Record } => { const files = normalize(payload.fileTree, ROOT_PATH) - return { [ROOT_PATH]: files } } diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index a64ddb8979..babd103494 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -12,14 +12,17 @@ import { MenuItems, WorkSpaceState } from './types' import { contextMenuActions } from './utils' import FileExplorerContextMenu from './components/file-explorer-context-menu' import { customAction } from '@remixproject/plugin-api' +import isElectron from 'is-electron' +import { ElectronMenu } from './components/electron-menu' const _paq = window._paq = window._paq || [] const canUpload = window.File || window.FileReader || window.FileList || window.Blob -export function Workspace () { +export function Workspace() { const LOCALHOST = ' - connect to localhost - ' const NO_WORKSPACE = ' - none - ' + const ELECTRON = 'electron' const [currentWorkspace, setCurrentWorkspace] = useState(NO_WORKSPACE) const [selectedWorkspace, setSelectedWorkspace] = useState<{ name: string, isGitRepo: boolean, branches?: { remote: any; name: string; }[], currentBranch?: string }>(null) const [showDropdown, setShowDropdown] = useState(false) @@ -101,6 +104,18 @@ export function Workspace () { } setCurrentWorkspace(workspaceName) resetFocus() + + // expose some UI to the plugin, perhaps not the best way to do it + if (global.plugin) { + global.plugin.loadTemplate = async () => { + await global.plugin.call('menuicons', 'select', 'filePanel') + createWorkspace() + } + global.plugin.clone = async () => { + await global.plugin.call('menuicons', 'select', 'filePanel') + cloneGitRepository() + } + } }, []) useEffect(() => { @@ -109,11 +124,10 @@ export function Workspace () { setCurrentWorkspace(global.fs.browser.currentWorkspace) global.dispatchFetchWorkspaceDirectory(ROOT_PATH) } - else - { + else { setCurrentWorkspace(NO_WORKSPACE) } - + } else if (global.fs.mode === 'localhost') { global.dispatchFetchWorkspaceDirectory(ROOT_PATH) setCurrentWorkspace(LOCALHOST) @@ -137,14 +151,14 @@ export function Workspace () { }, [currentWorkspace]) const renameCurrentWorkspace = () => { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.rename' }), renameModalMessage(), intl.formatMessage({ id: 'filePanel.ok' }), onFinishRenameWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.rename' }), renameModalMessage(), intl.formatMessage({ id: 'filePanel.ok' }), onFinishRenameWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) } const downloadCurrentWorkspace = () => { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.download' }), intl.formatMessage({ id: 'filePanel.workspace.downloadConfirm' }), intl.formatMessage({ id: 'filePanel.ok' }), onFinishDownloadWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.download' }), intl.formatMessage({ id: 'filePanel.workspace.downloadConfirm' }), intl.formatMessage({ id: 'filePanel.ok' }), onFinishDownloadWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) } const createWorkspace = () => { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.create' }), createModalMessage(), intl.formatMessage({ id: 'filePanel.ok' }), onFinishCreateWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.create' }), createModalMessage(), intl.formatMessage({ id: 'filePanel.ok' }), onFinishCreateWorkspace, intl.formatMessage({ id: 'filePanel.cancel' })) } const deleteCurrentWorkspace = () => { @@ -190,6 +204,7 @@ export function Workspace () { const cloneGitRepository = () => { + console.log('clone from workspace modal') global.modal( intl.formatMessage({ id: 'filePanel.workspace.clone' }), cloneModalMessage(), @@ -239,7 +254,7 @@ export function Workspace () { try { await global.dispatchRenameWorkspace(currentWorkspace, workspaceName) } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.rename' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.rename' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -248,7 +263,7 @@ export function Workspace () { try { await global.dispatchHandleDownloadWorkspace() } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.download' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.download' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -268,13 +283,13 @@ export function Workspace () { // @ts-ignore: Object is possibly 'null'. pausable: pausableCheckboxRef.current.checked, // @ts-ignore: Object is possibly 'null'. - upgradeable: transparentRadioRef.current.checked ? transparentRadioRef.current.value : ( uupsRadioRef.current.checked ? uupsRadioRef.current.value : false ) + upgradeable: transparentRadioRef.current.checked ? transparentRadioRef.current.value : (uupsRadioRef.current.checked ? uupsRadioRef.current.value : false) } try { await global.dispatchCreateWorkspace(workspaceName, workspaceTemplateName, opts, initGitRepo) } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.create' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.create' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -283,7 +298,7 @@ export function Workspace () { try { await global.dispatchDeleteWorkspace(global.fs.browser.currentWorkspace) } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.delete' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.delete' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -292,7 +307,7 @@ export function Workspace () { try { await global.dispatchDeleteAllWorkspaces() } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.deleteAll' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.deleteAll' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -306,7 +321,7 @@ export function Workspace () { await global.dispatchSwitchToWorkspace(name) global.dispatchHandleExpandPath([]) } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.workspace.switch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.workspace.switch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) console.error(e) } } @@ -344,7 +359,7 @@ export function Workspace () { intl.formatMessage({ id: 'filePanel.workspace.clone' }), intl.formatMessage({ id: 'filePanel.workspace.cloneMessage' }), intl.formatMessage({ id: 'filePanel.ok' }), - () => {}, + () => { }, intl.formatMessage({ id: 'filePanel.cancel' }) ) } @@ -370,7 +385,7 @@ export function Workspace () { try { global.dispatchDownloadPath(path) } catch (error) { - global.modal('Download Failed', 'Unexpected error while downloading: ' + typeof error === 'string' ? error : error.message, 'Close', async () => {}) + global.modal('Download Failed', 'Unexpected error while downloading: ' + typeof error === 'string' ? error : error.message, 'Close', async () => { }) } } @@ -378,7 +393,7 @@ export function Workspace () { try { global.dispatchCopyFile(src, dest) } catch (error) { - global.modal('Copy File Failed', 'Unexpected error while copying file: ' + src, 'Close', async () => {}) + global.modal('Copy File Failed', 'Unexpected error while copying file: ' + src, 'Close', async () => { }) } } @@ -386,7 +401,7 @@ export function Workspace () { try { global.dispatchCopyFolder(src, dest) } catch (error) { - global.modal('Copy Folder Failed', 'Unexpected error while copying folder: ' + src, 'Close', async () => {}) + global.modal('Copy Folder Failed', 'Unexpected error while copying folder: ' + src, 'Close', async () => { }) } } @@ -458,15 +473,15 @@ export function Workspace () { const pushChangesToGist = (path?: string, type?: string) => { - global.modal('Create a public gist', 'Are you sure you want to push changes to remote gist file on github.com?', 'OK', () => toGist(path, type), 'Cancel', () => {}) + global.modal('Create a public gist', 'Are you sure you want to push changes to remote gist file on github.com?', 'OK', () => toGist(path, type), 'Cancel', () => { }) } const publishFolderToGist = (path?: string, type?: string) => { - global.modal('Create a public gist', `Are you sure you want to anonymously publish all your files in the ${path} folder as a public gist on github.com?`, 'OK', () => toGist(path, type), 'Cancel', () => {}) + global.modal('Create a public gist', `Are you sure you want to anonymously publish all your files in the ${path} folder as a public gist on github.com?`, 'OK', () => toGist(path, type), 'Cancel', () => { }) } const publishFileToGist = (path?: string, type?: string) => { - global.modal('Create a public gist', `Are you sure you want to anonymously publish ${path} file as a public gist on github.com?`, 'OK', () => toGist(path, type), 'Cancel', () => {}) + global.modal('Create a public gist', `Are you sure you want to anonymously publish ${path} file as a public gist on github.com?`, 'OK', () => toGist(path, type), 'Cancel', () => { }) } const deleteMessage = (path: string[]) => { @@ -484,14 +499,13 @@ export function Workspace () { if (global.fs.readonly) return global.toast('cannot delete file. ' + name + ' is a read only explorer') if (!Array.isArray(path)) path = [path] - global.modal(`Delete ${path.length > 1 ? 'items' : 'item'}`, deleteMessage(path), 'OK', () => { global.dispatchDeletePath(path) }, 'Cancel', () => {}) + global.modal(`Delete ${path.length > 1 ? 'items' : 'item'}`, deleteMessage(path), 'OK', () => { global.dispatchDeletePath(path) }, 'Cancel', () => { }) } const toGist = (path?: string, type?: string) => { global.dispatchPublishToGist(path, type) } - const editModeOn = (path: string, type: string, isNew = false) => { if (global.fs.readonly) return global.toast('Cannot write/modify file system in read only mode.') setState(prevState => { @@ -547,7 +561,7 @@ export function Workspace () { } } catch (e) { console.error(e) - global.modal(intl.formatMessage({ id: 'filePanel.checkoutGitBranch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.checkoutGitBranch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) } } @@ -556,66 +570,66 @@ export function Workspace () { await global.dispatchCreateNewBranch(branchFilter) _paq.push(['trackEvent', 'Workspace', 'GIT', 'switch_to_new_branch']) } catch (e) { - global.modal(intl.formatMessage({ id: 'filePanel.checkoutGitBranch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => {}, intl.formatMessage({ id: 'filePanel.cancel' })) + global.modal(intl.formatMessage({ id: 'filePanel.checkoutGitBranch' }), e.message, intl.formatMessage({ id: 'filePanel.ok' }), () => { }, intl.formatMessage({ id: 'filePanel.cancel' })) } } const createModalMessage = () => { return ( <> - + -
- +
+
- - + +
- - + +
- - + +
- - + +
- - + +
- +
@@ -626,7 +640,7 @@ export function Workspace () { className="form-check-input custom-control-input" type="checkbox" disabled={!global.fs.gitConfig.username || !global.fs.gitConfig.email} - onChange={() => {}} + onChange={() => { }} />