├── .gitignore
├── src
├── mask.png
├── index.js
└── fileicon.sh
├── package.json
├── LICENSE
├── .github
└── workflows
│ └── build.yml
├── README.md
└── pnpm-lock.yaml
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | yarn-error.log
4 | dist
--------------------------------------------------------------------------------
/src/mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rikumi/iconsur/HEAD/src/mask.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "iconsur",
3 | "version": "1.7.0",
4 | "main": "src/index.js",
5 | "license": "MIT",
6 | "scripts": {
7 | "build": "pkg . --targets node16-macos-x64 --output dist/iconsur --debug"
8 | },
9 | "bin": {
10 | "iconsur": "src/index.js"
11 | },
12 | "repository": {
13 | "url": "https://github.com/rikumi/iconsur"
14 | },
15 | "dependencies": {
16 | "commander": "^6.0.0",
17 | "cross-fetch": "^3.1.5",
18 | "glob": "^7.1.6",
19 | "icns-lib": "^1.0.1",
20 | "jimp": "^0.14.0",
21 | "plist": "^3.0.5"
22 | },
23 | "devDependencies": {
24 | "@types/node": "^14.0.27",
25 | "pkg": "^5.6.0"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Rikumi Yu
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build and upload new version
2 | on:
3 | push:
4 | branches: [main]
5 | jobs:
6 | build:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v2
10 | - uses: actions/setup-node@v1
11 | with:
12 | node-version: 10.x
13 | - run: npm install
14 | - run: npm run build
15 | - uses: pascalgn/npm-publish-action@1.3.8
16 | env:
17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18 | NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
19 | - uses: nyaascii/package-version@v1.0.3
20 | - uses: actions/create-release@v1.1.1
21 | id: create_release
22 | env:
23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24 | with:
25 | tag_name: ${{ env.PACKAGE_VERSION }}
26 | release_name: ${{ env.PACKAGE_VERSION }}
27 | draft: false
28 | prerelease: false
29 | - uses: actions/upload-release-asset@v1.0.2
30 | env:
31 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
32 | with:
33 | upload_url: ${{ steps.create_release.outputs.upload_url }}
34 | asset_path: dist/iconsur
35 | asset_name: iconsur
36 | asset_content_type: application/octet-stream
37 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # IconSur: macOS Big Sur Adaptive Icon Generator
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | `iconsur` is a command line tool to easily generate macOS Big Sur styled adaptive icons for third-party apps.
14 |
15 | The generation is based on the most related iOS app from the App Store, or, if there isn't one, is created from the original icon, in which case the background color and the scaling can be customized.
16 |
17 | 
18 |
19 | ## Installation
20 | Install it easily:
21 |
22 | ### Using homebrew
23 | ``` shell
24 | brew install iconsur
25 | ```
26 |
27 | ### Using npm
28 | ``` shell
29 | npm install -g iconsur
30 | ```
31 | ## Usage
32 |
33 | Download the `iconsur` binary for macOS x64 from [Releases](https://github.com/rikumi/iconsur/releases), `chmod +x` and include it in your PATH.
34 |
35 | Start generating your first adaptive app icon:
36 |
37 | ```sh
38 | sudo iconsur set /Applications/Microsoft\ Word.app/
39 |
40 | # Update the system icon cache and reload Finder & Dock
41 | sudo iconsur cache
42 |
43 | # Then the new icon will appear, and will last until the App is updated next time.
44 | ```
45 |
46 | This will search for the App Store and use the most related iOS app. For apps from the Mac App Store, `sudo` is required to set the alternative icon.
47 |
48 | By default, the name for the macOS app is used to search for a corresponding iOS app. You can change the keyword by specifying `-k`/`--keyword`.
49 |
50 | If your app only has a corresponding iOS app in non-America store, you may like to specify the 2-letter country code with option `-r`/`--region`.
51 |
52 | ```sh
53 | sudo iconsur set /Applications/QQMusic.app/ -r cn
54 | sudo iconsur cache
55 | ```
56 |
57 | For apps that do not have a corresponding iOS app, an irrelevant app can be found. In these cases, you may need to specify the `-l`/`--local` option to forcibly generate an icon locally:
58 |
59 | ```sh
60 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l
61 | sudo iconsur cache
62 | ```
63 |
64 | You can also use your own original icon with the `-i`/`--input` option. Here IconSur plays the part of adding the background, masking the icon into continuous corners, and adding correct paddings around the masked icon.
65 |
66 | ```sh
67 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l -i /path/to/your/icon
68 | sudo iconsur cache
69 | ```
70 |
71 | By default, the original app icon is scaled by 0.9 and is applied to a white background. You may like to change the scaling and background color of the icon. However, if the original icon is opaque, it will not get scaled down in case you specify an original opaque iOS icon from an app developer or a jailbreak icon pack.
72 |
73 | ```sh
74 | sudo iconsur set /Applications/Visual\ Studio\ Code.app/ -l -s 0.8 -c 87cdf0
75 | sudo iconsur cache
76 | ```
77 |
78 | To remove the icon previously set for a specific app, use the `unset` subcommand:
79 |
80 | ```sh
81 | sudo iconsur unset /Applications/Microsoft\ Word.app/
82 | sudo iconsur unset /Applications/Visual\ Studio\ Code.app/
83 | sudo iconsur cache
84 | ```
85 |
86 | ## Example
87 |
88 | See [my personal iconsur setup](https://gist.github.com/rikumi/e2ac39882a7dcd29642f29343da5a54a) as an example.
89 |
90 | ## Credits
91 |
92 | Thanks to [LiteIcon](https://freemacsoft.net/liteicon/) for the original inspiration, and [fileicon by mklement0](https://github.com/mklement0/fileicon) for the script for icon customization.
93 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | const fs = require('fs');
3 | const os = require('os');
4 | const path = require('path');
5 | const cp = require('child_process');
6 |
7 | const glob = require('glob');
8 | const jimp = require('jimp');
9 | const plist = require('plist');
10 | const icns = require('icns-lib');
11 | const { program } = require('commander');
12 | const { default: fetch } = require('cross-fetch');
13 |
14 | const jpeg = require('./openjpeg');
15 | const { version } = require('../package.json');
16 |
17 | jimp.decoders['image/jp2'] = (buffer) => {
18 | const { width, height, data } = jpeg(buffer, 'jp2');
19 |
20 | // Convert Planar RGB into Pixel RGB
21 | const rgbaBuffer = Buffer.alloc(data.length);
22 | for (let i = 0; i < data.length; i++) {
23 | rgbaBuffer[i] = data[(data.length / 4) * (i % 4) + Math.round(i / 4)] || 0;
24 | }
25 | return { width, height, data: rgbaBuffer };
26 | };
27 |
28 | const fileicon = path.join(os.tmpdir(), `fileicon-${Math.random().toFixed(16).substr(2, 6)}.sh`);
29 | const fileiconBinaryReady = new Promise(resolve => {
30 | fs.createReadStream(path.join(__dirname, 'fileicon.sh'))
31 | .pipe(fs.createWriteStream(fileicon), { end: true })
32 | .on('close', resolve);
33 | }).then(() => cp.spawnSync('chmod', ['+x', fileicon]));
34 |
35 | process.on('unhandledRejection', (e) => { throw e });
36 | process.on('uncaughtException', (e) => {
37 | console.error('Error:', e.message);
38 | process.exit(1);
39 | });
40 |
41 | program.name('iconsur');
42 | program.version(version);
43 | program.option('-l, --local', 'Directly create an icon locally without searching for an iOS App');
44 | program.option('-k, --keyword ', 'Specify custom keyword to search for an iOS App');
45 | program.option('-r, --region ', 'Specify country or region to search (default: us)');
46 | program.option('-s, --scale ', 'Specify scale for adaptive icon (default: 0.9)');
47 | program.option('-c, --color ', 'Specify color for adaptive icon (default: ffffff)');
48 | program.option('-i, --input ', 'Specify custom input image for adaptive icon');
49 | program.option('-o, --output ', 'Write the generated icon to a file without actually applying to App');
50 |
51 | program.command('set [otherDirs...]').action(async (dir, otherDirs) => {
52 | if (!otherDirs.length && ~dir.indexOf('*')) {
53 | [dir, ...otherDirs] = glob.sync(dir);
54 | }
55 |
56 | for (let appDir of [dir, ...otherDirs]) {
57 | console.log(`Processing ${appDir}...`);
58 |
59 | appDir = path.resolve(process.cwd(), appDir);
60 | if (!fs.statSync(appDir).isDirectory()) {
61 | console.error(`${appDir}: No such directory`);
62 | process.exit(1);
63 | }
64 |
65 | if (!appDir.endsWith('.app')) {
66 | console.error(`${appDir}: Not an App directory`);
67 | process.exit(1);
68 | }
69 |
70 | let appName = program.keyword;
71 | let srcIconFile = program.input;
72 | if (program.input) {
73 | program.local = true;
74 | }
75 |
76 | try {
77 | const infoPlist = path.join(appDir, 'Contents/Info.plist');
78 |
79 | // Convert potentially binary plist to xml format
80 | const convertedPlist = path.resolve(os.tmpdir(), `tmp-${Math.random().toFixed(16).substr(2, 6)}.plist`);
81 | cp.spawnSync('plutil', ['-convert', 'xml1', '-o', convertedPlist, '--', infoPlist]);
82 |
83 | const infoPlistContents = plist.parse(fs.readFileSync(convertedPlist, 'utf-8'));
84 | if (!appName) {
85 | appName = infoPlistContents['CFBundleDisplayName'] || path.basename(appDir).replace(/\.app$/, '');
86 | }
87 | if (!srcIconFile) {
88 | srcIconFile = path.resolve(appDir, 'Contents/Resources', infoPlistContents['CFBundleIconFile']);
89 | if (!/\.icns$/.test(srcIconFile)) {
90 | srcIconFile += '.icns';
91 | }
92 | }
93 | } catch (e) {
94 | console.log(`Plist file might be corrupted; using fallback name and AppIcon.icns as default icon location.`);
95 | console.log('Re-run with option -k or --keyword to specify custom app name to search for.');
96 | console.log('Re-run with option -i or --input to specify custom input image for an adaptive icon.');
97 |
98 | if (!appName) {
99 | appName = path.basename(appDir).replace(/\.app$/, '');
100 | }
101 | if (!srcIconFile) {
102 | srcIconFile = path.resolve(appDir, 'Contents/Resources/AppIcon.icns');
103 | }
104 | }
105 |
106 | const imageSize = 1024;
107 | const iconPadding = 100;
108 | const iconSize = imageSize - 2 * iconPadding;
109 | const mask = (await jimp.read(path.join(__dirname, 'mask.png'))).resize(imageSize, imageSize);
110 | const region = program.region || 'us';
111 | let resultIcon;
112 | let data = null;
113 |
114 | if (!program.local) {
115 | console.log(`Searching iOS App with name: ${appName}`);
116 | const res = await fetch(`https://itunes.apple.com/search?media=software&entity=software%2CiPadSoftware&term=${encodeURIComponent(appName)}&country=${region}&limit=1`);
117 | data = await res.json();
118 | }
119 |
120 | if (data && data.results && data.results.length) {
121 | const app = data.results[0];
122 | const appName = app.trackName;
123 | const iconUrl = app.artworkUrl512 || app.artworkUrl100;
124 | console.log(`Found iOS app: ${appName} with icon: ${iconUrl}`);
125 | console.log(`If this app is incorrect, specify the correct name with -k or --keyword, or generate an icon locally with option -l or --local`);
126 | const res = await fetch(iconUrl);
127 | const iconData = await res.buffer();
128 | resultIcon = (await jimp.read(iconData)).resize(iconSize, iconSize);
129 | } else {
130 | if (!program.local) {
131 | console.log(`Cannot find iOS App with name: ${appName}`);
132 | }
133 |
134 | console.log(`Generating adaptive icon...`);
135 | if (!fs.existsSync(srcIconFile)) {
136 | console.error(`Cannot find icon at ${srcIconFile}`);
137 | process.exit(1);
138 | }
139 |
140 | let iconBuffer = fs.readFileSync(srcIconFile);
141 |
142 | try {
143 | const subIconBuffer = Object.entries(icns.parse(iconBuffer))
144 | .filter(([k]) => icns.isImageType(k))
145 | .map(([, v]) => v)
146 | .sort((a, b) => b.length - a.length)[0];
147 |
148 | if (subIconBuffer) {
149 | iconBuffer = subIconBuffer;
150 | }
151 | } catch (e) { }
152 |
153 | let originalIcon;
154 | try {
155 | originalIcon = await jimp.read(iconBuffer);
156 | } catch (e) {
157 | console.error(`Failed to read original icon: ${e.message}`);
158 | console.error('Re-run with option -i or --input to use a custom image for generation.');
159 | process.exit(1);
160 | }
161 |
162 | let originalIconScaleSize;
163 | if (originalIcon.hasAlpha()) {
164 | originalIconScaleSize = parseFloat(program.scale || '0.9');
165 | originalIcon.contain(iconSize * originalIconScaleSize, iconSize * originalIconScaleSize);
166 | } else {
167 | console.log('The original icon image is opaque; thus it will not be scaled down.')
168 | originalIconScaleSize = 1;
169 | originalIcon.cover(iconSize, iconSize);
170 | }
171 |
172 | const scalePosition = iconSize * (1 - originalIconScaleSize) / 2;
173 | resultIcon = (await jimp.create(iconSize, iconSize)).composite(originalIcon, scalePosition, scalePosition);
174 | }
175 |
176 | const image = (await jimp.create(imageSize, imageSize, program.color || '#ffffff')).composite(resultIcon, iconPadding, iconPadding);
177 |
178 | // The masking algorithm that is both alpha- and color-friendly and full of magic
179 | image.scan(0, 0, imageSize, imageSize, (x, y) => {
180 | image.setPixelColor((mask.getPixelColor(x, y) & image.getPixelColor(x, y)) >>> 0, x, y);
181 | });
182 |
183 | if (program.output) {
184 | program.output = String(program.output).replace(/(\..*)?$/, '.png');
185 | await image.writeAsync(program.output);
186 | console.log(`Successfully saved icon for ${appDir} at ${program.output}\n`);
187 | } else {
188 | const tmpFile = path.resolve(os.tmpdir(), `tmp-${Math.random().toFixed(16).substr(2, 6)}.png`);
189 | await image.writeAsync(tmpFile);
190 |
191 | await fileiconBinaryReady;
192 | const { status } = cp.spawnSync(fileicon, ['set', appDir, tmpFile], { stdio: 'inherit' });
193 | if (status) {
194 | console.error(`Failed to set custom icon: fileicon script exited with error ${status}`);
195 | process.exit(1);
196 | }
197 | console.log(`Successfully set icon for ${appDir}\n`);
198 | }
199 | };
200 | });
201 |
202 | program.command('unset [otherDirs...]').action(async (dir, otherDirs) => {
203 | if (!otherDirs.length && ~dir.indexOf('*')) {
204 | [dir, ...otherDirs] = glob.sync(dir);
205 | }
206 |
207 | await fileiconBinaryReady;
208 | for (let appDir of [dir, ...otherDirs]) {
209 | const { status } = cp.spawnSync(fileicon, ['rm', appDir], { stdio: 'inherit' });
210 | if (status) {
211 | console.error(`Failed to remove custom icon: fileicon script exited with error ${status}`);
212 | process.exit(1);
213 | }
214 | }
215 | });
216 |
217 | program.command('cache').action(() => {
218 | try {
219 | cp.execSync('sudo rm -rf /Library/Caches/com.apple.iconservices.store', { stdio: 'ignore' });
220 | } catch (e) { }
221 |
222 | try {
223 | cp.execSync('sudo find /private/var/folders/ \\( -name com.apple.dock.iconcache -or -name com.apple.iconservices \\) -exec rm -rf {} \\;', { stdio: 'ignore' });
224 | } catch (e) { }
225 |
226 | try {
227 | cp.execSync('sleep 3; sudo touch /Applications/*', { stdio: 'ignore' });
228 | } catch (e) { }
229 |
230 | try {
231 | cp.execSync('killall Dock', { stdio: 'ignore' });
232 | } catch (e) { }
233 |
234 | try {
235 | cp.execSync('killall Finder', { stdio: 'ignore' });
236 | } catch (e) { }
237 |
238 | process.exit();
239 | });
240 |
241 | program.parse(process.argv);
242 |
--------------------------------------------------------------------------------
/src/fileicon.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ###
4 | # Home page: https://github.com/mklement0/fileicon
5 | # Author: Michael Klement (http://same2u.net)
6 | # Invoke with:
7 | # --version for version information
8 | # --help for usage information
9 | ###
10 |
11 | # --- STANDARD SCRIPT-GLOBAL CONSTANTS
12 |
13 | kTHIS_NAME=${BASH_SOURCE##*/}
14 | kTHIS_HOMEPAGE='https://github.com/mklement0/fileicon'
15 | kTHIS_VERSION='v0.3.0' # NOTE: This assignment is automatically updated by `make version VER=` - DO keep the 'v' prefix.
16 |
17 | unset CDPATH # To prevent unpredictable `cd` behavior.
18 |
19 | # --- Begin: STANDARD HELPER FUNCTIONS
20 |
21 | die() { echo "$kTHIS_NAME: ERROR: ${1:-"ABORTING due to unexpected error."}" 1>&2; exit ${2:-1}; }
22 | dieSyntax() { echo "$kTHIS_NAME: ARGUMENT ERROR: ${1:-"Invalid argument(s) specified."} Use -h for help." 1>&2; exit 2; }
23 |
24 | # SYNOPSIS
25 | # openUrl
26 | # DESCRIPTION
27 | # Opens the specified URL in the system's default browser.
28 | openUrl() {
29 | local url=$1 platform=$(uname) cmd=()
30 | case $platform in
31 | 'Darwin') # OSX
32 | cmd=( open "$url" )
33 | ;;
34 | 'CYGWIN_'*) # Cygwin on Windows; must call cmd.exe with its `start` builtin
35 | cmd=( cmd.exe /c start '' "$url " ) # !! Note the required trailing space.
36 | ;;
37 | 'MINGW32_'*) # MSYS or Git Bash on Windows; they come with a Unix `start` binary
38 | cmd=( start '' "$url" )
39 | ;;
40 | *) # Otherwise, assume a Freedesktop-compliant OS, which includes many Linux distros, PC-BSD, OpenSolaris, ...
41 | cmd=( xdg-open "$url" )
42 | ;;
43 | esac
44 | "${cmd[@]}" || { echo "Cannot locate or failed to open default browser; please go to '$url' manually." >&2; return 1; }
45 | }
46 |
47 | # Prints the embedded Markdown-formatted man-page source to stdout.
48 | printManPageSource() {
49 | /usr/bin/sed -n -e $'/^: <<\'EOF_MAN_PAGE\'/,/^EOF_MAN_PAGE/ { s///; t\np;}' "$BASH_SOURCE"
50 | }
51 |
52 | # Opens the man page, if installed; otherwise, tries to display the embedded Markdown-formatted man-page source; if all else fails: tries to display the man page online.
53 | openManPage() {
54 | local pager embeddedText
55 | if ! man 1 "$kTHIS_NAME" 2>/dev/null; then
56 | # 2nd attempt: if present, display the embedded Markdown-formatted man-page source
57 | embeddedText=$(printManPageSource)
58 | if [[ -n $embeddedText ]]; then
59 | pager='more'
60 | command -v less &>/dev/null && pager='less' # see if the non-standard `less` is available, because it's preferable to the POSIX utility `more`
61 | printf '%s\n' "$embeddedText" | "$pager"
62 | else # 3rd attempt: open the the man page on the utility's website
63 | openUrl "${kTHIS_HOMEPAGE}/doc/${kTHIS_NAME}.md"
64 | fi
65 | fi
66 | }
67 |
68 | # Prints the contents of the synopsis chapter of the embedded Markdown-formatted man-page source for quick reference.
69 | printUsage() {
70 | local embeddedText
71 | # Extract usage information from the SYNOPSIS chapter of the embedded Markdown-formatted man-page source.
72 | embeddedText=$(/usr/bin/sed -n -e $'/^: <<\'EOF_MAN_PAGE\'/,/^EOF_MAN_PAGE/!d; /^## SYNOPSIS$/,/^#/{ s///; t\np; }' "$BASH_SOURCE")
73 | if [[ -n $embeddedText ]]; then
74 | # Print extracted synopsis chapter - remove backticks for uncluttered display.
75 | printf '%s\n\n' "$embeddedText" | tr -d '`'
76 | else # No SYNOPIS chapter found; fall back to displaying the man page.
77 | echo "WARNING: usage information not found; opening man page instead." >&2
78 | openManPage
79 | fi
80 | }
81 |
82 | # --- End: STANDARD HELPER FUNCTIONS
83 |
84 | # --- PROCESS STANDARD, OUTPUT-INFO-THEN-EXIT OPTIONS.
85 | case $1 in
86 | --version)
87 | # Output version number and exit, if requested.
88 | ver="v0.3.0"; echo "$kTHIS_NAME $kTHIS_VERSION"$'\nFor license information and more, visit '"$kTHIS_HOMEPAGE"; exit 0
89 | ;;
90 | -h|--help)
91 | # Print usage information and exit.
92 | printUsage; exit
93 | ;;
94 | --man)
95 | # Display the manual page and exit.
96 | openManPage; exit
97 | ;;
98 | --man-source) # private option, used by `make update-doc`
99 | # Print raw, embedded Markdown-formatted man-page source and exit
100 | printManPageSource; exit
101 | ;;
102 | --home)
103 | # Open the home page and exit.
104 | openUrl "$kTHIS_HOMEPAGE"; exit
105 | ;;
106 | esac
107 |
108 | # --- Begin: SPECIFIC HELPER FUNCTIONS
109 |
110 | # NOTE: The functions below operate on byte strings such as the one above:
111 | # A single single string of pairs of hex digits, without separators or line breaks.
112 | # Thus, a given byte position is easily calculated: to get byte $byteIndex, use
113 | # ${byteString:byteIndex*2:2}
114 |
115 | # Outputs the specified EXTENDED ATTRIBUTE VALUE as a byte string (a hex dump that is a single-line string of pairs of hex digits, without separators or line breaks, such as "000A2C".
116 | # IMPORTANT: Hex. digits > 9 use UPPPERCASE characters.
117 | # getAttribByteString
118 | getAttribByteString() {
119 | xattr -px "$2" "$1" | tr -d ' \n'
120 | return ${PIPESTATUS[0]}
121 | }
122 |
123 | # Outputs the specified file's RESOURCE FORK as a byte string (a hex dump that is a single-line string of pairs of hex digits, without separators or line breaks, such as "000a2c".
124 | # IMPORTANT: Hex. digits > 9 use *lowercase* characters.
125 | # Note: This function relies on `xxd -p /..namedfork/rsrc | tr -d '\n'` rather than the conceptually equivalent call,
126 | # `getAttribByteString com.apple.ResourceFork`, for PERFORMANCE reasons:
127 | # getAttribByteString() (defined above) relies on `xattr`, which is a *Python* script [!! seemingly no longer, as of macOS 10.16]
128 | # and therefore quite slow due to Python's startup cost.
129 | # getResourceByteString
130 | getResourceByteString() {
131 | xxd -p "$1"/..namedfork/rsrc | tr -d '\n'
132 | }
133 |
134 | # Patches a single byte in the byte string provided via stdin.
135 | # patchByteInByteString ndx byteSpec
136 | # ndx is the 0-based byte index
137 | # - If has NO prefix: becomes the new byte
138 | # - If has prefix '|': "adds" the value: the result of a bitwise OR with the existing byte becomes the new byte
139 | # - If has prefix '~': "removes" the value: the result of a applying a bitwise AND with the bitwise complement of to the existing byte becomes the new byte
140 | patchByteInByteString() {
141 | local ndx=$1 byteSpec=$2 byteVal byteStr charPos op='' charsBefore='' charsAfter='' currByte
142 | byteStr=$( 0 && charPos < ${#byteStr} )) || return 1
161 | # Determine the target byte, and strings before and after the byte to patch.
162 | (( charPos >= 2 )) && charsBefore=${byteStr:0:charPos}
163 | charsAfter=${byteStr:charPos + 2}
164 | # Determine the new byte value
165 | if [[ -n $op ]]; then
166 | currByte=${byteStr:charPos:2}
167 | printf -v patchedByte '%02X' "$(( 0x${currByte} $op 0x${byteVal} ))"
168 | else
169 | patchedByte=$byteSpec
170 | fi
171 | printf '%s%s%s' "$charsBefore" "$patchedByte" "$charsAfter"
172 | }
173 |
174 | # hasAttrib
175 | hasAttrib() {
176 | xattr "$1" | /usr/bin/grep -Fqx "$2"
177 | }
178 |
179 | # hasIconsResource
180 | hasIconsResource() {
181 | local file=$1
182 | getResourceByteString "$file" | /usr/bin/grep -Fq "$kMAGICBYTES_ICNS_RESOURCE"
183 | }
184 |
185 |
186 | # setCustomIcon
187 | setCustomIcon() {
188 |
189 | local fileOrFolder=$1 imgFile=$2
190 |
191 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder && -w $fileOrFolder ]] || return 3
192 | [[ -f $imgFile ]] || return 3
193 |
194 | # !!
195 | # !! Sadly, Apple decided to remove the `-i` / `--addicon` option from the `sips` utility.
196 | # !! Therefore, use of *Cocoa* is required, which we do *via Python*, which has the added advantage
197 | # !! of creating a *set* of icons from the source image, scaling as necessary to create a
198 | # !! 512 x 512 top resolution icon (whereas sips -i created a single, 128 x 128 icon).
199 | # !! Thanks, https://apple.stackexchange.com/a/161984/28668
200 | # !!
201 | # !! Note: setIcon_forFile_options_() seemingly always indicates True, even with invalid image files, so
202 | # !! we attempt no error handling in the Python code.
203 |
204 | # macOS versions <= 12.2:
205 | # * Use the 2.x system python, which comes with the pyobjc packages preinstalled.
206 | if [[ -x /usr/bin/python && -z $__FILEICON_USEPY3 ]]; then
207 |
208 | /usr/bin/python - "$imgFile" "$fileOrFolder" <<'EOF' || return
209 | import sys, Cocoa
210 | Cocoa.NSWorkspace.sharedWorkspace().setIcon_forFile_options_(Cocoa.NSImage.alloc().initWithContentsOfFile_(sys.argv[1].decode('utf-8')), sys.argv[2].decode('utf-8'), 0)
211 | EOF
212 | # macOS versions >= 12.3, where the v2.x /usr/bin/python has been removed, or
213 | # if Python 3 is explicitly requested via a non-empty $__FILEICON_USEPY3 env. var:
214 | # * Use the first `python3` in the $PATH, which by default is the STUB at
215 | # /usr/bin/python3 that triggers a download-on-demand prompt as part of the
216 | # Xcode command-line tools.
217 | # For users that have a Homebrew 3.x Python installation, *it* will be used,
218 | # assuming its binary comes *first* in $PATH.
219 | else
220 |
221 | local done=0 retrying=0 output
222 | while (( ! done )); do
223 | # Note: The only difference to the v2.x Python code above is the removal of the .decode('utf-8')
224 | # calls, which are no longer necessary in v3.x.
225 | output="$(python3 - "$imgFile" "$fileOrFolder" 2>&1 <<'EOF'
226 | import sys, Cocoa
227 | Cocoa.NSWorkspace.sharedWorkspace().setIcon_forFile_options_(Cocoa.NSImage.alloc().initWithContentsOfFile_(sys.argv[1]), sys.argv[2], 0)
228 | EOF
229 | )"
230 | local ec=$? packageNames='pyobjc-core pyobjc-framework-Cocoa'
231 | done=1
232 | if (( ec )); then # The call failed.
233 | (( retrying )) && die "An unexpected error occured: $output" # Even on-demand pyobjc installation failed -> abort.
234 | # First, make sure that `python3` is actually Python, and not just the *stub* executable.
235 | python3 --version | /usr/bin/grep -q ' 3.' || die "The 'python3' binary in your path is not functional, presumably because it is the preinstalled stub at /usr/bin/python3 that triggers a prompt for on-demand installation. Perform this installation, or, if you have Homebrew installed, install Python 3 with \`brew install python@3\`"
236 | # Assume that the problem is the absence of the required pyobjc-* packages; attempt installation now.
237 | # Tips for debugging:
238 | # * To exercise this function, from the repo dir.:
239 | # touch /tmp/tf; ./bin/fileicon set /tmp/tf ./test/.fixtures/img.png
240 | # * To manage packages; prepend `sudo -H` to see machine-level packages
241 | # pip3 list -v # shows installed packages and their locations
242 | # pip3 uninstall -y pyobjc-core pyobjc-framework-Cocoa # uninstalls the required pyobjc-* packages
243 | # * To manage pip3's package *cache*
244 | # pip3 cache list # list cached packages
245 | # pip3 cache purge # clear cache
246 | # pip config set global.cache-dir false # disable cache globally
247 | # pip config unset global.cache-dir # re-enable globacl cache
248 | echo "Performing one-time user-level installation of required Python packages: $packageNames - this can take while..." >&2
249 | pip3 install -q --user $packageNames || die "On-demand installation of Python packages failed unexpectedly."
250 | done=0 retrying=1 # Retry
251 | fi
252 |
253 | done
254 |
255 | fi
256 |
257 | # Verify that a resource fork with icons was actually created.
258 | # For *files*, the resource fork is embedded in the file itself.
259 | # For *folders* a hidden file named $'Icon\r' is created *inside the folder*.
260 | [[ -d $fileOrFolder ]] && fileWithResourceFork=${fileOrFolder}/$kFILENAME_FOLDERCUSTOMICON || fileWithResourceFork=$fileOrFolder
261 | hasIconsResource "$fileWithResourceFork" || {
262 | cat >&2 <
274 | getCustomIcon() {
275 |
276 | local fileOrFolder=$1 icnsOutFile=$2 byteStr fileWithResourceFork byteOffset byteCount
277 |
278 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder ]] || return 3
279 |
280 | # Determine what file to extract the resource fork from.
281 | if [[ -d $fileOrFolder ]]; then
282 | fileWithResourceFork=${fileOrFolder}/$kFILENAME_FOLDERCUSTOMICON
283 | [[ -f $fileWithResourceFork ]] || { echo "Custom-icon file does not exist: '${fileWithResourceFork/$'\r'/\\r}'" >&2; return 1; }
284 | else
285 | fileWithResourceFork=$fileOrFolder
286 | fi
287 |
288 | # Determine (based on format description at https://en.wikipedia.org/wiki/Apple_Icon_Image_format):
289 | # - the byte offset at which the icns resource begins, via the magic literal identifying an icns resource
290 | # - the length of the resource, which is encoded in the 4 bytes right after the magic literal.
291 | read -r byteOffset byteCount < <(getResourceByteString "$fileWithResourceFork" | /usr/bin/awk -F "$kMAGICBYTES_ICNS_RESOURCE" '{ printf "%s %d", (length($1) + 2) / 2, "0x" substr($2, 0, 8) }')
292 | (( byteOffset > 0 && byteCount > 0 )) || { echo "Custom-icon file contains no icons resource: '${fileWithResourceFork/$'\r'/\\r}'" >&2; return 1; }
293 |
294 | # Extract the actual bytes using tail and head and save them to the output file.
295 | tail -c "+${byteOffset}" "$fileWithResourceFork/..namedfork/rsrc" | head -c $byteCount > "$icnsOutFile" || return
296 |
297 | return 0
298 | }
299 |
300 | # removeCustomIcon
301 | removeCustomIcon() {
302 |
303 | local fileOrFolder=$1 byteStr
304 |
305 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder && -w $fileOrFolder ]] || return 1
306 |
307 | # Step 1: Turn off the custom-icon flag in the com.apple.FinderInfo extended attribute.
308 | if hasAttrib "$fileOrFolder" com.apple.FinderInfo; then
309 | byteStr=$(getAttribByteString "$fileOrFolder" com.apple.FinderInfo | patchByteInByteString $kFI_BYTEOFFSET_CUSTOMICON '~'$kFI_VAL_CUSTOMICON) || return
310 | if [[ $byteStr == "$kFI_BYTES_BLANK" ]]; then # All bytes cleared? Remove the entire attribute.
311 | xattr -d com.apple.FinderInfo "$fileOrFolder"
312 | else # Update the attribute.
313 | xattr -wx com.apple.FinderInfo "$byteStr" "$fileOrFolder" || return
314 | fi
315 | fi
316 |
317 | # Step 2: Remove the resource fork (if target is a file) / hidden file with custom icon (if target is a folder)
318 | if [[ -d $fileOrFolder ]]; then
319 | rm -f "${fileOrFolder}/${kFILENAME_FOLDERCUSTOMICON}"
320 | else
321 | if hasIconsResource "$fileOrFolder"; then
322 | xattr -d com.apple.ResourceFork "$fileOrFolder"
323 | fi
324 | fi
325 |
326 | return 0
327 | }
328 |
329 | # testForCustomIcon
330 | testForCustomIcon() {
331 |
332 | local fileOrFolder=$1 byteStr byteVal fileWithResourceFork
333 |
334 | [[ (-f $fileOrFolder || -d $fileOrFolder) && -r $fileOrFolder ]] || return 3
335 |
336 | # Step 1: Check if the com.apple.FinderInfo extended attribute has the custom-icon
337 | # flag set.
338 | byteStr=$(getAttribByteString "$fileOrFolder" com.apple.FinderInfo 2>/dev/null) || return 1
339 |
340 | byteVal=${byteStr:2*kFI_BYTEOFFSET_CUSTOMICON:2}
341 |
342 | (( byteVal & kFI_VAL_CUSTOMICON )) || return 1
343 |
344 | # Step 2: Check if the resource fork of the relevant file contains an icns resource
345 | if [[ -d $fileOrFolder ]]; then
346 | fileWithResourceFork=${fileOrFolder}/${kFILENAME_FOLDERCUSTOMICON}
347 | else
348 | fileWithResourceFork=$fileOrFolder
349 | fi
350 |
351 | hasIconsResource "$fileWithResourceFork" || return 1
352 |
353 | return 0
354 | }
355 |
356 | # --- End: SPECIFIC HELPER FUNCTIONS
357 |
358 | # --- Begin: SPECIFIC SCRIPT-GLOBAL CONSTANTS
359 |
360 | kFILENAME_FOLDERCUSTOMICON=$'Icon\r'
361 |
362 | # The blank hex dump form (single string of pairs of hex digits) of the 32-byte data structure stored in extended attribute
363 | # com.apple.FinderInfo
364 | kFI_BYTES_BLANK='0000000000000000000000000000000000000000000000000000000000000000'
365 |
366 | # The hex dump form of the full 32 bytes that Finder assigns to the hidden $'Icon\r'
367 | # file whose com.apple.ResourceFork extended attribute contains the icon image data for the enclosing folder.
368 | # The first 8 bytes spell out the magic literal 'iconMACS'; they are followed by the invisibility flag, '40' in the 9th byte, and '10' (?? specifying what?)
369 | # in the 10th byte.
370 | # NOTE: Since file $'Icon\r' serves no other purpose than to store the icon, it is
371 | # safe to simply assign all 32 bytes blindly, without having to worry about
372 | # preserving existing values.
373 | kFI_BYTES_CUSTOMICONFILEFORFOLDER='69636F6E4D414353401000000000000000000000000000000000000000000000'
374 |
375 | # The hex dump form of the magic literal inside a resource fork that marks the
376 | # start of an icns (icons) resource.
377 | # NOTE: This will be used with `xxd -p .. | tr -d '\n'`, which uses *lowercase*
378 | # hex digits, so we must use lowercase here.
379 | kMAGICBYTES_ICNS_RESOURCE='69636e73'
380 |
381 | # The byte values (as hex strings) of the flags at the relevant byte position
382 | # of the com.apple.FinderInfo extended attribute.
383 | kFI_VAL_CUSTOMICON='04'
384 |
385 | # The custom-icon-flag byte offset in the com.apple.FinderInfo extended attribute.
386 | kFI_BYTEOFFSET_CUSTOMICON=8
387 |
388 | # --- End: SPECIFIC SCRIPT-GLOBAL CONSTANTS
389 |
390 | # Option defaults.
391 | force=0 quiet=0
392 |
393 | # --- Begin: OPTIONS PARSING
394 | allowOptsAfterOperands=1 operands=() i=0 optName= isLong=0 prefix= optArg= haveOptArgAttached=0 haveOptArgAsNextArg=0 acceptOptArg=0 needOptArg=0
395 | while (( $# )); do
396 | if [[ $1 =~ ^(-)[a-zA-Z0-9]+.*$ || $1 =~ ^(--)[a-zA-Z0-9]+.*$ ]]; then # an option: either a short option / multiple short options in compressed form or a long option
397 | prefix=${BASH_REMATCH[1]}; [[ $prefix == '--' ]] && isLong=1 || isLong=0
398 | for (( i = 1; i < (isLong ? 2 : ${#1}); i++ )); do
399 | acceptOptArg=0 needOptArg=0 haveOptArgAttached=0 haveOptArgAsNextArg=0 optArgAttached= optArgOpt= optArgReq=
400 | if (( isLong )); then # long option: parse into name and, if present, argument
401 | optName=${1:2}
402 | [[ $optName =~ ^([^=]+)=(.*)$ ]] && { optName=${BASH_REMATCH[1]}; optArgAttached=${BASH_REMATCH[2]}; haveOptArgAttached=1; }
403 | else # short option: *if* it takes an argument, the rest of the string, if any, is by definition the argument.
404 | optName=${1:i:1}; optArgAttached=${1:i+1}; (( ${#optArgAttached} >= 1 )) && haveOptArgAttached=1
405 | fi
406 | (( haveOptArgAttached )) && optArgOpt=$optArgAttached optArgReq=$optArgAttached || { (( $# > 1 )) && { optArgReq=$2; haveOptArgAsNextArg=1; }; }
407 | # ---- BEGIN: CUSTOMIZE HERE
408 | case $optName in
409 | f|force)
410 | force=1
411 | ;;
412 | q|quiet)
413 | quiet=1
414 | ;;
415 | *)
416 | dieSyntax "Unknown option: ${prefix}${optName}."
417 | ;;
418 | esac
419 | # ---- END: CUSTOMIZE HERE
420 | (( needOptArg )) && { (( ! haveOptArgAttached && ! haveOptArgAsNextArg )) && dieSyntax "Option ${prefix}${optName} is missing its argument." || (( haveOptArgAsNextArg )) && shift; }
421 | (( acceptOptArg || needOptArg )) && break
422 | done
423 | else # an operand
424 | if [[ $1 == '--' ]]; then
425 | shift; operands+=( "$@" ); break
426 | elif (( allowOptsAfterOperands )); then
427 | operands+=( "$1" ) # continue
428 | else
429 | operands=( "$@" )
430 | break
431 | fi
432 | fi
433 | shift
434 | done
435 | (( "${#operands[@]}" > 0 )) && set -- "${operands[@]}"; unset allowOptsAfterOperands operands i optName isLong prefix optArgAttached haveOptArgAttached haveOptArgAsNextArg acceptOptArg needOptArg
436 | # --- End: OPTIONS PARSING: "$@" now contains all operands (non-option arguments).
437 |
438 | # Validate the command
439 | cmd=$(printf %s "$1" | tr '[:upper:]' '[:lower:]') # translate to all-lowercase - we don't want the command name to be case-sensitive
440 | [[ $cmd == 'remove' ]] && cmd='rm' # support alias 'remove' for 'rm'
441 | case $cmd in
442 | set|get|rm|remove|test)
443 | shift
444 | ;;
445 | *)
446 | dieSyntax "Unrecognized or missing command: '$cmd'."
447 | ;;
448 | esac
449 |
450 | # Validate file operands
451 | (( $# > 0 )) || dieSyntax "Missing operand(s)."
452 |
453 | # Target file or folder.
454 | targetFileOrFolder=$1 imgFile= outFile=
455 | [[ -f $targetFileOrFolder || -d $targetFileOrFolder ]] || die "Target not found or neither file nor folder: '$targetFileOrFolder'"
456 | # Make sure the target file/folder is readable, and, unless only getting or testing for an icon are requested, writeable too.
457 | [[ -r $targetFileOrFolder ]] || die "Cannot access '$targetFileOrFolder': you do not have read permissions."
458 | [[ $cmd == 'test' || $cmd == 'get' || -w $targetFileOrFolder ]] || die "Cannot modify '$targetFileOrFolder': you do not have write permissions."
459 |
460 | # Other operands, if any, and their number.
461 | valid=0
462 | case $cmd in
463 | 'set')
464 | (( $# <= 2 )) && {
465 | valid=1
466 | # If no image file was specified, the target file is assumed to be an image file itself whose image should be self-assigned as an icon.
467 | (( $# == 2 )) && imgFile=$2 || imgFile=$1
468 | # !! Apparently, a regular file is required - a process subsitution such
469 | # !! as `<(base64 -D '
552 | # - All other headings should be level-2 headings in ALL-CAPS.
553 | # - TEXT
554 | # - Use NO indentation for regular chapter text; if you do, it will
555 | # be indented further than list items.
556 | # - Use 4-space indentation, as usual, for code blocks.
557 | # - Markup character-styling markup translates to ROFF rendering as follows:
558 | # `...` and **...** render as bolded (red) text
559 | # _..._ and *...* render as word-individually underlined text
560 | # - LISTS
561 | # - Indent list items by 2 spaces for better plain-text viewing, but note
562 | # that the ROFF generated by marked-man still renders them unindented.
563 | # - End every list item (bullet point) itself with 2 trailing spaces too so
564 | # that it renders on its own line.
565 | # - Avoid associating more than 1 paragraph with a list item, if possible,
566 | # because it requires the following trick, which hampers plain-text readability:
567 | # Use ' ' in lieu of an empty line.
568 | ####
569 | : <<'EOF_MAN_PAGE'
570 | # fileicon(1) - manage file and folder custom icons
571 |
572 | ## SYNOPSIS
573 |
574 | Manage custom icons for files and folders on macOS.
575 |
576 | SET a custom icon for a file or folder:
577 |
578 | fileicon set []
579 |
580 | REMOVE a custom icon from a file or folder:
581 |
582 | fileicon rm
583 |
584 | GET a file or folder's custom icon:
585 |
586 | fileicon get [-f] []
587 |
588 | -f ... force replacement of existing output file
589 |
590 | TEST if a file or folder has a custom icon:
591 |
592 | fileicon test
593 |
594 | All forms: option -q silences status output.
595 |
596 | Standard options: `--help`, `--man`, `--version`, `--home`
597 |
598 | ## DESCRIPTION
599 |
600 | `` is the file or folder whose custom icon should be managed.
601 | Note that symlinks are followed to their (ultimate target); that is, you
602 | can only assign custom icons to regular files and folders, not to symlinks
603 | to them.
604 |
605 | `` can be an image file of any format supported by the system.
606 | It is converted to an icon and assigned to ``.
607 | If you omit ``, `` must itself be an image file whose
608 | image should become its own icon.
609 |
610 | `` specifies the file to extract the custom icon to:
611 | Defaults to the filename of `` with extension `.icns` appended.
612 | If a value is specified, extension `.icns` is appended, unless already present.
613 | Either way, extraction fails if the target file already exists; use `-f` to
614 | override.
615 | Specify `-` to extract to stdout.
616 |
617 | Command `test` signals with its exit code whether a custom icon is set (0)
618 | or not (1); any other exit code signals an unexpected error.
619 |
620 | **Options**:
621 |
622 | * `-f`, `--force`
623 | When getting (extracting) a custom icon, forces replacement of the
624 | output file, if it already exists.
625 |
626 | * `-q`, `--quiet`
627 | Suppresses output of the status information that is by default output to
628 | stdout.
629 | Note that errors and warnings are still printed to stderr.
630 |
631 | ## NOTES
632 |
633 | Custom icons are stored in extended attributes of the HFS+ filesystem.
634 | Thus, if you copy files or folders to a different filesystem that doesn't
635 | support such attributes, custom icons are lost; for instance, custom icons
636 | cannot be stored in a Git repository.
637 |
638 | To determine if a give file or folder has extended attributes, use
639 | `ls -l@ `.
640 |
641 | When setting an image as a custom icon, a set of icons with several resolutions
642 | is created, with the highest resolution at 512 x 512 pixels.
643 |
644 | All icons created are square, so images with a non-square aspect ratio will
645 | appear distorted; for best results, use square imges.
646 |
647 | ## STANDARD OPTIONS
648 |
649 | All standard options provide information only.
650 |
651 | * `-h, --help`
652 | Prints the contents of the synopsis chapter to stdout for quick reference.
653 |
654 | * `--man`
655 | Displays this manual page, which is a helpful alternative to using `man`,
656 | if the manual page isn't installed.
657 |
658 | * `--version`
659 | Prints version information.
660 |
661 | * `--home`
662 | Opens this utility's home page in the system's default web browser.
663 |
664 | ## LICENSE
665 |
666 | For license information and more, visit the home page by running
667 | `fileicon --home`
668 |
669 | EOF_MAN_PAGE
670 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.3
2 |
3 | specifiers:
4 | '@types/node': ^14.0.27
5 | commander: ^6.0.0
6 | cross-fetch: ^3.1.5
7 | glob: ^7.1.6
8 | icns-lib: ^1.0.1
9 | jimp: ^0.14.0
10 | pkg: ^5.6.0
11 | plist: ^3.0.5
12 |
13 | dependencies:
14 | commander: 6.2.1
15 | cross-fetch: 3.1.5
16 | glob: 7.2.0
17 | icns-lib: 1.0.1
18 | jimp: 0.14.0
19 | plist: 3.0.5
20 |
21 | devDependencies:
22 | '@types/node': 14.18.12
23 | pkg: 5.6.0
24 |
25 | packages:
26 |
27 | /@babel/helper-validator-identifier/7.16.7:
28 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
29 | engines: {node: '>=6.9.0'}
30 | dev: true
31 |
32 | /@babel/parser/7.16.2:
33 | resolution: {integrity: sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==}
34 | engines: {node: '>=6.0.0'}
35 | hasBin: true
36 | dev: true
37 |
38 | /@babel/runtime/7.17.9:
39 | resolution: {integrity: sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==}
40 | engines: {node: '>=6.9.0'}
41 | dependencies:
42 | regenerator-runtime: 0.13.9
43 | dev: false
44 |
45 | /@babel/types/7.16.0:
46 | resolution: {integrity: sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==}
47 | engines: {node: '>=6.9.0'}
48 | dependencies:
49 | '@babel/helper-validator-identifier': 7.16.7
50 | to-fast-properties: 2.0.0
51 | dev: true
52 |
53 | /@jimp/bmp/0.14.0_@jimp+custom@0.14.0:
54 | resolution: {integrity: sha512-5RkX6tSS7K3K3xNEb2ygPuvyL9whjanhoaB/WmmXlJS6ub4DjTqrapu8j4qnIWmO4YYtFeTbDTXV6v9P1yMA5A==}
55 | peerDependencies:
56 | '@jimp/custom': '>=0.3.5'
57 | dependencies:
58 | '@babel/runtime': 7.17.9
59 | '@jimp/custom': 0.14.0
60 | '@jimp/utils': 0.14.0
61 | bmp-js: 0.1.0
62 | dev: false
63 |
64 | /@jimp/core/0.14.0:
65 | resolution: {integrity: sha512-S62FcKdtLtj3yWsGfJRdFXSutjvHg7aQNiFogMbwq19RP4XJWqS2nOphu7ScB8KrSlyy5nPF2hkWNhLRLyD82w==}
66 | dependencies:
67 | '@babel/runtime': 7.17.9
68 | '@jimp/utils': 0.14.0
69 | any-base: 1.1.0
70 | buffer: 5.7.1
71 | exif-parser: 0.1.12
72 | file-type: 9.0.0
73 | load-bmfont: 1.4.1
74 | mkdirp: 0.5.6
75 | phin: 2.9.3
76 | pixelmatch: 4.0.2
77 | tinycolor2: 1.4.2
78 | dev: false
79 |
80 | /@jimp/custom/0.14.0:
81 | resolution: {integrity: sha512-kQJMeH87+kWJdVw8F9GQhtsageqqxrvzg7yyOw3Tx/s7v5RToe8RnKyMM+kVtBJtNAG+Xyv/z01uYQ2jiZ3GwA==}
82 | dependencies:
83 | '@babel/runtime': 7.17.9
84 | '@jimp/core': 0.14.0
85 | dev: false
86 |
87 | /@jimp/gif/0.14.0_@jimp+custom@0.14.0:
88 | resolution: {integrity: sha512-DHjoOSfCaCz72+oGGEh8qH0zE6pUBaBxPxxmpYJjkNyDZP7RkbBkZJScIYeQ7BmJxmGN4/dZn+MxamoQlr+UYg==}
89 | peerDependencies:
90 | '@jimp/custom': '>=0.3.5'
91 | dependencies:
92 | '@babel/runtime': 7.17.9
93 | '@jimp/custom': 0.14.0
94 | '@jimp/utils': 0.14.0
95 | gifwrap: 0.9.4
96 | omggif: 1.0.10
97 | dev: false
98 |
99 | /@jimp/jpeg/0.14.0_@jimp+custom@0.14.0:
100 | resolution: {integrity: sha512-561neGbr+87S/YVQYnZSTyjWTHBm9F6F1obYHiyU3wVmF+1CLbxY3FQzt4YolwyQHIBv36Bo0PY2KkkU8BEeeQ==}
101 | peerDependencies:
102 | '@jimp/custom': '>=0.3.5'
103 | dependencies:
104 | '@babel/runtime': 7.17.9
105 | '@jimp/custom': 0.14.0
106 | '@jimp/utils': 0.14.0
107 | jpeg-js: 0.4.3
108 | dev: false
109 |
110 | /@jimp/plugin-blit/0.14.0_@jimp+custom@0.14.0:
111 | resolution: {integrity: sha512-YoYOrnVHeX3InfgbJawAU601iTZMwEBZkyqcP1V/S33Qnz9uzH1Uj1NtC6fNgWzvX6I4XbCWwtr4RrGFb5CFrw==}
112 | peerDependencies:
113 | '@jimp/custom': '>=0.3.5'
114 | dependencies:
115 | '@babel/runtime': 7.17.9
116 | '@jimp/custom': 0.14.0
117 | '@jimp/utils': 0.14.0
118 | dev: false
119 |
120 | /@jimp/plugin-blur/0.14.0_@jimp+custom@0.14.0:
121 | resolution: {integrity: sha512-9WhZcofLrT0hgI7t0chf7iBQZib//0gJh9WcQMUt5+Q1Bk04dWs8vTgLNj61GBqZXgHSPzE4OpCrrLDBG8zlhQ==}
122 | peerDependencies:
123 | '@jimp/custom': '>=0.3.5'
124 | dependencies:
125 | '@babel/runtime': 7.17.9
126 | '@jimp/custom': 0.14.0
127 | '@jimp/utils': 0.14.0
128 | dev: false
129 |
130 | /@jimp/plugin-circle/0.14.0_@jimp+custom@0.14.0:
131 | resolution: {integrity: sha512-o5L+wf6QA44tvTum5HeLyLSc5eVfIUd5ZDVi5iRfO4o6GT/zux9AxuTSkKwnjhsG8bn1dDmywAOQGAx7BjrQVA==}
132 | peerDependencies:
133 | '@jimp/custom': '>=0.3.5'
134 | dependencies:
135 | '@babel/runtime': 7.17.9
136 | '@jimp/custom': 0.14.0
137 | '@jimp/utils': 0.14.0
138 | dev: false
139 |
140 | /@jimp/plugin-color/0.14.0_@jimp+custom@0.14.0:
141 | resolution: {integrity: sha512-JJz512SAILYV0M5LzBb9sbOm/XEj2fGElMiHAxb7aLI6jx+n0agxtHpfpV/AePTLm1vzzDxx6AJxXbKv355hBQ==}
142 | peerDependencies:
143 | '@jimp/custom': '>=0.3.5'
144 | dependencies:
145 | '@babel/runtime': 7.17.9
146 | '@jimp/custom': 0.14.0
147 | '@jimp/utils': 0.14.0
148 | tinycolor2: 1.4.2
149 | dev: false
150 |
151 | /@jimp/plugin-contain/0.14.0_04f2eb7c5fcee3779cc9de0411145f1d:
152 | resolution: {integrity: sha512-RX2q233lGyaxiMY6kAgnm9ScmEkNSof0hdlaJAVDS1OgXphGAYAeSIAwzESZN4x3ORaWvkFefeVH9O9/698Evg==}
153 | peerDependencies:
154 | '@jimp/custom': '>=0.3.5'
155 | '@jimp/plugin-blit': '>=0.3.5'
156 | '@jimp/plugin-resize': '>=0.3.5'
157 | '@jimp/plugin-scale': '>=0.3.5'
158 | dependencies:
159 | '@babel/runtime': 7.17.9
160 | '@jimp/custom': 0.14.0
161 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0
162 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
163 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190
164 | '@jimp/utils': 0.14.0
165 | dev: false
166 |
167 | /@jimp/plugin-cover/0.14.0_132cab346e98a8a22cf9ce3f0298c53c:
168 | resolution: {integrity: sha512-0P/5XhzWES4uMdvbi3beUgfvhn4YuQ/ny8ijs5kkYIw6K8mHcl820HahuGpwWMx56DJLHRl1hFhJwo9CeTRJtQ==}
169 | peerDependencies:
170 | '@jimp/custom': '>=0.3.5'
171 | '@jimp/plugin-crop': '>=0.3.5'
172 | '@jimp/plugin-resize': '>=0.3.5'
173 | '@jimp/plugin-scale': '>=0.3.5'
174 | dependencies:
175 | '@babel/runtime': 7.17.9
176 | '@jimp/custom': 0.14.0
177 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0
178 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
179 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190
180 | '@jimp/utils': 0.14.0
181 | dev: false
182 |
183 | /@jimp/plugin-crop/0.14.0_@jimp+custom@0.14.0:
184 | resolution: {integrity: sha512-Ojtih+XIe6/XSGtpWtbAXBozhCdsDMmy+THUJAGu2x7ZgKrMS0JotN+vN2YC3nwDpYkM+yOJImQeptSfZb2Sug==}
185 | peerDependencies:
186 | '@jimp/custom': '>=0.3.5'
187 | dependencies:
188 | '@babel/runtime': 7.17.9
189 | '@jimp/custom': 0.14.0
190 | '@jimp/utils': 0.14.0
191 | dev: false
192 |
193 | /@jimp/plugin-displace/0.14.0_@jimp+custom@0.14.0:
194 | resolution: {integrity: sha512-c75uQUzMgrHa8vegkgUvgRL/PRvD7paFbFJvzW0Ugs8Wl+CDMGIPYQ3j7IVaQkIS+cAxv+NJ3TIRBQyBrfVEOg==}
195 | peerDependencies:
196 | '@jimp/custom': '>=0.3.5'
197 | dependencies:
198 | '@babel/runtime': 7.17.9
199 | '@jimp/custom': 0.14.0
200 | '@jimp/utils': 0.14.0
201 | dev: false
202 |
203 | /@jimp/plugin-dither/0.14.0_@jimp+custom@0.14.0:
204 | resolution: {integrity: sha512-g8SJqFLyYexXQQsoh4dc1VP87TwyOgeTElBcxSXX2LaaMZezypmxQfLTzOFzZoK8m39NuaoH21Ou1Ftsq7LzVQ==}
205 | peerDependencies:
206 | '@jimp/custom': '>=0.3.5'
207 | dependencies:
208 | '@babel/runtime': 7.17.9
209 | '@jimp/custom': 0.14.0
210 | '@jimp/utils': 0.14.0
211 | dev: false
212 |
213 | /@jimp/plugin-fisheye/0.14.0_@jimp+custom@0.14.0:
214 | resolution: {integrity: sha512-BFfUZ64EikCaABhCA6mR3bsltWhPpS321jpeIQfJyrILdpFsZ/OccNwCgpW1XlbldDHIoNtXTDGn3E+vCE7vDg==}
215 | peerDependencies:
216 | '@jimp/custom': '>=0.3.5'
217 | dependencies:
218 | '@babel/runtime': 7.17.9
219 | '@jimp/custom': 0.14.0
220 | '@jimp/utils': 0.14.0
221 | dev: false
222 |
223 | /@jimp/plugin-flip/0.14.0_21b3d863db80a865c28da82979224ca7:
224 | resolution: {integrity: sha512-WtL1hj6ryqHhApih+9qZQYA6Ye8a4HAmdTzLbYdTMrrrSUgIzFdiZsD0WeDHpgS/+QMsWwF+NFmTZmxNWqKfXw==}
225 | peerDependencies:
226 | '@jimp/custom': '>=0.3.5'
227 | '@jimp/plugin-rotate': '>=0.3.5'
228 | dependencies:
229 | '@babel/runtime': 7.17.9
230 | '@jimp/custom': 0.14.0
231 | '@jimp/plugin-rotate': 0.14.0_6a26553348442491f47014d5048cf1c5
232 | '@jimp/utils': 0.14.0
233 | dev: false
234 |
235 | /@jimp/plugin-gaussian/0.14.0_@jimp+custom@0.14.0:
236 | resolution: {integrity: sha512-uaLwQ0XAQoydDlF9tlfc7iD9drYPriFe+jgYnWm8fbw5cN+eOIcnneEX9XCOOzwgLPkNCxGox6Kxjn8zY6GxtQ==}
237 | peerDependencies:
238 | '@jimp/custom': '>=0.3.5'
239 | dependencies:
240 | '@babel/runtime': 7.17.9
241 | '@jimp/custom': 0.14.0
242 | '@jimp/utils': 0.14.0
243 | dev: false
244 |
245 | /@jimp/plugin-invert/0.14.0_@jimp+custom@0.14.0:
246 | resolution: {integrity: sha512-UaQW9X9vx8orQXYSjT5VcITkJPwDaHwrBbxxPoDG+F/Zgv4oV9fP+udDD6qmkgI9taU+44Fy+zm/J/gGcMWrdg==}
247 | peerDependencies:
248 | '@jimp/custom': '>=0.3.5'
249 | dependencies:
250 | '@babel/runtime': 7.17.9
251 | '@jimp/custom': 0.14.0
252 | '@jimp/utils': 0.14.0
253 | dev: false
254 |
255 | /@jimp/plugin-mask/0.14.0_@jimp+custom@0.14.0:
256 | resolution: {integrity: sha512-tdiGM69OBaKtSPfYSQeflzFhEpoRZ+BvKfDEoivyTjauynbjpRiwB1CaiS8En1INTDwzLXTT0Be9SpI3LkJoEA==}
257 | peerDependencies:
258 | '@jimp/custom': '>=0.3.5'
259 | dependencies:
260 | '@babel/runtime': 7.17.9
261 | '@jimp/custom': 0.14.0
262 | '@jimp/utils': 0.14.0
263 | dev: false
264 |
265 | /@jimp/plugin-normalize/0.14.0_@jimp+custom@0.14.0:
266 | resolution: {integrity: sha512-AfY8sqlsbbdVwFGcyIPy5JH/7fnBzlmuweb+Qtx2vn29okq6+HelLjw2b+VT2btgGUmWWHGEHd86oRGSoWGyEQ==}
267 | peerDependencies:
268 | '@jimp/custom': '>=0.3.5'
269 | dependencies:
270 | '@babel/runtime': 7.17.9
271 | '@jimp/custom': 0.14.0
272 | '@jimp/utils': 0.14.0
273 | dev: false
274 |
275 | /@jimp/plugin-print/0.14.0_59cf2c48948cca49b82b3ff5e6e0e538:
276 | resolution: {integrity: sha512-MwP3sH+VS5AhhSTXk7pui+tEJFsxnTKFY3TraFJb8WFbA2Vo2qsRCZseEGwpTLhENB7p/JSsLvWoSSbpmxhFAQ==}
277 | peerDependencies:
278 | '@jimp/custom': '>=0.3.5'
279 | '@jimp/plugin-blit': '>=0.3.5'
280 | dependencies:
281 | '@babel/runtime': 7.17.9
282 | '@jimp/custom': 0.14.0
283 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0
284 | '@jimp/utils': 0.14.0
285 | load-bmfont: 1.4.1
286 | dev: false
287 |
288 | /@jimp/plugin-resize/0.14.0_@jimp+custom@0.14.0:
289 | resolution: {integrity: sha512-qFeMOyXE/Bk6QXN0GQo89+CB2dQcXqoxUcDb2Ah8wdYlKqpi53skABkgVy5pW3EpiprDnzNDboMltdvDslNgLQ==}
290 | peerDependencies:
291 | '@jimp/custom': '>=0.3.5'
292 | dependencies:
293 | '@babel/runtime': 7.17.9
294 | '@jimp/custom': 0.14.0
295 | '@jimp/utils': 0.14.0
296 | dev: false
297 |
298 | /@jimp/plugin-rotate/0.14.0_6a26553348442491f47014d5048cf1c5:
299 | resolution: {integrity: sha512-aGaicts44bvpTcq5Dtf93/8TZFu5pMo/61lWWnYmwJJU1RqtQlxbCLEQpMyRhKDNSfPbuP8nyGmaqXlM/82J0Q==}
300 | peerDependencies:
301 | '@jimp/custom': '>=0.3.5'
302 | '@jimp/plugin-blit': '>=0.3.5'
303 | '@jimp/plugin-crop': '>=0.3.5'
304 | '@jimp/plugin-resize': '>=0.3.5'
305 | dependencies:
306 | '@babel/runtime': 7.17.9
307 | '@jimp/custom': 0.14.0
308 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0
309 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0
310 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
311 | '@jimp/utils': 0.14.0
312 | dev: false
313 |
314 | /@jimp/plugin-scale/0.14.0_1b5204e571b7e69f994f3f739149c190:
315 | resolution: {integrity: sha512-ZcJk0hxY5ZKZDDwflqQNHEGRblgaR+piePZm7dPwPUOSeYEH31P0AwZ1ziceR74zd8N80M0TMft+e3Td6KGBHw==}
316 | peerDependencies:
317 | '@jimp/custom': '>=0.3.5'
318 | '@jimp/plugin-resize': '>=0.3.5'
319 | dependencies:
320 | '@babel/runtime': 7.17.9
321 | '@jimp/custom': 0.14.0
322 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
323 | '@jimp/utils': 0.14.0
324 | dev: false
325 |
326 | /@jimp/plugin-shadow/0.14.0_49f3f5687a96d0ff4a4adf2a40083cb6:
327 | resolution: {integrity: sha512-p2igcEr/iGrLiTu0YePNHyby0WYAXM14c5cECZIVnq/UTOOIQ7xIcWZJ1lRbAEPxVVXPN1UibhZAbr3HAb5BjQ==}
328 | peerDependencies:
329 | '@jimp/custom': '>=0.3.5'
330 | '@jimp/plugin-blur': '>=0.3.5'
331 | '@jimp/plugin-resize': '>=0.3.5'
332 | dependencies:
333 | '@babel/runtime': 7.17.9
334 | '@jimp/custom': 0.14.0
335 | '@jimp/plugin-blur': 0.14.0_@jimp+custom@0.14.0
336 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
337 | '@jimp/utils': 0.14.0
338 | dev: false
339 |
340 | /@jimp/plugin-threshold/0.14.0_c55f475b14d9d0f52e32180be908a3e5:
341 | resolution: {integrity: sha512-N4BlDgm/FoOMV/DQM2rSpzsgqAzkP0DXkWZoqaQrlRxQBo4zizQLzhEL00T/YCCMKnddzgEhnByaocgaaa0fKw==}
342 | peerDependencies:
343 | '@jimp/custom': '>=0.3.5'
344 | '@jimp/plugin-color': '>=0.8.0'
345 | '@jimp/plugin-resize': '>=0.8.0'
346 | dependencies:
347 | '@babel/runtime': 7.17.9
348 | '@jimp/custom': 0.14.0
349 | '@jimp/plugin-color': 0.14.0_@jimp+custom@0.14.0
350 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
351 | '@jimp/utils': 0.14.0
352 | dev: false
353 |
354 | /@jimp/plugins/0.14.0_@jimp+custom@0.14.0:
355 | resolution: {integrity: sha512-vDO3XT/YQlFlFLq5TqNjQkISqjBHT8VMhpWhAfJVwuXIpilxz5Glu4IDLK6jp4IjPR6Yg2WO8TmRY/HI8vLrOw==}
356 | peerDependencies:
357 | '@jimp/custom': '>=0.3.5'
358 | dependencies:
359 | '@babel/runtime': 7.17.9
360 | '@jimp/custom': 0.14.0
361 | '@jimp/plugin-blit': 0.14.0_@jimp+custom@0.14.0
362 | '@jimp/plugin-blur': 0.14.0_@jimp+custom@0.14.0
363 | '@jimp/plugin-circle': 0.14.0_@jimp+custom@0.14.0
364 | '@jimp/plugin-color': 0.14.0_@jimp+custom@0.14.0
365 | '@jimp/plugin-contain': 0.14.0_04f2eb7c5fcee3779cc9de0411145f1d
366 | '@jimp/plugin-cover': 0.14.0_132cab346e98a8a22cf9ce3f0298c53c
367 | '@jimp/plugin-crop': 0.14.0_@jimp+custom@0.14.0
368 | '@jimp/plugin-displace': 0.14.0_@jimp+custom@0.14.0
369 | '@jimp/plugin-dither': 0.14.0_@jimp+custom@0.14.0
370 | '@jimp/plugin-fisheye': 0.14.0_@jimp+custom@0.14.0
371 | '@jimp/plugin-flip': 0.14.0_21b3d863db80a865c28da82979224ca7
372 | '@jimp/plugin-gaussian': 0.14.0_@jimp+custom@0.14.0
373 | '@jimp/plugin-invert': 0.14.0_@jimp+custom@0.14.0
374 | '@jimp/plugin-mask': 0.14.0_@jimp+custom@0.14.0
375 | '@jimp/plugin-normalize': 0.14.0_@jimp+custom@0.14.0
376 | '@jimp/plugin-print': 0.14.0_59cf2c48948cca49b82b3ff5e6e0e538
377 | '@jimp/plugin-resize': 0.14.0_@jimp+custom@0.14.0
378 | '@jimp/plugin-rotate': 0.14.0_6a26553348442491f47014d5048cf1c5
379 | '@jimp/plugin-scale': 0.14.0_1b5204e571b7e69f994f3f739149c190
380 | '@jimp/plugin-shadow': 0.14.0_49f3f5687a96d0ff4a4adf2a40083cb6
381 | '@jimp/plugin-threshold': 0.14.0_c55f475b14d9d0f52e32180be908a3e5
382 | timm: 1.7.1
383 | dev: false
384 |
385 | /@jimp/png/0.14.0_@jimp+custom@0.14.0:
386 | resolution: {integrity: sha512-0RV/mEIDOrPCcNfXSPmPBqqSZYwGADNRVUTyMt47RuZh7sugbYdv/uvKmQSiqRdR0L1sfbCBMWUEa5G/8MSbdA==}
387 | peerDependencies:
388 | '@jimp/custom': '>=0.3.5'
389 | dependencies:
390 | '@babel/runtime': 7.17.9
391 | '@jimp/custom': 0.14.0
392 | '@jimp/utils': 0.14.0
393 | pngjs: 3.4.0
394 | dev: false
395 |
396 | /@jimp/tiff/0.14.0_@jimp+custom@0.14.0:
397 | resolution: {integrity: sha512-zBYDTlutc7j88G/7FBCn3kmQwWr0rmm1e0FKB4C3uJ5oYfT8645lftUsvosKVUEfkdmOaMAnhrf4ekaHcb5gQw==}
398 | peerDependencies:
399 | '@jimp/custom': '>=0.3.5'
400 | dependencies:
401 | '@babel/runtime': 7.17.9
402 | '@jimp/custom': 0.14.0
403 | utif: 2.0.1
404 | dev: false
405 |
406 | /@jimp/types/0.14.0_@jimp+custom@0.14.0:
407 | resolution: {integrity: sha512-hx3cXAW1KZm+b+XCrY3LXtdWy2U+hNtq0rPyJ7NuXCjU7lZR3vIkpz1DLJ3yDdS70hTi5QDXY3Cd9kd6DtloHQ==}
408 | peerDependencies:
409 | '@jimp/custom': '>=0.3.5'
410 | dependencies:
411 | '@babel/runtime': 7.17.9
412 | '@jimp/bmp': 0.14.0_@jimp+custom@0.14.0
413 | '@jimp/custom': 0.14.0
414 | '@jimp/gif': 0.14.0_@jimp+custom@0.14.0
415 | '@jimp/jpeg': 0.14.0_@jimp+custom@0.14.0
416 | '@jimp/png': 0.14.0_@jimp+custom@0.14.0
417 | '@jimp/tiff': 0.14.0_@jimp+custom@0.14.0
418 | timm: 1.7.1
419 | dev: false
420 |
421 | /@jimp/utils/0.14.0:
422 | resolution: {integrity: sha512-MY5KFYUru0y74IsgM/9asDwb3ERxWxXEu3CRCZEvE7DtT86y1bR1XgtlSliMrptjz4qbivNGMQSvUBpEFJDp1A==}
423 | dependencies:
424 | '@babel/runtime': 7.17.9
425 | regenerator-runtime: 0.13.9
426 | dev: false
427 |
428 | /@nodelib/fs.scandir/2.1.5:
429 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
430 | engines: {node: '>= 8'}
431 | dependencies:
432 | '@nodelib/fs.stat': 2.0.5
433 | run-parallel: 1.2.0
434 | dev: true
435 |
436 | /@nodelib/fs.stat/2.0.5:
437 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
438 | engines: {node: '>= 8'}
439 | dev: true
440 |
441 | /@nodelib/fs.walk/1.2.8:
442 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
443 | engines: {node: '>= 8'}
444 | dependencies:
445 | '@nodelib/fs.scandir': 2.1.5
446 | fastq: 1.13.0
447 | dev: true
448 |
449 | /@types/node/14.18.12:
450 | resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==}
451 | dev: true
452 |
453 | /@types/node/16.9.1:
454 | resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==}
455 | dev: false
456 |
457 | /agent-base/6.0.2:
458 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
459 | engines: {node: '>= 6.0.0'}
460 | dependencies:
461 | debug: 4.3.4
462 | transitivePeerDependencies:
463 | - supports-color
464 | dev: true
465 |
466 | /ansi-regex/2.1.1:
467 | resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=}
468 | engines: {node: '>=0.10.0'}
469 | dev: true
470 |
471 | /ansi-regex/5.0.1:
472 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
473 | engines: {node: '>=8'}
474 | dev: true
475 |
476 | /ansi-styles/4.3.0:
477 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
478 | engines: {node: '>=8'}
479 | dependencies:
480 | color-convert: 2.0.1
481 | dev: true
482 |
483 | /any-base/1.1.0:
484 | resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==}
485 | dev: false
486 |
487 | /aproba/1.2.0:
488 | resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
489 | dev: true
490 |
491 | /are-we-there-yet/1.1.7:
492 | resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==}
493 | dependencies:
494 | delegates: 1.0.0
495 | readable-stream: 2.3.7
496 | dev: true
497 |
498 | /array-union/2.1.0:
499 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
500 | engines: {node: '>=8'}
501 | dev: true
502 |
503 | /at-least-node/1.0.0:
504 | resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
505 | engines: {node: '>= 4.0.0'}
506 | dev: true
507 |
508 | /balanced-match/1.0.2:
509 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
510 | dev: false
511 |
512 | /base64-js/1.5.1:
513 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
514 |
515 | /bl/4.1.0:
516 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
517 | dependencies:
518 | buffer: 5.7.1
519 | inherits: 2.0.4
520 | readable-stream: 3.6.0
521 | dev: true
522 |
523 | /bmp-js/0.1.0:
524 | resolution: {integrity: sha1-4Fpj95amwf8l9Hcex62twUjAcjM=}
525 | dev: false
526 |
527 | /brace-expansion/1.1.11:
528 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
529 | dependencies:
530 | balanced-match: 1.0.2
531 | concat-map: 0.0.1
532 | dev: false
533 |
534 | /braces/3.0.2:
535 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
536 | engines: {node: '>=8'}
537 | dependencies:
538 | fill-range: 7.0.1
539 | dev: true
540 |
541 | /buffer-equal/0.0.1:
542 | resolution: {integrity: sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=}
543 | engines: {node: '>=0.4.0'}
544 | dev: false
545 |
546 | /buffer/5.7.1:
547 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
548 | dependencies:
549 | base64-js: 1.5.1
550 | ieee754: 1.2.1
551 |
552 | /chalk/4.1.2:
553 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
554 | engines: {node: '>=10'}
555 | dependencies:
556 | ansi-styles: 4.3.0
557 | supports-color: 7.2.0
558 | dev: true
559 |
560 | /chownr/1.1.4:
561 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
562 | dev: true
563 |
564 | /cliui/7.0.4:
565 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
566 | dependencies:
567 | string-width: 4.2.3
568 | strip-ansi: 6.0.1
569 | wrap-ansi: 7.0.0
570 | dev: true
571 |
572 | /code-point-at/1.1.0:
573 | resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=}
574 | engines: {node: '>=0.10.0'}
575 | dev: true
576 |
577 | /color-convert/2.0.1:
578 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
579 | engines: {node: '>=7.0.0'}
580 | dependencies:
581 | color-name: 1.1.4
582 | dev: true
583 |
584 | /color-name/1.1.4:
585 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
586 | dev: true
587 |
588 | /commander/6.2.1:
589 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
590 | engines: {node: '>= 6'}
591 | dev: false
592 |
593 | /concat-map/0.0.1:
594 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
595 | dev: false
596 |
597 | /console-control-strings/1.1.0:
598 | resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=}
599 | dev: true
600 |
601 | /core-util-is/1.0.3:
602 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
603 | dev: true
604 |
605 | /cross-fetch/3.1.5:
606 | resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
607 | dependencies:
608 | node-fetch: 2.6.7
609 | transitivePeerDependencies:
610 | - encoding
611 | dev: false
612 |
613 | /debug/4.3.4:
614 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
615 | engines: {node: '>=6.0'}
616 | peerDependencies:
617 | supports-color: '*'
618 | peerDependenciesMeta:
619 | supports-color:
620 | optional: true
621 | dependencies:
622 | ms: 2.1.2
623 | dev: true
624 |
625 | /decompress-response/4.2.1:
626 | resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==}
627 | engines: {node: '>=8'}
628 | dependencies:
629 | mimic-response: 2.1.0
630 | dev: true
631 |
632 | /deep-extend/0.6.0:
633 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
634 | engines: {node: '>=4.0.0'}
635 | dev: true
636 |
637 | /deep-is/0.1.4:
638 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
639 | dev: true
640 |
641 | /delegates/1.0.0:
642 | resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=}
643 | dev: true
644 |
645 | /detect-libc/1.0.3:
646 | resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=}
647 | engines: {node: '>=0.10'}
648 | hasBin: true
649 | dev: true
650 |
651 | /dir-glob/3.0.1:
652 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
653 | engines: {node: '>=8'}
654 | dependencies:
655 | path-type: 4.0.0
656 | dev: true
657 |
658 | /dom-walk/0.1.2:
659 | resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
660 | dev: false
661 |
662 | /emoji-regex/8.0.0:
663 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
664 | dev: true
665 |
666 | /end-of-stream/1.4.4:
667 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
668 | dependencies:
669 | once: 1.4.0
670 | dev: true
671 |
672 | /escalade/3.1.1:
673 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
674 | engines: {node: '>=6'}
675 | dev: true
676 |
677 | /escodegen/2.0.0:
678 | resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
679 | engines: {node: '>=6.0'}
680 | hasBin: true
681 | dependencies:
682 | esprima: 4.0.1
683 | estraverse: 5.3.0
684 | esutils: 2.0.3
685 | optionator: 0.8.3
686 | optionalDependencies:
687 | source-map: 0.6.1
688 | dev: true
689 |
690 | /esprima/4.0.1:
691 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
692 | engines: {node: '>=4'}
693 | hasBin: true
694 | dev: true
695 |
696 | /estraverse/5.3.0:
697 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
698 | engines: {node: '>=4.0'}
699 | dev: true
700 |
701 | /esutils/2.0.3:
702 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
703 | engines: {node: '>=0.10.0'}
704 | dev: true
705 |
706 | /exif-parser/0.1.12:
707 | resolution: {integrity: sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=}
708 | dev: false
709 |
710 | /expand-template/2.0.3:
711 | resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
712 | engines: {node: '>=6'}
713 | dev: true
714 |
715 | /fast-glob/3.2.11:
716 | resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
717 | engines: {node: '>=8.6.0'}
718 | dependencies:
719 | '@nodelib/fs.stat': 2.0.5
720 | '@nodelib/fs.walk': 1.2.8
721 | glob-parent: 5.1.2
722 | merge2: 1.4.1
723 | micromatch: 4.0.5
724 | dev: true
725 |
726 | /fast-levenshtein/2.0.6:
727 | resolution: {integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=}
728 | dev: true
729 |
730 | /fastq/1.13.0:
731 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
732 | dependencies:
733 | reusify: 1.0.4
734 | dev: true
735 |
736 | /file-type/9.0.0:
737 | resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==}
738 | engines: {node: '>=6'}
739 | dev: false
740 |
741 | /fill-range/7.0.1:
742 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
743 | engines: {node: '>=8'}
744 | dependencies:
745 | to-regex-range: 5.0.1
746 | dev: true
747 |
748 | /from2/2.3.0:
749 | resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=}
750 | dependencies:
751 | inherits: 2.0.4
752 | readable-stream: 2.3.7
753 | dev: true
754 |
755 | /fs-constants/1.0.0:
756 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
757 | dev: true
758 |
759 | /fs-extra/9.1.0:
760 | resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
761 | engines: {node: '>=10'}
762 | dependencies:
763 | at-least-node: 1.0.0
764 | graceful-fs: 4.2.10
765 | jsonfile: 6.1.0
766 | universalify: 2.0.0
767 | dev: true
768 |
769 | /fs.realpath/1.0.0:
770 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
771 | dev: false
772 |
773 | /function-bind/1.1.1:
774 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
775 | dev: true
776 |
777 | /gauge/2.7.4:
778 | resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=}
779 | dependencies:
780 | aproba: 1.2.0
781 | console-control-strings: 1.1.0
782 | has-unicode: 2.0.1
783 | object-assign: 4.1.1
784 | signal-exit: 3.0.7
785 | string-width: 1.0.2
786 | strip-ansi: 3.0.1
787 | wide-align: 1.1.5
788 | dev: true
789 |
790 | /get-caller-file/2.0.5:
791 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
792 | engines: {node: 6.* || 8.* || >= 10.*}
793 | dev: true
794 |
795 | /gifwrap/0.9.4:
796 | resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==}
797 | dependencies:
798 | image-q: 4.0.0
799 | omggif: 1.0.10
800 | dev: false
801 |
802 | /github-from-package/0.0.0:
803 | resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=}
804 | dev: true
805 |
806 | /glob-parent/5.1.2:
807 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
808 | engines: {node: '>= 6'}
809 | dependencies:
810 | is-glob: 4.0.3
811 | dev: true
812 |
813 | /glob/7.2.0:
814 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
815 | dependencies:
816 | fs.realpath: 1.0.0
817 | inflight: 1.0.6
818 | inherits: 2.0.4
819 | minimatch: 3.1.2
820 | once: 1.4.0
821 | path-is-absolute: 1.0.1
822 | dev: false
823 |
824 | /global/4.4.0:
825 | resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
826 | dependencies:
827 | min-document: 2.19.0
828 | process: 0.11.10
829 | dev: false
830 |
831 | /globby/11.1.0:
832 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
833 | engines: {node: '>=10'}
834 | dependencies:
835 | array-union: 2.1.0
836 | dir-glob: 3.0.1
837 | fast-glob: 3.2.11
838 | ignore: 5.2.0
839 | merge2: 1.4.1
840 | slash: 3.0.0
841 | dev: true
842 |
843 | /graceful-fs/4.2.10:
844 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
845 | dev: true
846 |
847 | /has-flag/4.0.0:
848 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
849 | engines: {node: '>=8'}
850 | dev: true
851 |
852 | /has-unicode/2.0.1:
853 | resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=}
854 | dev: true
855 |
856 | /has/1.0.3:
857 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
858 | engines: {node: '>= 0.4.0'}
859 | dependencies:
860 | function-bind: 1.1.1
861 | dev: true
862 |
863 | /https-proxy-agent/5.0.0:
864 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==}
865 | engines: {node: '>= 6'}
866 | dependencies:
867 | agent-base: 6.0.2
868 | debug: 4.3.4
869 | transitivePeerDependencies:
870 | - supports-color
871 | dev: true
872 |
873 | /icns-lib/1.0.1:
874 | resolution: {integrity: sha512-J7+RDRQApG/vChY5TP043NitBcNC7QMn1kOgGvlAkyrK65hozAaSwTNsTZ2HJh+br9e1NlzpBreAOpk4YuhOJA==}
875 | engines: {node: '>=8'}
876 | dev: false
877 |
878 | /ieee754/1.2.1:
879 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
880 |
881 | /ignore/5.2.0:
882 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
883 | engines: {node: '>= 4'}
884 | dev: true
885 |
886 | /image-q/4.0.0:
887 | resolution: {integrity: sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==}
888 | dependencies:
889 | '@types/node': 16.9.1
890 | dev: false
891 |
892 | /inflight/1.0.6:
893 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=}
894 | dependencies:
895 | once: 1.4.0
896 | wrappy: 1.0.2
897 | dev: false
898 |
899 | /inherits/2.0.4:
900 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
901 |
902 | /ini/1.3.8:
903 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
904 | dev: true
905 |
906 | /into-stream/6.0.0:
907 | resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==}
908 | engines: {node: '>=10'}
909 | dependencies:
910 | from2: 2.3.0
911 | p-is-promise: 3.0.0
912 | dev: true
913 |
914 | /is-core-module/2.8.1:
915 | resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==}
916 | dependencies:
917 | has: 1.0.3
918 | dev: true
919 |
920 | /is-extglob/2.1.1:
921 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
922 | engines: {node: '>=0.10.0'}
923 | dev: true
924 |
925 | /is-fullwidth-code-point/1.0.0:
926 | resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=}
927 | engines: {node: '>=0.10.0'}
928 | dependencies:
929 | number-is-nan: 1.0.1
930 | dev: true
931 |
932 | /is-fullwidth-code-point/3.0.0:
933 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
934 | engines: {node: '>=8'}
935 | dev: true
936 |
937 | /is-function/1.0.2:
938 | resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==}
939 | dev: false
940 |
941 | /is-glob/4.0.3:
942 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
943 | engines: {node: '>=0.10.0'}
944 | dependencies:
945 | is-extglob: 2.1.1
946 | dev: true
947 |
948 | /is-number/7.0.0:
949 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
950 | engines: {node: '>=0.12.0'}
951 | dev: true
952 |
953 | /isarray/1.0.0:
954 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=}
955 | dev: true
956 |
957 | /jimp/0.14.0:
958 | resolution: {integrity: sha512-8BXU+J8+SPmwwyq9ELihpSV4dWPTiOKBWCEgtkbnxxAVMjXdf3yGmyaLSshBfXc8sP/JQ9OZj5R8nZzz2wPXgA==}
959 | dependencies:
960 | '@babel/runtime': 7.17.9
961 | '@jimp/custom': 0.14.0
962 | '@jimp/plugins': 0.14.0_@jimp+custom@0.14.0
963 | '@jimp/types': 0.14.0_@jimp+custom@0.14.0
964 | regenerator-runtime: 0.13.9
965 | dev: false
966 |
967 | /jpeg-js/0.4.3:
968 | resolution: {integrity: sha512-ru1HWKek8octvUHFHvE5ZzQ1yAsJmIvRdGWvSoKV52XKyuyYA437QWDttXT8eZXDSbuMpHlLzPDZUPd6idIz+Q==}
969 | dev: false
970 |
971 | /jsonfile/6.1.0:
972 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
973 | dependencies:
974 | universalify: 2.0.0
975 | optionalDependencies:
976 | graceful-fs: 4.2.10
977 | dev: true
978 |
979 | /levn/0.3.0:
980 | resolution: {integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=}
981 | engines: {node: '>= 0.8.0'}
982 | dependencies:
983 | prelude-ls: 1.1.2
984 | type-check: 0.3.2
985 | dev: true
986 |
987 | /load-bmfont/1.4.1:
988 | resolution: {integrity: sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==}
989 | dependencies:
990 | buffer-equal: 0.0.1
991 | mime: 1.6.0
992 | parse-bmfont-ascii: 1.0.6
993 | parse-bmfont-binary: 1.0.6
994 | parse-bmfont-xml: 1.1.4
995 | phin: 2.9.3
996 | xhr: 2.6.0
997 | xtend: 4.0.2
998 | dev: false
999 |
1000 | /lru-cache/7.7.3:
1001 | resolution: {integrity: sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==}
1002 | engines: {node: '>=12'}
1003 | dev: true
1004 |
1005 | /merge2/1.4.1:
1006 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1007 | engines: {node: '>= 8'}
1008 | dev: true
1009 |
1010 | /micromatch/4.0.5:
1011 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
1012 | engines: {node: '>=8.6'}
1013 | dependencies:
1014 | braces: 3.0.2
1015 | picomatch: 2.3.1
1016 | dev: true
1017 |
1018 | /mime/1.6.0:
1019 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
1020 | engines: {node: '>=4'}
1021 | hasBin: true
1022 | dev: false
1023 |
1024 | /mimic-response/2.1.0:
1025 | resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==}
1026 | engines: {node: '>=8'}
1027 | dev: true
1028 |
1029 | /min-document/2.19.0:
1030 | resolution: {integrity: sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=}
1031 | dependencies:
1032 | dom-walk: 0.1.2
1033 | dev: false
1034 |
1035 | /minimatch/3.1.2:
1036 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1037 | dependencies:
1038 | brace-expansion: 1.1.11
1039 | dev: false
1040 |
1041 | /minimist/1.2.6:
1042 | resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
1043 |
1044 | /mkdirp-classic/0.5.3:
1045 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
1046 | dev: true
1047 |
1048 | /mkdirp/0.5.6:
1049 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
1050 | hasBin: true
1051 | dependencies:
1052 | minimist: 1.2.6
1053 | dev: false
1054 |
1055 | /ms/2.1.2:
1056 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
1057 | dev: true
1058 |
1059 | /multistream/4.1.0:
1060 | resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==}
1061 | dependencies:
1062 | once: 1.4.0
1063 | readable-stream: 3.6.0
1064 | dev: true
1065 |
1066 | /napi-build-utils/1.0.2:
1067 | resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
1068 | dev: true
1069 |
1070 | /node-abi/2.30.1:
1071 | resolution: {integrity: sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==}
1072 | dependencies:
1073 | semver: 5.7.1
1074 | dev: true
1075 |
1076 | /node-fetch/2.6.7:
1077 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
1078 | engines: {node: 4.x || >=6.0.0}
1079 | peerDependencies:
1080 | encoding: ^0.1.0
1081 | peerDependenciesMeta:
1082 | encoding:
1083 | optional: true
1084 | dependencies:
1085 | whatwg-url: 5.0.0
1086 |
1087 | /npmlog/4.1.2:
1088 | resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==}
1089 | dependencies:
1090 | are-we-there-yet: 1.1.7
1091 | console-control-strings: 1.1.0
1092 | gauge: 2.7.4
1093 | set-blocking: 2.0.0
1094 | dev: true
1095 |
1096 | /number-is-nan/1.0.1:
1097 | resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=}
1098 | engines: {node: '>=0.10.0'}
1099 | dev: true
1100 |
1101 | /object-assign/4.1.1:
1102 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
1103 | engines: {node: '>=0.10.0'}
1104 | dev: true
1105 |
1106 | /omggif/1.0.10:
1107 | resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==}
1108 | dev: false
1109 |
1110 | /once/1.4.0:
1111 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
1112 | dependencies:
1113 | wrappy: 1.0.2
1114 |
1115 | /optionator/0.8.3:
1116 | resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
1117 | engines: {node: '>= 0.8.0'}
1118 | dependencies:
1119 | deep-is: 0.1.4
1120 | fast-levenshtein: 2.0.6
1121 | levn: 0.3.0
1122 | prelude-ls: 1.1.2
1123 | type-check: 0.3.2
1124 | word-wrap: 1.2.3
1125 | dev: true
1126 |
1127 | /p-is-promise/3.0.0:
1128 | resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==}
1129 | engines: {node: '>=8'}
1130 | dev: true
1131 |
1132 | /pako/1.0.11:
1133 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
1134 | dev: false
1135 |
1136 | /parse-bmfont-ascii/1.0.6:
1137 | resolution: {integrity: sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=}
1138 | dev: false
1139 |
1140 | /parse-bmfont-binary/1.0.6:
1141 | resolution: {integrity: sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=}
1142 | dev: false
1143 |
1144 | /parse-bmfont-xml/1.1.4:
1145 | resolution: {integrity: sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==}
1146 | dependencies:
1147 | xml-parse-from-string: 1.0.1
1148 | xml2js: 0.4.23
1149 | dev: false
1150 |
1151 | /parse-headers/2.0.5:
1152 | resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==}
1153 | dev: false
1154 |
1155 | /path-is-absolute/1.0.1:
1156 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
1157 | engines: {node: '>=0.10.0'}
1158 | dev: false
1159 |
1160 | /path-parse/1.0.7:
1161 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1162 | dev: true
1163 |
1164 | /path-type/4.0.0:
1165 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1166 | engines: {node: '>=8'}
1167 | dev: true
1168 |
1169 | /phin/2.9.3:
1170 | resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==}
1171 | dev: false
1172 |
1173 | /picomatch/2.3.1:
1174 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1175 | engines: {node: '>=8.6'}
1176 | dev: true
1177 |
1178 | /pixelmatch/4.0.2:
1179 | resolution: {integrity: sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=}
1180 | hasBin: true
1181 | dependencies:
1182 | pngjs: 3.4.0
1183 | dev: false
1184 |
1185 | /pkg-fetch/3.3.0:
1186 | resolution: {integrity: sha512-xJnIZ1KP+8rNN+VLafwu4tEeV4m8IkFBDdCFqmAJz9K1aiXEtbARmdbEe6HlXWGSVuShSHjFXpfkKRkDBQ5kiA==}
1187 | hasBin: true
1188 | dependencies:
1189 | chalk: 4.1.2
1190 | fs-extra: 9.1.0
1191 | https-proxy-agent: 5.0.0
1192 | node-fetch: 2.6.7
1193 | progress: 2.0.3
1194 | semver: 7.3.6
1195 | tar-fs: 2.1.1
1196 | yargs: 16.2.0
1197 | transitivePeerDependencies:
1198 | - encoding
1199 | - supports-color
1200 | dev: true
1201 |
1202 | /pkg/5.6.0:
1203 | resolution: {integrity: sha512-mHrAVSQWmHA41RnUmRpC7pK9lNnMfdA16CF3cqOI22a8LZxOQzF7M8YWtA2nfs+d7I0MTDXOtkDsAsFXeCpYjg==}
1204 | hasBin: true
1205 | peerDependencies:
1206 | node-notifier: '>=9.0.1'
1207 | peerDependenciesMeta:
1208 | node-notifier:
1209 | optional: true
1210 | dependencies:
1211 | '@babel/parser': 7.16.2
1212 | '@babel/types': 7.16.0
1213 | chalk: 4.1.2
1214 | escodegen: 2.0.0
1215 | fs-extra: 9.1.0
1216 | globby: 11.1.0
1217 | into-stream: 6.0.0
1218 | minimist: 1.2.6
1219 | multistream: 4.1.0
1220 | pkg-fetch: 3.3.0
1221 | prebuild-install: 6.1.4
1222 | progress: 2.0.3
1223 | resolve: 1.22.0
1224 | stream-meter: 1.0.4
1225 | tslib: 2.3.1
1226 | transitivePeerDependencies:
1227 | - encoding
1228 | - supports-color
1229 | dev: true
1230 |
1231 | /plist/3.0.5:
1232 | resolution: {integrity: sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==}
1233 | engines: {node: '>=6'}
1234 | dependencies:
1235 | base64-js: 1.5.1
1236 | xmlbuilder: 9.0.7
1237 | dev: false
1238 |
1239 | /pngjs/3.4.0:
1240 | resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==}
1241 | engines: {node: '>=4.0.0'}
1242 | dev: false
1243 |
1244 | /prebuild-install/6.1.4:
1245 | resolution: {integrity: sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==}
1246 | engines: {node: '>=6'}
1247 | hasBin: true
1248 | dependencies:
1249 | detect-libc: 1.0.3
1250 | expand-template: 2.0.3
1251 | github-from-package: 0.0.0
1252 | minimist: 1.2.6
1253 | mkdirp-classic: 0.5.3
1254 | napi-build-utils: 1.0.2
1255 | node-abi: 2.30.1
1256 | npmlog: 4.1.2
1257 | pump: 3.0.0
1258 | rc: 1.2.8
1259 | simple-get: 3.1.1
1260 | tar-fs: 2.1.1
1261 | tunnel-agent: 0.6.0
1262 | dev: true
1263 |
1264 | /prelude-ls/1.1.2:
1265 | resolution: {integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=}
1266 | engines: {node: '>= 0.8.0'}
1267 | dev: true
1268 |
1269 | /process-nextick-args/2.0.1:
1270 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
1271 | dev: true
1272 |
1273 | /process/0.11.10:
1274 | resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=}
1275 | engines: {node: '>= 0.6.0'}
1276 | dev: false
1277 |
1278 | /progress/2.0.3:
1279 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
1280 | engines: {node: '>=0.4.0'}
1281 | dev: true
1282 |
1283 | /pump/3.0.0:
1284 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
1285 | dependencies:
1286 | end-of-stream: 1.4.4
1287 | once: 1.4.0
1288 | dev: true
1289 |
1290 | /queue-microtask/1.2.3:
1291 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1292 | dev: true
1293 |
1294 | /rc/1.2.8:
1295 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
1296 | hasBin: true
1297 | dependencies:
1298 | deep-extend: 0.6.0
1299 | ini: 1.3.8
1300 | minimist: 1.2.6
1301 | strip-json-comments: 2.0.1
1302 | dev: true
1303 |
1304 | /readable-stream/2.3.7:
1305 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
1306 | dependencies:
1307 | core-util-is: 1.0.3
1308 | inherits: 2.0.4
1309 | isarray: 1.0.0
1310 | process-nextick-args: 2.0.1
1311 | safe-buffer: 5.1.2
1312 | string_decoder: 1.1.1
1313 | util-deprecate: 1.0.2
1314 | dev: true
1315 |
1316 | /readable-stream/3.6.0:
1317 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
1318 | engines: {node: '>= 6'}
1319 | dependencies:
1320 | inherits: 2.0.4
1321 | string_decoder: 1.3.0
1322 | util-deprecate: 1.0.2
1323 | dev: true
1324 |
1325 | /regenerator-runtime/0.13.9:
1326 | resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
1327 | dev: false
1328 |
1329 | /require-directory/2.1.1:
1330 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=}
1331 | engines: {node: '>=0.10.0'}
1332 | dev: true
1333 |
1334 | /resolve/1.22.0:
1335 | resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==}
1336 | hasBin: true
1337 | dependencies:
1338 | is-core-module: 2.8.1
1339 | path-parse: 1.0.7
1340 | supports-preserve-symlinks-flag: 1.0.0
1341 | dev: true
1342 |
1343 | /reusify/1.0.4:
1344 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1345 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1346 | dev: true
1347 |
1348 | /run-parallel/1.2.0:
1349 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1350 | dependencies:
1351 | queue-microtask: 1.2.3
1352 | dev: true
1353 |
1354 | /safe-buffer/5.1.2:
1355 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
1356 | dev: true
1357 |
1358 | /safe-buffer/5.2.1:
1359 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
1360 | dev: true
1361 |
1362 | /sax/1.2.4:
1363 | resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
1364 | dev: false
1365 |
1366 | /semver/5.7.1:
1367 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
1368 | hasBin: true
1369 | dev: true
1370 |
1371 | /semver/7.3.6:
1372 | resolution: {integrity: sha512-HZWqcgwLsjaX1HBD31msI/rXktuIhS+lWvdE4kN9z+8IVT4Itc7vqU2WvYsyD6/sjYCt4dEKH/m1M3dwI9CC5w==}
1373 | engines: {node: ^10.0.0 || ^12.0.0 || ^14.0.0 || >=16.0.0}
1374 | hasBin: true
1375 | dependencies:
1376 | lru-cache: 7.7.3
1377 | dev: true
1378 |
1379 | /set-blocking/2.0.0:
1380 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
1381 | dev: true
1382 |
1383 | /signal-exit/3.0.7:
1384 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
1385 | dev: true
1386 |
1387 | /simple-concat/1.0.1:
1388 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
1389 | dev: true
1390 |
1391 | /simple-get/3.1.1:
1392 | resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==}
1393 | dependencies:
1394 | decompress-response: 4.2.1
1395 | once: 1.4.0
1396 | simple-concat: 1.0.1
1397 | dev: true
1398 |
1399 | /slash/3.0.0:
1400 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1401 | engines: {node: '>=8'}
1402 | dev: true
1403 |
1404 | /source-map/0.6.1:
1405 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
1406 | engines: {node: '>=0.10.0'}
1407 | requiresBuild: true
1408 | dev: true
1409 | optional: true
1410 |
1411 | /stream-meter/1.0.4:
1412 | resolution: {integrity: sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=}
1413 | dependencies:
1414 | readable-stream: 2.3.7
1415 | dev: true
1416 |
1417 | /string-width/1.0.2:
1418 | resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=}
1419 | engines: {node: '>=0.10.0'}
1420 | dependencies:
1421 | code-point-at: 1.1.0
1422 | is-fullwidth-code-point: 1.0.0
1423 | strip-ansi: 3.0.1
1424 | dev: true
1425 |
1426 | /string-width/4.2.3:
1427 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
1428 | engines: {node: '>=8'}
1429 | dependencies:
1430 | emoji-regex: 8.0.0
1431 | is-fullwidth-code-point: 3.0.0
1432 | strip-ansi: 6.0.1
1433 | dev: true
1434 |
1435 | /string_decoder/1.1.1:
1436 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
1437 | dependencies:
1438 | safe-buffer: 5.1.2
1439 | dev: true
1440 |
1441 | /string_decoder/1.3.0:
1442 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
1443 | dependencies:
1444 | safe-buffer: 5.2.1
1445 | dev: true
1446 |
1447 | /strip-ansi/3.0.1:
1448 | resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=}
1449 | engines: {node: '>=0.10.0'}
1450 | dependencies:
1451 | ansi-regex: 2.1.1
1452 | dev: true
1453 |
1454 | /strip-ansi/6.0.1:
1455 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1456 | engines: {node: '>=8'}
1457 | dependencies:
1458 | ansi-regex: 5.0.1
1459 | dev: true
1460 |
1461 | /strip-json-comments/2.0.1:
1462 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=}
1463 | engines: {node: '>=0.10.0'}
1464 | dev: true
1465 |
1466 | /supports-color/7.2.0:
1467 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1468 | engines: {node: '>=8'}
1469 | dependencies:
1470 | has-flag: 4.0.0
1471 | dev: true
1472 |
1473 | /supports-preserve-symlinks-flag/1.0.0:
1474 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1475 | engines: {node: '>= 0.4'}
1476 | dev: true
1477 |
1478 | /tar-fs/2.1.1:
1479 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
1480 | dependencies:
1481 | chownr: 1.1.4
1482 | mkdirp-classic: 0.5.3
1483 | pump: 3.0.0
1484 | tar-stream: 2.2.0
1485 | dev: true
1486 |
1487 | /tar-stream/2.2.0:
1488 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
1489 | engines: {node: '>=6'}
1490 | dependencies:
1491 | bl: 4.1.0
1492 | end-of-stream: 1.4.4
1493 | fs-constants: 1.0.0
1494 | inherits: 2.0.4
1495 | readable-stream: 3.6.0
1496 | dev: true
1497 |
1498 | /timm/1.7.1:
1499 | resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==}
1500 | dev: false
1501 |
1502 | /tinycolor2/1.4.2:
1503 | resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==}
1504 | dev: false
1505 |
1506 | /to-fast-properties/2.0.0:
1507 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=}
1508 | engines: {node: '>=4'}
1509 | dev: true
1510 |
1511 | /to-regex-range/5.0.1:
1512 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1513 | engines: {node: '>=8.0'}
1514 | dependencies:
1515 | is-number: 7.0.0
1516 | dev: true
1517 |
1518 | /tr46/0.0.3:
1519 | resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=}
1520 |
1521 | /tslib/2.3.1:
1522 | resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==}
1523 | dev: true
1524 |
1525 | /tunnel-agent/0.6.0:
1526 | resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=}
1527 | dependencies:
1528 | safe-buffer: 5.2.1
1529 | dev: true
1530 |
1531 | /type-check/0.3.2:
1532 | resolution: {integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=}
1533 | engines: {node: '>= 0.8.0'}
1534 | dependencies:
1535 | prelude-ls: 1.1.2
1536 | dev: true
1537 |
1538 | /universalify/2.0.0:
1539 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
1540 | engines: {node: '>= 10.0.0'}
1541 | dev: true
1542 |
1543 | /utif/2.0.1:
1544 | resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==}
1545 | dependencies:
1546 | pako: 1.0.11
1547 | dev: false
1548 |
1549 | /util-deprecate/1.0.2:
1550 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=}
1551 | dev: true
1552 |
1553 | /webidl-conversions/3.0.1:
1554 | resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=}
1555 |
1556 | /whatwg-url/5.0.0:
1557 | resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=}
1558 | dependencies:
1559 | tr46: 0.0.3
1560 | webidl-conversions: 3.0.1
1561 |
1562 | /wide-align/1.1.5:
1563 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
1564 | dependencies:
1565 | string-width: 4.2.3
1566 | dev: true
1567 |
1568 | /word-wrap/1.2.3:
1569 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
1570 | engines: {node: '>=0.10.0'}
1571 | dev: true
1572 |
1573 | /wrap-ansi/7.0.0:
1574 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
1575 | engines: {node: '>=10'}
1576 | dependencies:
1577 | ansi-styles: 4.3.0
1578 | string-width: 4.2.3
1579 | strip-ansi: 6.0.1
1580 | dev: true
1581 |
1582 | /wrappy/1.0.2:
1583 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
1584 |
1585 | /xhr/2.6.0:
1586 | resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==}
1587 | dependencies:
1588 | global: 4.4.0
1589 | is-function: 1.0.2
1590 | parse-headers: 2.0.5
1591 | xtend: 4.0.2
1592 | dev: false
1593 |
1594 | /xml-parse-from-string/1.0.1:
1595 | resolution: {integrity: sha1-qQKekp09vN7RafPG4oI42VpdWig=}
1596 | dev: false
1597 |
1598 | /xml2js/0.4.23:
1599 | resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==}
1600 | engines: {node: '>=4.0.0'}
1601 | dependencies:
1602 | sax: 1.2.4
1603 | xmlbuilder: 11.0.1
1604 | dev: false
1605 |
1606 | /xmlbuilder/11.0.1:
1607 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
1608 | engines: {node: '>=4.0'}
1609 | dev: false
1610 |
1611 | /xmlbuilder/9.0.7:
1612 | resolution: {integrity: sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=}
1613 | engines: {node: '>=4.0'}
1614 | dev: false
1615 |
1616 | /xtend/4.0.2:
1617 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1618 | engines: {node: '>=0.4'}
1619 | dev: false
1620 |
1621 | /y18n/5.0.8:
1622 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
1623 | engines: {node: '>=10'}
1624 | dev: true
1625 |
1626 | /yargs-parser/20.2.9:
1627 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
1628 | engines: {node: '>=10'}
1629 | dev: true
1630 |
1631 | /yargs/16.2.0:
1632 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
1633 | engines: {node: '>=10'}
1634 | dependencies:
1635 | cliui: 7.0.4
1636 | escalade: 3.1.1
1637 | get-caller-file: 2.0.5
1638 | require-directory: 2.1.1
1639 | string-width: 4.2.3
1640 | y18n: 5.0.8
1641 | yargs-parser: 20.2.9
1642 | dev: true
1643 |
--------------------------------------------------------------------------------