yt-cli


Logs | Files | README | README | LICENSE | GitLab


1
commit d8897c28a6f4f0d979b0558353dd7f395123020a
2
Author: Connor Etherington <[email protected]>
3
Date:   Wed May 24 00:24:55 2023 +0200
4
5
    Auto-Commit Update - 20230524
6
---
7
 PKGBUILD                                 |   2 +-
8
 usr/lib/node_modules/yt-cli/.gitignore   |   6 +
9
 usr/lib/node_modules/yt-cli/bin/yt-cli   |  60 +++-
10
 usr/lib/node_modules/yt-cli/package.json |  24 +-
11
 usr/lib/node_modules/yt-cli/yarn.lock    | 488 +++++++++++++++++++++++++++++++
12
 5 files changed, 556 insertions(+), 24 deletions(-)
13
14
diff --git a/PKGBUILD b/PKGBUILD
15
index f2cf051..9a19e8b 100644
16
--- a/PKGBUILD
17
+++ b/PKGBUILD
18
@@ -1,7 +1,7 @@
19
 # Maintainer: Connor Etherington <[email protected]>
20
 # ---
21
 pkgname=yt-cli
22
-pkgver=0.1.2
23
+pkgver=0.2.0
24
 pkgrel=1
25
 pkgdesc="An easy to use CLI YouTube client"
26
 arch=('any')
27
diff --git a/usr/lib/node_modules/yt-cli/.gitignore b/usr/lib/node_modules/yt-cli/.gitignore
28
new file mode 100644
29
index 0000000..163aac5
30
--- /dev/null
31
+++ b/usr/lib/node_modules/yt-cli/.gitignore
32
@@ -0,0 +1,6 @@
33
+node_modules
34
+server/node_modules
35
+client/node_modules
36
+frontend/node_modules
37
+backend/node_modules
38
+
39
diff --git a/usr/lib/node_modules/yt-cli/bin/yt-cli b/usr/lib/node_modules/yt-cli/bin/yt-cli
40
index 4fcf640..1a322a8 100755
41
--- a/usr/lib/node_modules/yt-cli/bin/yt-cli
42
+++ b/usr/lib/node_modules/yt-cli/bin/yt-cli
43
@@ -4,6 +4,12 @@ const fs = require('fs');
44
 const beautifier = require('html-formatter');
45
 const axios = require('axios');
46
 const prompts = require('prompts');
47
+const ydl = require('youtube-dl-exec')
48
+const path = require('path');
49
+const os = require('os')
50
+const logger = require('progress-estimator')()
51
+
52
+require('colors');
53
 
54
 const beautify = async (data) => {
55
   const result = await beautifier.render(data);
56
@@ -43,36 +49,42 @@ const getData = async (searchTerm) => {
57
   return vidList;
58
 }
59
 
60
+const spin = async (func) => {
61
+  console.log();
62
+  const result = await logger(func(), " Downloading video...")
63
+  return result
64
+}
65
+
66
+const dV = async (url, path) => {
67
+  const result = await spin(() => ydl(url, { output: path }))
68
+  return result
69
+}
70
 
71
 const main = async (search) => {
72
 
73
   const response = search ? { searchTerm: search } : await prompts({
74
-    type: 'text',
75
-    name: 'searchTerm',
76
-    message: 'Search: '
77
+    type: 'text', name: 'searchTerm', message: 'Search: '
78
   });
79
 
80
   if(!response.searchTerm) process.exit(0);
81
 
82
   if(search) {
83
+
84
     if(search.match(/^-h\s*?/) || search.match(/\s*?-h\s*?/) ||
85
       search.match(/^--help\s*?/) || search.match(/\s*?--help\s*?/)) {
86
 
87
-      const sleep = function(ms) {
88
-        return new Promise(resolve => setTimeout(resolve, ms));
89
-      };
90
-
91
       const exe = async (cmd, cb) => await require('child_process').exec( cmd, async (e, so, se) => cb(so));
92
       const cl = (x) => console.log(x);
93
 
94
-      const c = `echo -e "\n  Usage: yt-cli [options] [search-term]\n\n    -a|--auto: auto play first result\n    -h|--help: display this message"`
95
-
96
+      const c = `echo -e "\n  Usage: yt-cli [options] [search-term]\n\n    -a | --auto     : auto select first result\n    -d | --download : download selected video to \${HOME}/yt-cli\n    -h | --help     : display this message"`
97
       await exe(c, cl);
98
-      await sleep(0.1);
99
 
100
-      process.exit(0);
101
+      var help = true;
102
+    } else {
103
+      var help = false;
104
+    }
105
 
106
-    } else if(search.match(/^-a\s*?/) || search.match(/\s*?-a\s*?/) ||
107
+    if(search.match(/^-a\s*?/) || search.match(/\s*?-a\s*?/) ||
108
       search.match(/^--auto\s*?/) || search.match(/\s*?--auto\s*?/)) {
109
 
110
       response.searchTerm = search.replace(/^-a\s?/, '')
111
@@ -83,8 +95,23 @@ const main = async (search) => {
112
     } else {
113
       var auto = false;
114
     }
115
+
116
+    if(search.match(/^-d\s*?/) || search.match(/\s*?-d\s*?/) ||
117
+      search.match(/^--download\s*?/) || search.match(/\s*?--download\s*?/)) {
118
+
119
+      response.searchTerm = search.replace(/^-d\s?/, '')
120
+        .replace(/\s?-d\s?$/, '') .replace(/\^--download\s?/, '')
121
+        .replace(/\s?--download\s?$/, '');
122
+
123
+      var download = true;
124
+    } else {
125
+      var download = false;
126
+    }
127
+
128
   } else {
129
+    var help = false;
130
     var auto = false;
131
+    var download = false;
132
   }
133
 
134
   const data = await getData(response.searchTerm);
135
@@ -102,8 +129,13 @@ const main = async (search) => {
136
 
137
   const selectedVideo = data[response2.video];
138
 
139
-  sh(`mpv ${selectedVideo.url}`);
140
-  process.exit(0);
141
+  if(help) process.exit(0);
142
+
143
+  if(download) {
144
+    if(!fs.existsSync(os.homedir() + '/yt-cli')) fs.mkdirSync(os.homedir() + '/yt-cli');
145
+    await dV(selectedVideo.url, os.homedir() + '/yt-cli/' + selectedVideo.title + '.mp4');
146
+    console.log(`\n[+] `.green + 'Video saved to \'' + (os.homedir() + '/yt-cli/' + selectedVideo.title + '.mp4\'').cyan);
147
+  } else sh(`mpv ${selectedVideo.url}`);
148
 
149
 };
150
 
151
diff --git a/usr/lib/node_modules/yt-cli/package.json b/usr/lib/node_modules/yt-cli/package.json
152
index 7a81477..82d8425 100644
153
--- a/usr/lib/node_modules/yt-cli/package.json
154
+++ b/usr/lib/node_modules/yt-cli/package.json
155
@@ -1,20 +1,26 @@
156
 {
157
   "name": "yt-cli",
158
-  "version": "0.1.0",
159
-  "description": "An easy to use CLI YouTube client",
160
-  "author": "Connor Etherington <[email protected]>",
161
-  "license": "MIT",
162
-  "main": "./bin/yt-cli",
163
+  "version": "0.2.0",
164
+  "main": "bin/yt-cli",
165
   "scripts": {
166
-    "start": "./bin/yt-cli"
167
+    "start": "node ${npm_package_main}",
168
+    "dev": "nodemon ${npm_package_main}"
169
   },
170
   "bin": {
171
-    "yt-cli": "./bin/yt-cli",
172
-    "ytcli": "./bin/yt-cli"
173
+    "yt-cli": "./${npm_package_main}"
174
   },
175
+  "author": "Connor Etherington <[email protected]>",
176
+  "license": "MIT",
177
   "dependencies": {
178
     "axios": "^1.4.0",
179
+    "child_process": "^1.0.2",
180
+    "colors": "^1.4.0",
181
+    "fs": "^0.0.1-security",
182
     "html-formatter": "^0.1.9",
183
-    "prompts": "^2.4.2"
184
+    "os": "^0.1.2",
185
+    "path": "^0.12.7",
186
+    "progress-estimator": "^0.3.1",
187
+    "prompts": "^2.4.2",
188
+    "youtube-dl-exec": "^2.4.2"
189
   }
190
 }
191
diff --git a/usr/lib/node_modules/yt-cli/yarn.lock b/usr/lib/node_modules/yt-cli/yarn.lock
192
new file mode 100644
193
index 0000000..f39ee7e
194
--- /dev/null
195
+++ b/usr/lib/node_modules/yt-cli/yarn.lock
196
@@ -0,0 +1,488 @@
197
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
198
+# yarn lockfile v1
199
+
200
+
201
+ansi-escapes@^3.0.0:
202
+  version "3.2.0"
203
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
204
+  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
205
+
206
+ansi-regex@^3.0.0:
207
+  version "3.0.1"
208
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
209
+  integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
210
+
211
+ansi-styles@^3.2.1:
212
+  version "3.2.1"
213
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
214
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
215
+  dependencies:
216
+    color-convert "^1.9.0"
217
+
218
+asynckit@^0.4.0:
219
+  version "0.4.0"
220
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
221
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
222
+
223
+axios@^1.4.0:
224
+  version "1.4.0"
225
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f"
226
+  integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
227
+  dependencies:
228
+    follow-redirects "^1.15.0"
229
+    form-data "^4.0.0"
230
+    proxy-from-env "^1.1.0"
231
+
232
+bin-version-check@~5.0.0:
233
+  version "5.0.0"
234
+  resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-5.0.0.tgz#958de30174d3fcedadbfc52f89f37bca62594877"
235
+  integrity sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==
236
+  dependencies:
237
+    bin-version "^6.0.0"
238
+    semver "^7.3.5"
239
+    semver-truncate "^2.0.0"
240
+
241
+bin-version@^6.0.0:
242
+  version "6.0.0"
243
+  resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-6.0.0.tgz#08ecbe5fc87898b441425e145f9e105064d00315"
244
+  integrity sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==
245
+  dependencies:
246
+    execa "^5.0.0"
247
+    find-versions "^5.0.0"
248
+
249
+chalk@^2.4.1:
250
+  version "2.4.2"
251
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
252
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
253
+  dependencies:
254
+    ansi-styles "^3.2.1"
255
+    escape-string-regexp "^1.0.5"
256
+    supports-color "^5.3.0"
257
+
258
+child_process@^1.0.2:
259
+  version "1.0.2"
260
+  resolved "https://registry.yarnpkg.com/child_process/-/child_process-1.0.2.tgz#b1f7e7fc73d25e7fd1d455adc94e143830182b5a"
261
+  integrity sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==
262
+
263
+cli-cursor@^2.0.0:
264
+  version "2.1.0"
265
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
266
+  integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==
267
+  dependencies:
268
+    restore-cursor "^2.0.0"
269
+
270
+cli-spinners@^1.3.1:
271
+  version "1.3.1"
272
+  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
273
+  integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==
274
+
275
+color-convert@^1.9.0:
276
+  version "1.9.3"
277
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
278
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
279
+  dependencies:
280
+    color-name "1.1.3"
281
+
282
+[email protected]:
283
+  version "1.1.3"
284
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
285
+  integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
286
+
287
+colors@^1.4.0:
288
+  version "1.4.0"
289
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
290
+  integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
291
+
292
+combined-stream@^1.0.8:
293
+  version "1.0.8"
294
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
295
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
296
+  dependencies:
297
+    delayed-stream "~1.0.0"
298
+
299
+cross-spawn@^7.0.3:
300
+  version "7.0.3"
301
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
302
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
303
+  dependencies:
304
+    path-key "^3.1.0"
305
+    shebang-command "^2.0.0"
306
+    which "^2.0.1"
307
+
308
+dargs@~7.0.0:
309
+  version "7.0.0"
310
+  resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc"
311
+  integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==
312
+
313
+decompress-response@^6.0.0:
314
+  version "6.0.0"
315
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
316
+  integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
317
+  dependencies:
318
+    mimic-response "^3.1.0"
319
+
320
+delayed-stream@~1.0.0:
321
+  version "1.0.0"
322
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
323
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
324
+
325
+escape-string-regexp@^1.0.5:
326
+  version "1.0.5"
327
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
328
+  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
329
+
330
+execa@^5.0.0, execa@~5.1.0:
331
+  version "5.1.1"
332
+  resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
333
+  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
334
+  dependencies:
335
+    cross-spawn "^7.0.3"
336
+    get-stream "^6.0.0"
337
+    human-signals "^2.1.0"
338
+    is-stream "^2.0.0"
339
+    merge-stream "^2.0.0"
340
+    npm-run-path "^4.0.1"
341
+    onetime "^5.1.2"
342
+    signal-exit "^3.0.3"
343
+    strip-final-newline "^2.0.0"
344
+
345
+find-versions@^5.0.0:
346
+  version "5.1.0"
347
+  resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-5.1.0.tgz#973f6739ce20f5e439a27eba8542a4b236c8e685"
348
+  integrity sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==
349
+  dependencies:
350
+    semver-regex "^4.0.5"
351
+
352
+follow-redirects@^1.15.0:
353
+  version "1.15.2"
354
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
355
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
356
+
357
+form-data@^4.0.0:
358
+  version "4.0.0"
359
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
360
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
361
+  dependencies:
362
+    asynckit "^0.4.0"
363
+    combined-stream "^1.0.8"
364
+    mime-types "^2.1.12"
365
+
366
+fs@^0.0.1-security:
367
+  version "0.0.1-security"
368
+  resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
369
+  integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==
370
+
371
+get-stream@^6.0.0:
372
+  version "6.0.1"
373
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
374
+  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
375
+
376
+has-flag@^3.0.0:
377
+  version "3.0.0"
378
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
379
+  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
380
+
381
+html-formatter@^0.1.9:
382
+  version "0.1.9"
383
+  resolved "https://registry.yarnpkg.com/html-formatter/-/html-formatter-0.1.9.tgz#58e8859712f3d4d9e7094027517c4c46f4c336b8"
384
+  integrity sha512-ao56oQHElDyKjnRara+Tw9iT6Ieuu6MRiBvCOCn2yhKtdT2Z9ViAyBal2j83bAf8sc6qAzGU0gkNVlFzkVAFHQ==
385
+
386
+human-signals@^2.1.0:
387
+  version "2.1.0"
388
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
389
+  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
390
+
391
+humanize-duration@^3.15.3:
392
+  version "3.28.0"
393
+  resolved "https://registry.yarnpkg.com/humanize-duration/-/humanize-duration-3.28.0.tgz#f79770c0bec34d3bfd4899338cc40643bc04df72"
394
+  integrity sha512-jMAxraOOmHuPbffLVDKkEKi/NeG8dMqP8lGRd6Tbf7JgAeG33jjgPWDbXXU7ypCI0o+oNKJFgbSB9FKVdWNI2A==
395
+
396
+[email protected]:
397
+  version "2.0.3"
398
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
399
+  integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
400
+
401
+is-fullwidth-code-point@^2.0.0:
402
+  version "2.0.0"
403
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
404
+  integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
405
+
406
+is-stream@^2.0.0:
407
+  version "2.0.1"
408
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
409
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
410
+
411
+is-unix@~2.0.1:
412
+  version "2.0.7"
413
+  resolved "https://registry.yarnpkg.com/is-unix/-/is-unix-2.0.7.tgz#77a5ad10df9fe3735a01a7934822fe47d23d11f7"
414
+  integrity sha512-5aio7Qef7QKjQxdb52cXAmim9Bh3+y3yc9IA2IsXWwZVlc1rRsJHWtBxNwGBu9KqW7PJCbhepNIkfFdilRkHpQ==
415
+
416
+isexe@^2.0.0:
417
+  version "2.0.0"
418
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
419
+  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
420
+
421
+kleur@^3.0.3:
422
+  version "3.0.3"
423
+  resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
424
+  integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
425
+
426
+log-update@^2.3.0:
427
+  version "2.3.0"
428
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
429
+  integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==
430
+  dependencies:
431
+    ansi-escapes "^3.0.0"
432
+    cli-cursor "^2.0.0"
433
+    wrap-ansi "^3.0.1"
434
+
435
+lru-cache@^6.0.0:
436
+  version "6.0.0"
437
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
438
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
439
+  dependencies:
440
+    yallist "^4.0.0"
441
+
442
+merge-stream@^2.0.0:
443
+  version "2.0.0"
444
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
445
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
446
+
447
+[email protected]:
448
+  version "1.52.0"
449
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
450
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
451
+
452
+mime-types@^2.1.12:
453
+  version "2.1.35"
454
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
455
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
456
+  dependencies:
457
+    mime-db "1.52.0"
458
+
459
+mimic-fn@^1.0.0:
460
+  version "1.2.0"
461
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
462
+  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
463
+
464
+mimic-fn@^2.1.0:
465
+  version "2.1.0"
466
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
467
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
468
+
469
+mimic-response@^3.1.0:
470
+  version "3.1.0"
471
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
472
+  integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
473
+
474
+npm-run-path@^4.0.1:
475
+  version "4.0.1"
476
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
477
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
478
+  dependencies:
479
+    path-key "^3.0.0"
480
+
481
+once@^1.3.1:
482
+  version "1.4.0"
483
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
484
+  integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
485
+  dependencies:
486
+    wrappy "1"
487
+
488
+onetime@^2.0.0:
489
+  version "2.0.1"
490
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
491
+  integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==
492
+  dependencies:
493
+    mimic-fn "^1.0.0"
494
+
495
+onetime@^5.1.2:
496
+  version "5.1.2"
497
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
498
+  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
499
+  dependencies:
500
+    mimic-fn "^2.1.0"
501
+
502
+os@^0.1.2:
503
+  version "0.1.2"
504
+  resolved "https://registry.yarnpkg.com/os/-/os-0.1.2.tgz#f29a50c62908516ba42652de42f7038600cadbc2"
505
+  integrity sha512-ZoXJkvAnljwvc56MbvhtKVWmSkzV712k42Is2mA0+0KTSRakq5XXuXpjZjgAt9ctzl51ojhQWakQQpmOvXWfjQ==
506
+
507
+path-key@^3.0.0, path-key@^3.1.0:
508
+  version "3.1.1"
509
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
510
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
511
+
512
+path@^0.12.7:
513
+  version "0.12.7"
514
+  resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
515
+  integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==
516
+  dependencies:
517
+    process "^0.11.1"
518
+    util "^0.10.3"
519
+
520
+process@^0.11.1:
521
+  version "0.11.10"
522
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
523
+  integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
524
+
525
+progress-estimator@^0.3.1:
526
+  version "0.3.1"
527
+  resolved "https://registry.yarnpkg.com/progress-estimator/-/progress-estimator-0.3.1.tgz#5a4c5bffa2cca09ac233c43bb6a644cbe6706920"
528
+  integrity sha512-I5bwE35adOrA2rfZ9iHHPESUp5C6cXrZd0J8LdFD9J+66ijSugBwZHooPCROf94Ox8YZaUyvTLViqSiRvBhSoA==
529
+  dependencies:
530
+    chalk "^2.4.1"
531
+    cli-spinners "^1.3.1"
532
+    humanize-duration "^3.15.3"
533
+    log-update "^2.3.0"
534
+
535
+prompts@^2.4.2:
536
+  version "2.4.2"
537
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
538
+  integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
539
+  dependencies:
540
+    kleur "^3.0.3"
541
+    sisteransi "^1.0.5"
542
+
543
+proxy-from-env@^1.1.0:
544
+  version "1.1.0"
545
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
546
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
547
+
548
+restore-cursor@^2.0.0:
549
+  version "2.0.0"
550
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
551
+  integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==
552
+  dependencies:
553
+    onetime "^2.0.0"
554
+    signal-exit "^3.0.2"
555
+
556
+semver-regex@^4.0.5:
557
+  version "4.0.5"
558
+  resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-4.0.5.tgz#fbfa36c7ba70461311f5debcb3928821eb4f9180"
559
+  integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==
560
+
561
+semver-truncate@^2.0.0:
562
+  version "2.0.0"
563
+  resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-2.0.0.tgz#cce4c0af36dbd97e898b821be870d17fbfb67f56"
564
+  integrity sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==
565
+  dependencies:
566
+    semver "^6.0.0"
567
+
568
+semver@^6.0.0:
569
+  version "6.3.0"
570
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
571
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
572
+
573
+semver@^7.3.5:
574
+  version "7.5.1"
575
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
576
+  integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
577
+  dependencies:
578
+    lru-cache "^6.0.0"
579
+
580
+shebang-command@^2.0.0:
581
+  version "2.0.0"
582
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
583
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
584
+  dependencies:
585
+    shebang-regex "^3.0.0"
586
+
587
+shebang-regex@^3.0.0:
588
+  version "3.0.0"
589
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
590
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
591
+
592
+signal-exit@^3.0.2, signal-exit@^3.0.3:
593
+  version "3.0.7"
594
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
595
+  integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
596
+
597
+simple-concat@^1.0.0:
598
+  version "1.0.1"
599
+  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
600
+  integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
601
+
602
+simple-get@~4.0.1:
603
+  version "4.0.1"
604
+  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
605
+  integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
606
+  dependencies:
607
+    decompress-response "^6.0.0"
608
+    once "^1.3.1"
609
+    simple-concat "^1.0.0"
610
+
611
+sisteransi@^1.0.5:
612
+  version "1.0.5"
613
+  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
614
+  integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
615
+
616
+string-width@^2.1.1:
617
+  version "2.1.1"
618
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
619
+  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
620
+  dependencies:
621
+    is-fullwidth-code-point "^2.0.0"
622
+    strip-ansi "^4.0.0"
623
+
624
+strip-ansi@^4.0.0:
625
+  version "4.0.0"
626
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
627
+  integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
628
+  dependencies:
629
+    ansi-regex "^3.0.0"
630
+
631
+strip-final-newline@^2.0.0:
632
+  version "2.0.0"
633
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
634
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
635
+
636
+supports-color@^5.3.0:
637
+  version "5.5.0"
638
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
639
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
640
+  dependencies:
641
+    has-flag "^3.0.0"
642
+
643
+util@^0.10.3:
644
+  version "0.10.4"
645
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
646
+  integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
647
+  dependencies:
648
+    inherits "2.0.3"
649
+
650
+which@^2.0.1:
651
+  version "2.0.2"
652
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
653
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
654
+  dependencies:
655
+    isexe "^2.0.0"
656
+
657
+wrap-ansi@^3.0.1:
658
+  version "3.0.1"
659
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"
660
+  integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==
661
+  dependencies:
662
+    string-width "^2.1.1"
663
+    strip-ansi "^4.0.0"
664
+
665
+wrappy@1:
666
+  version "1.0.2"
667
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
668
+  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
669
+
670
+yallist@^4.0.0:
671
+  version "4.0.0"
672
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
673
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
674
+
675
+youtube-dl-exec@^2.4.2:
676
+  version "2.4.2"
677
+  resolved "https://registry.yarnpkg.com/youtube-dl-exec/-/youtube-dl-exec-2.4.2.tgz#2e4f59bca8c49cb8e1f31d273f9598721d56d37f"
678
+  integrity sha512-0anzwaVtljlTxcHUMlyYkef9jTM52cehvIexORVs4gWgLJ5S4i0PlzGUpn2f/eo1/WWB7rNPztz/BXt0bBoC1A==
679
+  dependencies:
680
+    bin-version-check "~5.0.0"
681
+    dargs "~7.0.0"
682
+    execa "~5.1.0"
683
+    is-unix "~2.0.1"
684
+    simple-get "~4.0.1"